2016-03-01 101 views
1

可以说我有一类“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(); 


    } 

} 

更重要的是preferrable,什么我应该做的?

+0

如果它是一个文字或一个常量,它并不重要。如果它取决于一个参数,那么它应该在构造函数中。 (在你的例子中有几个语法错误,以及你可能想要坚持Java命名约定) – SomeJavaGuy

回答

1

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

否则它做同样的事情。

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

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

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

因此,您以任何方式使用构造函数。注意:有很多你不能在一个简单的班轮上做。

例如

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 
    } 
} 
+0

所以你说不要使用构造函数进行初始化?我经常听说构造函数在那里用于初始化变量,如果没有,那么在构造函数中应该发生什么呢? – user5846939

+1

@OfeliavanAnalhard它有可变初始化。但我认为他的意思是说它可以像第一个变量不依赖于初始化参数的情况。 – SomeJavaGuy

0

这些特定领域的情况下,cpuCount看起来并不像它会在运行时改变,所以它可能是为final关键字一个很好的候选人。这表明一个值是一个常数。这种方法有一个特殊的命名约定,并且在声明的同一行上附加一个初始化约定。

private final int CPU_COUNT = 23; 

但是,你得到的对象和数组,看起来像他们将被操纵。所以他们应该在构造函数中初始化。

private final int CPU_COUNT = 23; 

public ComputerInsane() { 
    this.someArray = new int[10]; 
    // etc 
} 

所以你的常数值是内联初始化的,就像最终值的标准一样。你的其他值是在构造函数中创建的,因为正如你所说的,这是创建实例变量的一个声音。

额外的阅读

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

  • 请仔细阅读关于final关键字here的其他用途。

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

随着第一个解决方案,你不能使cpuCountfinal,您可能需要,第二个解决方案支持cpuCount作为final字段。

private final int cpuCount; 

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

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

这是更好地使用初始化构造函数,如果值是相同所有的时间,但如果你有一个初始化场不同许多构造函数,所以最好把这个逻辑构造。