在构造函数或类中分配属性值,哪个更好?

时间:2013-08-22 12:27:12

标签: java

以下类型的实例化有什么区别吗? 我是直接在定义变量的位置设置值,还是在类构造函数中设置。

如果没有,最佳做法是什么?

“在课堂上”:

class A {
    boolean b = true;

    public A(){
    }
}

“在构造函数中”:

class B {
    boolean b;

    public B(){
        b = true;
    }
}

变量类型仅用于示例。 我看到的唯一区别是,当属性是复杂类型(类)时,构造函数依赖于赋予包含类的构造函数的值:

class A {
    B b;
    public A(String s){
        b = new B(s);
    }
}

7 个答案:

答案 0 :(得分:4)

实际上它们都是等价的。但是,从可读性的角度来看,第一个更具可读性。此外,当有人从IDE导航到变量声明时很容易看到默认值(例如 ctrl +在Eclipse中单击鼠标)。

查看the official tutorial要说的内容 -

  

当初始化值可用时,这很有效   初始化可以放在一行上。但是,这种形式   由于其简单性,初始化具有局限性。如果   初始化需要一些逻辑(例如,错误处理或   for循环填充复杂数组),简单的赋值是不合适的。   实例变量可以在构造函数中初始化,其中包含错误   可以使用处理或其他逻辑。提供相同的功能   对于类变量,Java编程语言包括static   初始化块。

因此,当过程很简单时,您可以轻松使用简单的单线初始化技术。对于复杂的初始化选择,构造函数是可行的方法。

答案 1 :(得分:2)

如果将值分配给类中的变量,则在创建类的实例时,将直接将所需的值分配给变量。

如果在构造函数中指定值,则首先为变量分配一个默认值,然后分配构造函数中的值。

继续阅读initialization blocks, constructors and their order of execution

如果是最佳做法,

  • 如果在创建对象时必须将所有值传递给costructor,则必须使用构造初始化。
  • 如果某些值需要默认为每个对象,则可以指定外部构造函数。

答案 2 :(得分:1)

使用初始化块。 Initializing Fields

public class X {

  // The following is the initializer block
  {
  }

  public X() {
  }
}

答案 3 :(得分:0)

如果您没有指定一个变量,则会为实例变量分配默认值! Bu默认布尔实例变量的值为false。

public class HelloWorld {

    boolean b;

    public void printData() {
        System.out.println("Defualt boolean value is " + b);
    }


   public static void main(String args[]) {
    HelloWorld hw = new HelloWorld();
    hw.printData();
    }
}

,输出为Defualt boolean value is false

你在哪里分配你的变量纯粹是一种设计选择。

答案 4 :(得分:0)

我推荐C:

class C {
    private boolean b = true;

}

- > no(显式)构造函数 - >更少的代码 - >更容易阅读

答案 5 :(得分:0)

两者几乎相同。

但来自docs

的有效行
  

。实例变量可以在构造函数中初始化,可以使用错误处理或其他逻辑。

答案 6 :(得分:0)

编译器将实例字段初始化复制到构造函数的开头,因此前两种方法生成完全相同的代码(或非常接近)。

(但请注意,对于静态字段初始化与static初始化方法相比,上述情况并不完全正确。)

这主要是一个问题,它似乎更清晰,不太可能导致混乱/错误。这取决于许多因素,包括个人风格。