0

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

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

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

谢谢你的帮助。

4

4 回答 4

2

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

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

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

于 2013-04-12T08:05:28.637 回答
1

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

 Public class MyClass {
     private User user;

     public MyClass(){
         this.user; 
     }
 }

上面的构造函数是一样的:

public MyClass(){
    this.user = null;
}
于 2013-04-12T08:12:11.047 回答
1

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

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

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

祝你好运 :-)

于 2013-04-12T08:21:54.897 回答