【问题标题】:Java constructor basics: objects and fields with no current valueJava 构造函数基础:没有当前值的对象和字段
【发布时间】:2013-04-12 08:02:47
【问题描述】:

我有几个关于 Java 构造函数的问题:

  1. 你应该如何初始化/创建类所依赖的对象?例如,我的“时间”类中有一个 DateTime 对象。我应该将private DateTime _date; 字段作为类的一部分,然后将_date = new DateTime(); 粘贴在构造函数中吗?还是用相关方法初始化这个对象更好?

  2. 如果在创建类的新对象时应该未初始化字段(即,稍后在对象上调用类的方法时设置它们的值),您会怎么做?在构造函数中,我是将它们初始化为 null 还是一些无意义的值?

感谢您的帮助。

【问题讨论】:

  • 最好在需要时进行初始化。

标签: java object constructor field


【解决方案1】:

从根本上说,这两个问题的答案都是:这取决于你。

  1. 如果您执行private DateTime _date = new DateTime();,这将作为实例构造的一部分发生,就好像它在构造函数中一样(它将在构造函数中的分步代码运行之前立即发生)。我在 JLS 中找不到直截了当的说法(这并不意味着它不存在),但它会是 somewhere in Section 8 和/或 Section 15。因此,无论是在声明中还是在构造函数中,都是您的调用。它的优点是,如果你有多个构造函数,不管调用哪一个,它都会发生;它的缺点是在多个地方都有施工代码。

  2. 它们被隐式初始化为null0false 等(它们的“default value”),具体取决于它们的类型,作为 Java 语言定义的一部分.因此,您可以显式将它们初始化为 null 等,如果您想要清晰、强调、可读性等等,但这不是必需的。

【讨论】:

  • 好的,谢谢!不知何故,我以前从未见过这些事情中的任何一个,所以很高兴能澄清它。
【解决方案2】:

在回答第二个问题时,您可以在构造函数中将对象字段显式设置为 null。但是,这不是必需的,因为如果您不构造或创建对象,它将自动设置为null。例如,

 Public class MyClass {
     private User user;

     public MyClass(){
         this.user; 
     }
 }

上面的构造方法同:

public MyClass(){
    this.user = null;
}

【讨论】:

    【解决方案3】:

    构造函数的主要职责是确保实例的设置遵循类不变量(除非它抛出异常)。如果要求字段为非空,则不变量可能会更简单。一般来说,您希望避免使用null。 NPE确实很常见,但不应该如此。

    (我也强烈建议坚持标准的 Java 约定。)

    【讨论】:

      【解决方案4】:
      1. 说实话:我每次都以不同的方式处理它。有时我在声明时设置变量(如 T.J. Crowder),有时在构造函数中,很少有 initDefaults() 由构造函数调用的方法,pl
      2. 我建议永远不要将字段初始化为无意义的值。阅读该字段时,您无法确定它是无意义的还是故意的。您应该为整个系统定义 null 值的含义或(如果无法避免)特殊的“默认”值,以及方法如何返回值,例如Robert Martin 建议返回一个空数组而不是 null 来返回一个空列表(这样可以避免 NPE)。

      祝你好运:-)

      【讨论】:

      • 谢谢,很高兴知道这一点 - 特别是关于避免无意义的值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2017-07-28
      • 1970-01-01
      相关资源
      最近更新 更多