考虑一个班级学生。以下是在默认构造函数中初始化实例值的两种方法:
class Student {
int units;
Student() {
this(10);
}
Student(int x) {
units = x;
}
};
以上方式比以下更好:
class Student {
int units;
Student() {
units = 10;
}
Student(int x) {
units = x;
}
};
哪种方式更好,更可取?
答案 0 :(得分:3)
在这个简单的例子中,我们看不到一个或另一个解决方案的真正优势。
但作为一般规则,我更喜欢构造函数调用其他构造函数的解决方案,因为它避免重复自己。
假设在构造函数中添加了两个或三个参数,并执行了一些处理。您可能应该在没有参数的构造函数中复制它。
例如,在构造函数中有重复:
class Student {
int units;
int otherUnits;
boolean isTrue;
Student() {
this.units = 10;
this.otherUnits = 20;
this.isTrue = true;
computeIntermediaryValue(units,otherUnits,isTrue);
}
Student(int units, int otherUnits, boolean isTrue) {
this.units = units;
this.otherUnits = otherUnits;
this.isTrue = isTrue;
computeIntermediaryValue(units,otherUnits,isTrue);
}
}
应避免不必要的重复。
在构造函数中没有重复它看起来更好:
class Student {
int units;
int otherUnits;
boolean isTrue;
Student() {
this(10, 20, true);
}
Student(int units, int otherUnits, boolean isTrue) {
this.units = units;
this.otherUnits = otherUnits;
this.isTrue = isTrue;
computeIntermediaryValue(units,otherUnits,isTrue);
}
}
答案 1 :(得分:1)
这是有争议的,取决于风格。
就个人而言,我选择第一种方法,因此只有一个主要构造函数,最后所有数据都通过这些构造函数。在另一个 secondary 构造函数中,您可以自己设置一些值(未注入),但最后通过相同的构造函数注入所有数据。
答案 2 :(得分:0)
内存问题:从其他构造函数调用一个会花费你的内存。因为它需要使用堆栈存储器。为了提高内存效率,您应该使用第二种方法。
速度问题:在第二种方法中,编译器首先必须检查将要调用哪个构造函数,并在确定它将调用所需的构造函数之后。但是编译器花费的时间会在某些情况下花费你,而在第一种方法中总是调用默认构造函数。
用户问题:最重要的是编写代码的方式以及使用不同参数调用参数化构造函数的需要。用户需要在构造函数调用中放置自定义数据的情况,第二种方法似乎相当不错。
虽然没有提到这方面的标准做法,但我喜欢使用第一种方法。(其余用户)
* @davidxxx提到的重复问题