这两种初始化实例变量的方式有什么区别?

我刚刚意识到我一直在以下列方式初始化实例变量:


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

    }

}

...因为后者创建了变量的实例,如果调用参数化构造函数,这些实例将被丢弃,但这是一个更“复杂”的情况,这可能是我习惯了前一种初始化实例的方式的原因。


除了在真正重要的时候习惯其中一种方式之外,这两种方式还有什么优势吗?


绝地无双
浏览 166回答 1
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...    }}(顺便说一句:请在您的 之前放置一个空格{,除非您所在的公司的编码标准不允许。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java