0

我有不可变的类,并且想要添加新的构造函数而不在两个构造函数中复制代码。

我有课:

public class Test {
    private final String stringParameter;

    public Test() {
        stringParameter = "firstReallyLongDefaultString";
    }

    public Test(String s) {
        stringParameter = s;
    }
}

我想添加带有“char”参数的新构造函数,如下所示:

public Test(char s) {
    if(Character.isLetter(s)) {
        stringParameter = "firstReallyLong" + s + "DefaultString";
    } else {
        stringParameter = "firstReallyLongDefaultString";
    }
}

如果没有长字符串的代码重复,我该怎么做?我想在 else 分支中调用“this()”构造函数,但这是不可能的。

4

4 回答 4

2
public Test(char s) {
    this(Character.isLetter(s) ? "firstReallyLong" + s + "DefaultString" : "firstReallyLongDefaultString");
}
于 2013-04-18T11:37:44.490 回答
1

像这样:

public Test(char s) {
    super();
    if(Character.isLetter(s)) {
        stringParameter = "firstReallyLong" + s + "DefaultString";
    }
}
于 2013-04-18T11:35:37.347 回答
1

您还可以更明确地链接它们,删除一些代码重复:

public class Test {
    private static final String DEFAULT_VALUE = "firstReallyLongDefaultString";
    private final String stringParameter;

    public Test() {
        this(DEFAULT_VALUE);
    }

    public Test(String s) {
        stringParameter = s;
    }

    public Test(char c) {
        this(prepareString(c));
    }

    private static String prepareString(char c) {
        if(Character.isLetter(s)) {
            return "firstReallyLong" + s + "DefaultString";
        } else {
            return DEFAULT_VALUE;
        }
    }

}

"firstReallyLongDefaultString"最好作为私有常量来避免重复。

于 2013-04-18T11:41:21.823 回答
0

工厂方法为您提供了更大的灵活性:

public static Test create(char c) {
    final String parameter;
    if(Character.isLetter(s)) {
        parameter = "firstReallyLong" + s + "DefaultString";
    } else {
        parameter = "firstReallyLongDefaultString";
    }
    return new Test(parameter);
}

这不能在子类中继承,但是如果您希望您的类是严格不可变的,它应该是最终的。

于 2013-04-18T12:12:45.313 回答