class 主体中实例变量的默认值

default value for instance variable in the class body

当我们在class的body中写Instance变量,并且构造函数初始化它们时,为什么我们可以直接在构造函数之外初始化变量而不去构造函数呢?这不是建设者的职责吗?

class Sample{
LinkedList<String> string=new LinkedList<>();//Initializing in the body of the class
String value="Hi";//Initializing in the body of the class

   public Sample(){
   //shouldnt string and value initialize here?}
}

字段初始化发生在构造函数主体执行之前。它在某些情况下很有用,例如,如果您有多个构造函数,并且字段应该具有相同的初始值。在你的例子中,你总是想从一个空列表开始,这样你就可以避免空指针异常。总的来说,这确实是 collections 的一个好习惯。

为什么我们可以?因为语言说你可以。

这可能是一个不令人满意的答案,但基本上就是这样。

我认为这只是风格偏好的问题。对于简单的情况,特别是当我不需要任何带参数的构造函数时,我将使用初始化器 (String foo = "bar") 而不是在构造函数中进行。对于具有多个变量和多个构造函数的复杂情况,我可能会使用初始化器,然后让构造函数只处理需要不同的值。对于介于两者之间的情况,我倾向于在构造函数中进行全部设置。

你的问题更多是关于软件设计的。有时您需要为您的对象设置一些默认值。我个人尝试尽可能多地在构造函数中初始化值。我认为这更清楚,因为构建对象的新实例是构造函数的任务。另外,我认为尝试使对象不可变是一种很好的做法,这意味着您有 final 字段并在构造函数中初始化它们。当然,这并不总是可能的,但不可变对象更容易出现错误。