我刚刚意识到我已经通过以下方式初始化实例变量:
public class Service{
private Resource resource;
public Service(){
resource = new Resource();
//other stuff...
}
}
...我想只是出于习惯。
我想知道是否通过以下方式导致实例化,编译或任何我没有意识到的差异?
public class Service{
private Resource resource = new Resource();
public Service(){
//other stuff...
}
}
我确实意识到,如果您想要不同的“默认”值,则在第一种方式中有一个优势,如下所示:
public class Foo{
private String bar;
private SomeClass bar2;
public Foo(){
bar = "";
bar2 = new SomeClass();
//other stuff...
}
public Foo(String bar, SomeClass bar2){
this.bar = bar;
this.bar2 = bar2;
//other stuff...
}
}
vs
public class Foo{
private String bar = "";
private SomeClass bar2 = new SomeClass();
public Foo(){
//other stuff...
}
public Foo(String bar, SomeClass bar2){
this.bar = bar;
this.bar2 = bar2;
//other stuff...
}
}
...由于后一种方法使变量的实例在调用参数化构造函数时会被破坏,但这是一个更为“复杂”的情况,可能是我习惯于前一种初始化实例的原因。
除了当其中一种真正重要时习惯使用其中一种方法之外,这两种方法是否还有其他优势?
答案 0 :(得分:1)
将声明站点初始化按照出现的顺序编译到所有构造函数中。因此,这两种方法之间的唯一区别是声明站点初始化被“重用”,这很方便但也很浪费。您的第二个示例等效于:
public class Foo {
private String bar;
private SomeClass bar2;
public Foo() {
this.bar = "";
this.bar2 = new SomeClass();
// other stuff...
}
public Foo(String bar, SomeClass bar2) {
this.bar = "";
this.bar2 = new SomeClass();
this.bar = bar;
this.bar2 = bar2;
// other stuff...
}
}
(顺便说一句,请在{
前面加一个空格,除非您所在公司的编码标准不允许。)