4

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

如果没有,最佳实践是什么?

“在班上”:

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

7 回答 7

4

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

看看官方教程怎么说——

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

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

于 2013-08-22T12:31:27.027 回答
2

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

如果你在构造函数中赋值,那么你的变量将首先被赋值一个默认值,然后来自构造函数的值将被赋值。

阅读初始化块、构造函数及其执行顺序

在最佳实践的情况下,

  • 如果在创建对象时必须将所有值传递给构造函数,则必须使用构造初始化。
  • 如果有一些值需要为每个对象设置默认值,那么您可以分配外部构造函数。
于 2013-08-22T12:29:36.250 回答
1

使用初始化块。 初始化字段

public class X {

  // The following is the initializer block
  {
  }

  public X() {
  }
}
于 2013-08-22T12:34:31.293 回答
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

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

于 2013-08-22T12:29:10.133 回答
0

两者几乎相同。

但是来自文档的有效行

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

于 2013-08-22T12:34:47.037 回答
0

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

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

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

于 2013-08-22T12:36:36.037 回答
-1

我推荐C:

class C {
    private boolean b = true;

}

-> 没有(显式)构造函数 -> 更少的代码 -> 更易于阅读

于 2013-08-22T12:31:00.380 回答