让我们假设我有一个构造函数FooBar(String foo,String bar)。有时候我需要创建只有“foo”的对象,有时候只需要“bar”来创建对象。
在对象创建期间避免null的显而易见的本能是重载构造函数。 但这会产生相同签名的问题。 例如:
FooBar(String foo)
FooBar(String bar)
FooBar(String foo, String bar).
假设我不想在这里使用构建器,是否有任何已知的替代方法可以避免构造对象而不使用null?换句话说,防止类似= new FooBar(“foo”,null)?
答案 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;
}