在我的例子中,该类将有两个构造函数,它们都将3个字符串作为参数,但在其中一个构造函数中初始化的字符串变量之一可能不同。 是否可以实现以下内容:
class A {
String x = null;
String y = null;
String z = null;
String a = null;
A(String x, String y, String z) {
....
}
A(String a, String y, String z) {
....
}
}
答案 0 :(得分:12)
不,但快速解决方案是使用静态助手:
class A {
String x, y, z, a;
/** Constructor. Protected. See static helpers for object creation */
protected A(String x, String y, String z, String a) {
this.x = x;
this.y = y;
this.z = z;
this.a = a;
}
/** Construct a new A with an x, y, and z */
public static A fromXYZ(String x, String y, String z) {
return new A(x, y, z, null);
}
/** Construct a new A with an a, y, and z */
public static A fromAYZ(String a, String y, String z) {
return new A(a, null, y, z);
}
}
答案 1 :(得分:9)
是否可以实施以下
没有
因为编译器没有内置的水晶球,所以在编译时选择合适的构造函数。
请注意两点:
构造函数签名中的参数名称在编译后丢失 - 它们是纯人类糖。所以它们不能用于在两个ctors之间发送。
参数名称与字段名称无关。这两者通常相同,这与编译器无关。
答案 2 :(得分:9)
你做不到。您不能拥有两个具有完全相同签名的构造函数,也不能拥有两个具有完全相同签名的方法。参数名称无关紧要。
一种解决方案是使用所谓的静态工厂方法:
// in class A
// Parameter names could be "tar", "feathers" and "rope" for what it matters
public static A withXYZ(String x, String y, String z)
{
final A ret = new A();
ret.x = x; ret.y = y; ret.z = z;
return ret;
}
在代码中:
final A myA = A.withXYZ(whatever, you, want);
另一种解决方案是使用builder。
请参阅下面的@ Andy的答案,了解现成的解决方案。
答案 3 :(得分:2)
简而言之:否。
答案很长: 他们有多不同?如果它们非常不同,您可能需要考虑创建基类并对其进行扩展。
另一种选择是创建一个StringType枚举并使用构造函数传递它。
通常,如果您有两个类似的构造函数,则需要检查您的设计。
答案 4 :(得分:0)
绝对不是。如果我写道:
A a = new A("foo", "bar", " ");
然后我会调用哪个构造函数?
您的选择是使用静态方法,即:
public static A withXYZ(String x, String y, String z)
{
final A a = new A();
a.x = x;
a.y = y;
a.z = z;
return a;
}
A myA = A.withXYZ("foo", "bar", " ");
否则,您可以在构造后使用普通的setter注入值,即:
A a = new A();
a.setX("foo");
a.setY("bar");
a.setZ(" ");