java 在声明中初始化vs在构造函数中初始化[重复]

ltskdhd1  于 2023-09-29  发布在  Java
关注(0)|答案(4)|浏览(121)

此问题已在此处有答案

Should I instantiate instance variables on declaration or in the constructor?(15个回答)
Should I initialize variable within constructor or outside constructor [duplicate](11个答案)
2小时前关闭
我想知道,哪种做法更好,为什么。我应该在声明时初始化类字段,还是应该在构造函数中初始化?因为这是一个简单的一行初始化。

class Dude
{
    String name = "El duderino";
    
    Dude() {
        // irrelevant code
    }
}

vs.

class Dude
{
    String name;
    
    Dude() {
        name = "El duderino";
        
        // irrelevant code
    }
}

**编辑:**我知道其中一种样式会优先于另一种样式的情况,例如在执行初始化器代码时可能会抛出异常。我在这里讨论的是两种风格绝对等价的情况。这两种方法都可以完成同样的任务。那我该用哪一个呢?

tuwxkamq

tuwxkamq1#

如果成员只能通过访问器(一个“setter”方法)设置,我更喜欢第一种风格。它提供了一个提示,即初始化的值是构造时的默认值。
如果可以在构造过程中指定成员,我通常会将默认值从具有较少参数的构造函数传递给适当的构造函数。比如说,

final class Dude {

  private final String name;

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

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

}
ttisahbt

ttisahbt2#

第一个通常用于初始化静态变量,并且应该仅用于此目的。
在这种情况下,您应该使用第二种方法。
如果我错了请纠正我。

sigwle7e

sigwle7e3#

为了保持一致性,最好在构造函数中声明变量。一个变量可能需要一个类似循环或if-else语句的东西来初始化它,如果不将操作放在方法中,就不能在声明中完成。
此规则的例外是静态变量,它应该在构造函数之外声明。

yyhrrdl8

yyhrrdl84#

单行声明不能包含复杂的初始化逻辑。
如果将变量初始化为:

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

相关问题