在调用构造函数而不是在构造函数中设置实例的变量有什么好处吗?

Jer*_*gan 3 java

例如:

public class Foo {
    private int bar = 42;

    Foo() {}
}
Run Code Online (Sandbox Code Playgroud)

VS

public class Foo {
    private int bar;

    Foo() {
        bar = 42;
    }
}
Run Code Online (Sandbox Code Playgroud)

这两种方法之间有任何成本/收益吗?我能看到它有所作为的唯一方法是在这样的场景中(你为第二个构造函数设置两次值):

public class Foo {
    private int bar = 42;

    Foo() {}

    Foo(int in) {
        bar = in;
    }
}
Run Code Online (Sandbox Code Playgroud)

vs(无论哪种方式你只设置一次)

public class Foo {
    private int bar;

    Foo() {
        this(42);
    }

    Foo(int in) {
        bar = in;
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?这样或那样做有什么固有的价值吗?

编辑

好吧,我意识到这些功能是相同的,我想弄清楚的是,如果有任何重大的处理成本与另一个相关联.似乎它应该是可以忽略的,充其量,但我想确认我的怀疑.

编辑2

我也意识到手动设置它们可以消除启动逻辑的可能性.这就是我选择这么简单的例子的原因.我编辑了问题文本,以反映我感兴趣的是效率.

cle*_*tus 11

这两种方法是等价的.话虽如此,我将添加两件事:

  1. 对于最终变量,这往往更像一个问题,因为显然你只能像在第三个片段中那样设置它们一次; 和
  2. 尝试将构造函数链接在一起.

在(2)我认为这是一个更好的版本:

public class Foo {
    private int bar;

    Foo() {
        this(42);
    }

    Foo(int in) {
        bar = in;
    }
}
Run Code Online (Sandbox Code Playgroud)

通过链接构造函数,您可以在一个很好的DRY(不要重复自己)中获得默认默认值,特别是在处理可能具有默认参数,各种允许类型的参数和非平凡初始化的多个参数时.理想情况下,只有一个或两个构造函数应该具有重要的逻辑.其余的应该链接到另一个构造函数.

如果你想使类不可变(正如Josh Bloch所说,赞成不变性)那么:

public class Foo {
    private final int bar;

    Foo() {
        this(42);
    }

    Foo(int in) {
        bar = in;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,值得将42作为静态最终常量(私有或公共,视情况而定).