我有不可变的类,想要添加新的构造函数而不在两个构造函数中复制代码。
我上课了:
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()”构造函数,但这是不可能的。
答案 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);
}
这不能在子类中继承,但是如果你希望你的类是严格不可变的,那么它应该是最终的。