我有以下课程:
class Pair
{
String car;
Integer cdr;
public Pair () {}
public Pair (String car) { this.car = car; }
public Pair (Integer cdr) { this.cdr = cdr; }
public Pair (String car, Integer cdr)
{
this(car);
this(cdr);
}
}
该类包含两个可选值,我想提供所有可能的构造函数排列。第一个版本不初始化任何东西,第二个版本只初始化第一个值,第三个初始化第二个值。
最后一个构造函数是第二个和第三个的组合。但是不可能写下来,因为代码失败。
constructor.java:13: call to this must be first statement in constructor
this(cdr);
^
1 error
是否有可能写没有任何代码冗余的最后一个构造函数(也没有调用相同的setter方法)?
发布于 2018-03-20 13:33:39
通常,参数较少的构造函数应该使用更多的参数。
public Pair() {}
public Pair(String car) { this(car, null); }
public Pair(Integer cdr) { this(null, cdr); }
public Pair(String car, Integer cdr) { this.car = car; this.cdr = cdr; }
发布于 2018-03-20 14:36:48
以相反的方向链接你的构造函数,最具体的是设置所有字段的构造函数:
public Pair() {
this(null, null); // For consistency
}
public Pair(String car) {
this(car, null);
}
public Pair(Integer cdr) {
this(null, cdr);
}
public Pair (String car, Integer cdr) {
this.car = car;
this.cdr = cdr;
}
那样:
另外,我强烈建议你将这些字段设置为私有的(也许是最终的),并给它们更有意义的名称。
注意这样,如果你有5个参数和一个带3的构造函数,一个带有4个参数,一个带有5个参数,你可以选择链接3 - > 4 - > 5,或者你可以直接从3 - > 5。
此外,你可能希望完全移除单参数构造函数 - 而是使用静态方法更具可读性,你可以在其中指定名称中的含义:
public static Pair fromCar(String car) {
return new Pair(car, null);
}
public static Pair fromCdr(Integer cdr) {
return new Pair(null, cdr);
}
或者按照我的意思命名:
public static Pair fromFirst(String first) {
return new Pair(first, null);
}
public static Pair fromSecond(Integer second) {
return new Pair(null, second);
}
此时,你可以将该Pair
类设为通用的,而不用担心如果两个类型参数相同,哪个构造函数将被调用。此外,任何阅读代码的人都可以理解将构建什么,而不必检查参数的类型。
https://stackoverflow.com/questions/-100007687
复制相似问题