如何避免Java中的构造器代码冗余?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

我有以下class:

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方法)?

提问于
用户回答回答于

通常,参数较少的构造函数应该使用更多的参数。

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; }
用户回答回答于

以相反的方向链接您的构造函数,最具体的是设置所有字段的构造函数:

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类设为通用的,而不用担心如果两个类型参数相同,哪个构造函数将被调用。此外,读取代码的任何人都可以理解将构建什么而不必检查参数的类型。

扫码关注云+社区