我什么时候应该在构造函数内部和外部构造函数初始化类字段?

时间:2016-03-01 08:34:21

标签: java initialization

让我们说我有一个班级" ComputerInsane"私人领域" cpuCount"和默认构造函数,如下所示:

public class ComputerInsane {

    private int cpuCount = 23;

    public ComputerInsane() {
     //default constructor


     }  

}

现在我可以将构造函数外部的cpuCount初始化为23,如上所述,这样当我在类外创建类computerInsane的实例时,私有字段cpuCount将自动初始化为23.我也可以在声明变量之后将初始化放在构造函数中,如下所示:

public class ComputerInsane {

    private int cpuCount;

    public ComputerInsane() {
     //default constructor

      cpuCount = 23;

     }  

}

这样,当我在调用默认构造函数时创建类computerInsane的实例时,它也会自动调用。我的问题是这两种字段初始化之间的实际区别是什么,我应该做第一种还是第二种变体?

更重要的是,假设这些字段是需要用" new"或数组初始化的其他类的对象,因为它们也需要用" new"来初始化。在同样的意义上,我是否会去:

public class ComputerInsane {


    private int cpuCount = 23;
    private int[] someArray = new int[10];
    Someclass object1 = new Someclass();


    public ComputerInsane() {
     //default constructor


     }  

}

或者我去吧:

public class ComputerInsane {

    private int cpuCount;
    private int[] someArray;
    Someclass object1;

    public ComputerInsane(){
     //default constructor

     cpuCount = 23;
     someArray = new int[10];
     object1 = new Someclass();


     }  

}

什么是更可取的,我应该做什么?

4 个答案:

答案 0 :(得分:1)

你应该做你认为最简单,最干净的事情。我更喜欢第一种选择,因为它是最简单的恕我直言。

否则它会做同样的事情。

  

所以你说不要使用构造函数进行初始化?

实际上,字段初始化都是在运行时在构造函数中发生的。

  

我经常听说构造函数用于初始化变量,如果没有,那么构造函数中应该发生的“应该”是什么意思?

所以你以任何一种方式使用构造函数。注意:在一个简单的衬垫上有很多你无法做到的。

e.g。

public MyClass(int num) {
    this.num = num; // has to be in the constructor.
    try { // this could be in an initialiser block, but better here
        this.a = someOperation();
    } catch (IOException e) {
        // must be caught
    }
}

答案 1 :(得分:0)

对于这些特定字段cpuCount看起来不会在运行时更改,因此它可能是{{1}的良好候选者关键字。这表明值是常量。这种方法有一个特殊的命名约定,以及与声明在同一行上进行的额外初始化约定。

final

然而,你已经拥有的对象和数组看起来像是被操纵了。所以它们应该在构造函数中初始化。

private final int CPU_COUNT = 23;

因此,您的常量值是内联初始化的,具有最终值的标准也是如此。您的其他值是在构造函数中创建的,因为正如您所说,这是创建实例变量的合理位置。

额外阅读

  • 我强烈建议您阅读Java Naming Conventions。你的班级名字有点偏。

  • 阅读private final int CPU_COUNT = 23; public ComputerInsane() { this.someArray = new int[10]; // etc } 关键字here的其他用途。

答案 2 :(得分:0)

这取决于你将来想做什么。也许你想制作一个新的构造函数来增加你的计数,比如

public ComputerInsane (int multiCount){ }  

这样你可以做到

private int cpuCount = 23;

public ComputerInsane (int multiCount){ 
   cpuCount *= multiCount;
}  

private int cpuCount;

public ComputerInsane (int multiCount){ 
   cpuCount = 23 * multiCount;
} 

使用第一个解决方案,您无法提供cpuCount final,而第二个解决方案支持cpuCount作为final字段。

private final int cpuCount;

public ComputerInsane (int multiCount){ 
   cpuCount = 23 * multiCount;
} 

答案 3 :(得分:0)

constuctor外部的初始化在构造函数体之前执行。 重要的是要了解在构造函数外部和内部都有初始化,因此构造函数初始化最后执行并覆盖预定义的值。

如果值始终为相同,则使用初始化外部构造函数会更好,但如果您有许多构造函数初始化您的字段不一样,所以最好将这个逻辑保留在构造函数中。