【问题标题】:Initialize fileds in DTO初始化 DTO 中的字段
【发布时间】:2017-09-15 19:11:06
【问题描述】:

我的一个朋友建议我初始化类型为 (ArrayList) 的 DTO 字段 并且只有这样的 DTO 中的 ArrayList 类型以避免 NullPointerException

public class fooDto {
    private SomeClasse someClasse = new SomeClasse();
    private ArrayList<Bar> bars = new ArrayList();
}

我们应该做他的吗?这是一个好习惯吗

另外,我们是否应该使用“= new SomeClasse()”?

【问题讨论】:

  • 不,因为您将原始类型分配给通用列表。
  • 或者您是在询问是否应该使用空值初始化字段还是保持未初始化(null)?
  • 把字段设为final你就不会有这些问题了。
  • 不确定好的做法,但我们一直这样做是为了让 List 对象避免 NPE,就像你朋友建议的那样。

标签: java dto


【解决方案1】:

使用 List,肯定是的(不幸的是,尝试将项目放入空列表是很常见的)。但是关于 someClasse,这取决于。如果您想不惜一切代价避免烦人的空检查,那也许没问题。但是,如果 someClasse 是一个可选字段,那么为什么要初始化它呢?另一方面,如果它不应该为空,那么最好让这个异常被抛出。毕竟很容易找到它的原因,否则你会被堆栈分析它实际上是由某些东西设置为空值还是因为某些错误而为空?

总而言之,在我看来,不初始化它可以获得更多收益。您总是可以使用一些preconditions 来轻松检查空值并抛出更文明的异常。

【讨论】:

    【解决方案2】:

    我认为对于Collection,初始化它是有意义的。当涉及到您的 SomeClass 示例等其他属性时,这可能会因情况而异。

    可以使用 Null Object 设计模式,该模式应避免意外获得真正的 null 值。

    【讨论】:

    • 使用 Optional 作为字段不是一个好习惯。示例来源:stackoverflow.com/questions/31922866/…
    • @pokemzok 对数据结构有意义,在服务/存储库中更有意义。从我的评论中删除它。
    【解决方案3】:

    取决于您如何使用这些 DTO。

    当您必须手动将数据从域对象复制到 DTO 时,这样做是有意义的。

    否则,如果您为此使用库,例如​​ ModelMapperbeanutils 或类似的东西,我觉得它看起来有点多余,因为这些工具可以处理空值和所有这类东西。

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多