在构造函数中实例化对象

Oha*_*had 6 java

似乎以下代码的结果是相同的,所以我应该何时使用它们?

public class Person {
   public Person() {
       this.family = new Family();
   }
   Family family;
}
Run Code Online (Sandbox Code Playgroud)

public class Person {
   Family family = new Family();
}
Run Code Online (Sandbox Code Playgroud)

(我可以想到的一个场景是,当有多个构造函数并且我们只想在其中一个内部创建一个族的实例时......这是唯一的情况吗?)

ami*_*mit 6

对于类变量 [静态变量],您不能使用第一个,因为您希望初始化只发生一次,而不是每次调用构造函数时.

例如变量,第二个只是第一个的合成糖.
有时您可能必须使用第二个 - for参数构造函数,它们本身 - 传递给您的构造函数.


Kev*_*ker 5

后者将确保每个人都将永远有一个家庭(www,不是很好)。但是在前者中,其他构造函数可以由另一位开发人员添加,而这使得Family尚未初始化。这倾向于表明后者,较短的版本是更可取的。但这并不是真的,因为将Person建模为没有家庭可能是一个有效条件,在这种情况下,通过构造函数进行初始化会更好,因为可以传递null。

第三种选择是提供了设置器的(更长,叹息)基本的POJO样式,在该样式中,直到明确调用了设置器后才初始化Family。使用此功能更好的一点是,如果您要对“孤儿”进行建模,则不必为构造函数提供null值。

这完全取决于您要如何约束Person的构造。