1

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

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

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

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

4

5 回答 5

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;
}

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

于 2013-10-31T00:27:49.340 回答
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);

请注意,这种方法本身几乎没有缺点。

于 2013-10-31T00:38:41.160 回答
0

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

你可以做的是把你String的 s 放到这样的上下文中:

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) { }
}
于 2013-10-31T00:25:55.790 回答
0

您不能有 2 个具有相同签名的构造函数。所以除了builder,我只能想到以下选项:

FooBar(String value, boolean isFoo) {
  if (isFoo) {
    foo = value;
  } else {
    bar = value;
  }
}
于 2013-10-31T00:29:38.477 回答
0

另一种选择是使用带有Enum参数的构造函数,该参数指示字符串是否为 foo 或 bar。因此,如果您调用new Foobar("xyz", ArgType.FOO),它将为 foo 变量取值“xyz”,如果您调用new Foobar("abc", ArgType.BAR),它将取值“abc”分配给 bar 变量。

Foobar(String abc, ArgType at)
{
  if(at == ArgType.FOO)
    foo = abc;
  if(at == ArgType.BAR)
    bar = abc;
}
于 2014-03-07T02:50:50.803 回答