签名重叠时如何重载构造函数?

时间:2013-10-31 00:22:24

标签: java constructor overloading

让我们假设我有一个构造函数FooBar(String foo,String bar)。有时候我需要创建只有“foo”的对象,有时候只需要“bar”来创建对象。

在对象创建期间避免null的显而易见的本能是重载构造函数。 但这会产生相同签名的问题。 例如:

FooBar(String foo)
FooBar(String bar)
FooBar(String foo, String bar).

假设我不想在这里使用构建器,是否有任何已知的替代方法可以避免构造对象而不使用null?换句话说,防止类似= new FooBar(“foo”,null)?

5 个答案:

答案 0 :(得分:6)

提供static工厂方法,其名称可以变化并反映实际目的:

public static FooBar createWithFooOnly(String foo) {
    FooBar fb = new FooBar();
    fb.setFoo(foo);
    return fb;
}

public static FooBar createWithBarOnly(String bar) {
    FooBar fb = new FooBar();
    fb.setBar(bar);
    return fb;
}

public static FooBar createWithFooAndBar(String foo, String Bar) {
    FooBar fb = new FooBar();
    fb.setFoo(foo);
    fb.setBar(bar);
    return fb;
}

你说你不想要一个建设者,但那将是消除null的最好方法。这听起来像是下一个最佳方式。

答案 1 :(得分:0)

不,不能那样做。只能有一个FooBar(String)

您可以做的是将String放入上下文中:

class FirstName {
  private final String value;
  FirstName(String value) { this.value = value; }
  String value() { return this.value; }
}
class LastName {
  private final String value;
  LastName(String value) { this.value = value; }
  String value() { return this.value; }
}

然后

class FooBar {
  FooBar(FirstName firstName) { }
  FooBar(LastName lastName) { }
  FooBar(FirstName firstName, LastName lastName) { }
}

答案 2 :(得分:0)

你不能拥有2个具有相同签名的构造函数。所以除了建造者之外,我只能想到以下选项:

FooBar(String value, boolean isFoo) {
  if (isFoo) {
    foo = value;
  } else {
    bar = value;
  }
}

答案 3 :(得分:0)

作为已经给出的更好解决方案的替代方案,您可以使用无参数构造函数创建对象,然后使用其setter选择性地设置字段:

FooBar fb = new FooBar();
fb.setFoo(String foo);

FooBar fb = new FooBar();
fb.setBar(String bar);

FooBar fb = new FooBar();
fb.setFoo(String foo);
fb.setBar(String bar);

请注意,此方法本身的缺点很少。

答案 4 :(得分:0)

另一种方法是使用带有Enum参数的构造函数,该参数指示String是否为foo或bar。因此,如果您调用new Foobar("xyz", ArgType.FOO),则foo变量的值为“xyz”,如果调用new Foobar("abc", ArgType.BAR),则将值“abc”赋值给bar变量。 / p>

Foobar(String abc, ArgType at)
{
  if(at == ArgType.FOO)
    foo = abc;
  if(at == ArgType.BAR)
    bar = abc;
}