我最近正在阅读一些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第一个构造函数似乎不是一个"真正的"构造函数,似乎在每种情况下都会使用其他构造函数之一.那么为什么要定义构造函数呢?
1> Uri..:我不确定您所阅读的代码是否具有高质量(我过去曾审阅过一些生物信息学代码,但遗憾的是,这些代码通常不是由专业开发人员编写的).例如,第三个构造函数不是复制构造函数,并且通常在此代码中存在问题,因此我不会"过多地阅读它".
第一个构造函数是默认构造函数.它只初始化最低限度,并允许用户使用getter和setter设置其余部分.其他构造函数通常是"便利构造函数",可帮助创建具有较少调用的对象.但是,这通常会导致构造函数之间的不一致.实际上,最近的研究表明,默认构造函数以及后续调用setter是更可取的.
在某些情况下,默认构造函数也很重要.例如,某些框架(如digester(用于直接从XML创建对象))使用默认构造函数.JavaBeans通常使用默认构造函数等.
此外,某些类继承自其他类.当父对象的初始化"足够好"时,您可能会看到默认构造函数.
在这种特定情况下,如果未定义该构造函数,则必须事先知道所有细节.这并不总是可取的.
最后,一些IDE会自动生成一个默认构造函数,编写该类的人可能会害怕消除它.
这是一篇关于它的学术论文:Jeffrey Stylos和Steven Clarke."在对象构造函数中需要参数的可用性含义".国际软件工程会议(ICSE 2007).http://www.cs.cmu.edu/~NatProg/papers/Stylos2007CreateSetCall.pdf
2> Chris Nava..:对象是Serializable吗?
为了允许序列化非可序列化类的子类型,子类型可以承担保存和恢复超类型的公共,受保护和(如果可访问)包字段的状态的责任.只有当它扩展的类具有可访问的no-arg构造函数来初始化类的状态时,子类型才可以承担此责任.如果不是这种情况,则声明类Serializable是错误的.将在运行时检测到错误.
在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段.必须可以对可序列化的子类访问no-arg构造函数.可序列化子类的字段将从流中恢复