我刚刚意识到我一直在以下列方式初始化实例变量: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... }}对比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... }}...因为后者创建了变量的实例,如果调用参数化构造函数,这些实例将被丢弃,但这是一个更“复杂”的情况,这可能是我习惯了前一种初始化实例的方式的原因。除了在真正重要的时候习惯其中一种方式之外,这两种方式还有什么优势吗?
1 回答

翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
声明站点初始化按照它们出现的顺序编译到所有构造函数中。因此,这两种方法之间的唯一区别是声明站点初始化被“重用”,这(如您所指出的)很方便,但也可能很浪费。你的第二个例子相当于:
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...
}
}
(顺便说一句:请在您的 之前放置一个空格{,除非您所在的公司的编码标准不允许。)
添加回答
举报
0/150
提交
取消