默认构造函数与内联字段初始化

2022-08-31 07:40:32

默认构造函数和直接初始化对象的字段有什么区别?

有什么理由更喜欢以下示例之一而不是另一个示例?

示例 1

public class Foo
{
    private int x = 5;
    private String[] y = new String[10];
}

示例 2

public class Foo
{
    private int x;
    private String[] y;

    public Foo()
    {
        x = 5;
        y = new String[10];
    }
}

答案 1

初始化器在构造函数体之前执行。(如果您同时具有初始化器和构造函数,则会产生影响,构造函数代码将执行第二次并重写初始化值)

当您总是需要相同的初始值(例如,在您的示例中,给定大小的数组或特定值的整数)时,初始化器是好的,但它可以对您有利或不利:

如果有许多构造函数以不同的方式初始化变量(即具有不同的值),则初始化器是无用的,因为更改将被覆盖并且浪费。

另一方面,如果您有许多使用相同值进行初始化的构造函数,则可以通过将初始化保留在一个位置来保存代码行(并使代码更易于维护)。

正如Michael所说,这其中也涉及到一个品味问题——你可能想把代码放在一个地方。虽然如果你有很多构造函数,你的代码在任何情况下都不会放在一个地方,所以我更喜欢初始化器。


答案 2

更喜欢示例一的原因是,对于更少的代码,它是相同的功能(这总是好的)。

除此之外,没有区别。

但是,如果您确实有显式构造函数,我宁愿将所有初始化代码放入这些中(并将它们链接起来),而不是在构造函数和字段初始值设定项之间拆分它。