我最近正在阅读一些
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]; } } }
解决方法
我不确定您所阅读的代码是否具有高质量(我过去曾审阅过一些生物信息学代码,但遗憾的是,这些代码通常不是由专业开发人员编写的).例如,第三个构造函数不是复制构造函数,并且通常在此代码中存在问题,因此我不会“过多地阅读它”.
第一个构造函数是默认构造函数.它只初始化最低限度,并允许用户使用getter和setter设置其余部分.其他构造函数通常是“便利构造函数”,可帮助创建具有较少调用的对象.但是,这通常会导致构造函数之间的不一致.实际上,最近的研究表明,默认构造函数以及后续调用setter是更可取的.
在某些情况下,默认构造函数也很重要.例如,某些框架(如digester(用于直接从XML创建对象))使用默认构造函数. JavaBeans通常使用默认构造函数等.
此外,某些类继承自其他类.当父对象的初始化“足够好”时,您可能会看到默认构造函数.
在这种特定情况下,如果未定义该构造函数,则必须事先知道所有细节.这并不总是可取的.