Zig*_*ggy 7 java constructor coding-style
我最近正在阅读一些Java并且遇到了一些新的东西(一个成语?)对我来说是新的:在程序中,具有多个构造函数的类也总是包含一个空白构造函数.例如:
public class Genotype {
private boolean bits[];
private int rating;
private int length;
private Random random;
public Genotype() { // <= THIS is the bandit, this one right here
random = new Random();
}
/* creates a Random genetoype */
public Genotype(int length, Random r) {
random = r;
this.length = length;
bits = new boolean[length];
for(int i=0;i<length;i++) {
bits[i] =random.nextBoolean();
}
}
/* copy constructor */
public Genotype(Genotype g,Random r) {
random = r;
bits = new boolean[g.length];
rating = g.rating;
length = g.length;
for(int i=0;i<length;i++) {
bits[i] = g.bits[i];
}
}
}
Run Code Online (Sandbox Code Playgroud)
第一个构造函数似乎不是一个"真正的"构造函数,似乎在每种情况下都会使用其他构造函数之一.那么为什么要定义构造函数呢?
Uri*_*Uri 10
我不确定您所阅读的代码是否具有高质量(我过去曾审阅过一些生物信息学代码,但遗憾的是,这些代码通常不是由专业开发人员编写的).例如,第三个构造函数不是复制构造函数,并且通常在此代码中存在问题,因此我不会"过多地阅读它".
第一个构造函数是默认构造函数.它只初始化最低限度,并允许用户使用getter和setter设置其余部分.其他构造函数通常是"便利构造函数",可帮助创建具有较少调用的对象.但是,这通常会导致构造函数之间的不一致.实际上,最近的研究表明,默认构造函数以及后续调用setter是更可取的.
在某些情况下,默认构造函数也很重要.例如,某些框架(如digester(用于直接从XML创建对象))使用默认构造函数.JavaBeans通常使用默认构造函数等.
此外,某些类继承自其他类.当父对象的初始化"足够好"时,您可能会看到默认构造函数.
在这种特定情况下,如果未定义该构造函数,则必须事先知道所有细节.这并不总是可取的.
最后,一些IDE会自动生成一个默认构造函数,编写该类的人可能会害怕消除它.
对象是Serializable吗?
为了允许序列化非可序列化类的子类型,子类型可以承担保存和恢复超类型的公共,受保护和(如果可访问)包字段的状态的责任.只有当它扩展的类具有可访问的no-arg构造函数来初始化类的状态时,子类型才可以承担此责任.如果不是这种情况,则声明类Serializable是错误的.将在运行时检测到错误.
在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段.必须可以对可序列化的子类访问no-arg构造函数.可序列化子类的字段将从流中恢复