初始化声明与构造函数初始化

时间:2011-08-09 22:01:38

标签: java

  

可能重复:
  Should I initialize variable within constructor or outside constructor

我在想,这是一种更好的做法,为什么。我应该在声明时初始化类字段,还是应该在构造函数中执行?鉴于这是一个简单的单行初始化。

class Dude
{
    String name = "El duderino";

    Dude() {
        // irrelevant code
    }
}

VS

class Dude
{
    String name;

    Dude() {
        name = "El duderino";

        // irrelevant code
    }
}

编辑:我知道其中一种样式优先于另一种样式的情况,例如执行可能引发异常的初始化代码的情况。我在这里谈论的是两种风格完全相同的情况。两种方式都可以完成同样的任务。我应该使用哪个?

4 个答案:

答案 0 :(得分:4)

如果会员只能通过访问者设置(“设置者”方法),我更喜欢第一种风格。它提示初始化值是构造时的默认值。

如果在构造期间可以指定成员,我通常会使用较少的参数将默认值传递给构造函数中的相应构造函数。例如,

final class Dude {

  private final String name;

  Dude() {
    this("El Duderino");
  }

  Dude(String name) {
    this.name = name;
  }

}

答案 1 :(得分:0)

第一个通常用于初始化静态变量,只能用于此目的。

在这种情况下,您应该使用第二种方法。

如果我错了,请纠正我。

答案 2 :(得分:0)

为了保持一致性,最好在构造函数中声明变量。变量可能需要类似循环或if-else语句来初始化它,如果不将操作放在方法中,则无法在声明中完成。

此规则的例外是静态变量,应该在构造函数之外声明。

答案 3 :(得分:0)

单行声明不能包含复杂的初始化逻辑。

如果将变量初始化为:

class AnotherClass
{
    MyClass anObject = new MyClass(); //MyClass() throws a checked exception.
}

然后你会发现你不能在单行中提供初始值。您需要将这些代码放在一个块中,这显然是在构造函数内部(或在非静态初始化块中):

使用构造函数:

class AnotherClass
{
    MyClass anObject;

    AnotherClass()
    {
        try{this.anObject = new MyClass();}catch(SomeException e){/*handle exception.*/}
    }
}

使用初始化块:

class AnotherClass
{
    MyClass anObject;

    {
        try{this.anObject = new MyClass();}catch(SomeException e){/*handle exception.*/}
    }
}

我发现后者使代码不易理解,因为声明和初始化是相互分离的,初始化不会发生在开发人员编码的构造函数中(尽管在运行时没有区别)。

对于字段初始化中涉及的其他复杂例程也是如此。例如,如果您打算初始化ArrayCollection并将数组/集合的内容设置为某个默认值,那么您应该在构造函数中执行此操作:

class AnotherClass
{
    Integer[] integers;

    AnotherClass()
    {
        this.integers = new Integer[10];
        for(Integer integer: integers)
        {
            integer = Integer.MIN_VALUE;
        }
    }
}