Java构造函数基础:没有当前值的对象和字段

时间:2013-04-12 08:02:48

标签: java object constructor field

我对Java中的构造函数有几个问题:

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

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

  3. 感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

 Public class MyClass {
     private User user;

     public MyClass(){
         this.user; 
     }
 }

上面的构造函数与:

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

答案 2 :(得分:1)

构造函数的主要职责是确保实例遵循类不变量(除非它抛出异常)。如果字段必须是非空的,那么不变量可能会更简单。通常,您希望避免使用null。 NPE 非常常见,不应该是。

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

答案 3 :(得分:1)

  1. 说实话:我总是以不同的方式处理它。有时我在声明上设置变量(如T.J.Crowder),有时在构造函数中,很少有构造函数调用的initDefaults()方法,pl
  2. 我建议永远不要将字段初始化为无意义的值。在阅读该字段时,您无法确定该字段是无意义的还是故意的。您应该为整个系统定义null值的含义或(如果您无法避免)一个特殊的默认值#39;值,以及方法如何返回值,例如 Robert Martin 建议为空列表返回一个空数组而不是null(这样就可以避免使用NPE)。
  3. 祝你好运: - )