Java构造函数链接并避免代码重复

时间:2013-04-18 11:32:12

标签: java

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

我上课了:

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 个答案:

答案 0 :(得分:2)

public Test(char s) {
    this(Character.isLetter(s) ? "firstReallyLong" + s + "DefaultString" : "firstReallyLongDefaultString");
}

答案 1 :(得分:1)

像这样:

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

答案 2 :(得分: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"最好作为私有常量来完成,以避免重复。

答案 3 :(得分: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);
}

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