首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何避免Java中的构造器代码冗余?

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

Stack Overflow用户
提问于 2018-03-23 05:17:47
回答 2查看 0关注 0票数 0

我有以下class:

代码语言:javascript
复制
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);
    }
}

该类包含两个可选值,我想提供所有可能的构造函数排列。第一个版本不初始化任何东西,第二个版本只初始化第一个值,第三个版本初始化第二个值。

最后一个构造函数是第二个和第三个的组合。但是不可能写下来,因为代码失败。

代码语言:javascript
复制
constructor.java:13: call to this must be first statement in constructor
        this(cdr);
            ^
1 error

是否有可能写没有任何代码冗余的最后一个构造函数(也没有调用相同的setter方法)?

EN

回答 2

Stack Overflow用户

发布于 2018-03-23 13:54:55

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

代码语言:javascript
复制
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; }
票数 0
EN

Stack Overflow用户

发布于 2018-03-23 15:17:17

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

代码语言:javascript
复制
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。

此外,您可能希望完全移除单参数构造函数 - 而是使用静态方法更具可读性,您可以在其中指定名称中的含义:

代码语言:javascript
复制
public static Pair fromCar(String car) {
    return new Pair(car, null);
}

public static Pair fromCdr(Integer cdr) {
    return new Pair(null, cdr);
}

或者按照我的意思命名:

代码语言:javascript
复制
public static Pair fromFirst(String first) {
    return new Pair(first, null);
}

public static Pair fromSecond(Integer second) {
    return new Pair(null, second);
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档