这两种初始化实例变量的方式有何不同?

时间:2018-10-31 18:01:45

标签: java

我刚刚意识到我已经通过以下方式初始化实例变量:

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...
    }
}

...由于后一种方法使变量的实例在调用参数化构造函数时会被破坏,但这是一个更为“复杂”的情况,可能是我习惯于前一种初始化实例的原因。

除了当其中一种真正重要时习惯使用其中一种方法之外,这两种方法是否还有其他优势?

1 个答案:

答案 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...
    }
}

(顺便说一句,请在{前面加一个空格,除非您所在公司的编码标准不允许。)