让我们说我有一个班级" 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();
}
}
什么是更可取的,我应该做什么?
答案 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外部的初始化在构造函数体之前执行。 重要的是要了解在构造函数外部和内部都有初始化,因此构造函数初始化最后执行并覆盖预定义的值。
如果值始终为相同,则使用初始化外部构造函数会更好,但如果您有许多构造函数初始化您的字段不一样,所以最好将这个逻辑保留在构造函数中。