如何让两个构造函数具有相同数量的参数,但是对于java中的不同变量

时间:2013-06-17 22:11:43

标签: java constructor

在我的例子中,该类将有两个构造函数,它们都将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) {
      ....
   }
}

5 个答案:

答案 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(" ");