我对Java中的构造函数有几个问题:
你应该如何初始化/创建该类所依赖的对象?例如,我的'time'类中有一个DateTime对象。我应该将private DateTime _date;
字段作为课程的一部分,然后在构造函数中粘贴_date = new DateTime();
吗?或者用相关方法初始化这个对象是否更好?
如果字段在创建其类的新对象时应该未初始化(即,稍后在对象上调用类的方法时设置它们的值),您会怎么做?在构造函数中,我是将它们初始化为null还是一些无意义的值?
感谢您的帮助。
答案 0 :(得分:2)
从根本上说,这两个问题的答案是:这取决于你。
如果你执行private DateTime _date = new DateTime();
,那将作为实例构造的一部分发生,就像它在构造函数中一样(它将在构造函数中的逐步代码运行之前发生)。我无法在JLS中找到那个秃头(这并不意味着它不在那里),但它将是somewhere in Section 8和/或Section 15。因此,无论是在声明中还是在构造函数中,您的电话都是如此。它的优点是,如果你有多个构造函数,无论调用哪个构造函数都会发生;它的缺点是在多个地方都有施工代码。
它们被隐式初始化为null
,0
,false
等(“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)
initDefaults()
方法,pl
null
值的含义或(如果您无法避免)一个特殊的默认值#39;值,以及方法如何返回值,例如 Robert Martin 建议为空列表返回一个空数组而不是null
(这样就可以避免使用NPE)。祝你好运: - )