嗯,这取决于。
对于第二种情况,将value
被填充的0
with its default value,只在实例化与100
重新分配。在第一种情况下,value
立即给出值100
。从语义上讲,这将对程序员有所帮助 - 他们会发现,这个特定的值意味着更多的东西,而不仅仅是任意的(尽管它应该是应该是一个常数值的地方)。
以编程方式,如果将某个基元设置为某个初始值,则不会有任何痛苦。这意味着有东西在那里供您使用,如果您的程序取决于有一个非负值或错误的值,乔治将工作。
事情在处理对象引用时变得更加明确。举个例子,这两个类:
public class Foo {
List<String> elements;
public Foo() {
}
public Foo(String... items) {
elements = new ArrayList<>();
for(String item : items) {
elements.add(item);
}
}
}
public class Bar {
List<String> elements = new ArrayList<>();
public Bar() {
}
public Bar(String... items) {
for(String item : items) {
elements.add(item);
}
}
}
有故意无参构造函数来费尽点 - 为Foo
,如果我尝试使用elements
,然后我在,如果我有点麻烦不要使用适当的构造函数 - elements
是null
!*我可能然后只是在我需要它的时候实例化它,但我非常想避免销毁一个潜在的新的和填充的列表。
这意味着大量的代码看起来像这样:
if(elements == null) {
elements = new ArrayList<>();
}
...然后我担心它是线程安全的。 Sheesh,谈论一下麻烦。
随着Bar
,我保证,在实例,有在elements
列表的一个实例,所以我不有担心它是null
。**
这是称为渴望实例化。你真的不希望没有那个对象,所以为什么要等到你认为你需要它(或者懒惰实例化)?
*:default value for all reference types是null
。
**:你做担心的是被改写,但是这是这个问题的范围之外的问题。
这些都是场,而不是属性。 – SLaks
必须仔细考虑您的范围。 –
字段在执行构造函数的主体之前被初始化。如果你需要在你的构造函数中泄漏'this'引用(不要,但是如果你需要的话),最好在其声明中而不是在构造函数中初始化该字段,以便获取该引用的人不会“ t看到一个完全单元化的状态。 –