Java 签名重叠时如何重载构造函数?
假设我有一个构造函数FooBar(stringfoo,stringbar)。有时我需要创建只包含“foo”的对象,有时只包含“bar”,有时两者都包含 在对象创建过程中避免null的明显本能是重载构造函数。 但这就造成了相同签名的问题。 例如:Java 签名重叠时如何重载构造函数?,java,constructor,overloading,Java,Constructor,Overloading,假设我有一个构造函数FooBar(stringfoo,stringbar)。有时我需要创建只包含“foo”的对象,有时只包含“bar”,有时两者都包含 在对象创建过程中避免null的明显本能是重载构造函数。 但这就造成了相同签名的问题。 例如: 假设我不想在这里使用构建器,是否有任何已知的替代方法可以避免在不使用null的情况下构建对象?换句话说,防止类似于=new FooBar(“foo”,null) 不,不能那样做。只能有一个FooBar(字符串) 您可以将字符串放入上下文中,如下所示: c
假设我不想在这里使用构建器,是否有任何已知的替代方法可以避免在不使用null的情况下构建对象?换句话说,防止类似于=new FooBar(“foo”,null) 不,不能那样做。只能有一个
FooBar(字符串)
您可以将字符串放入上下文中,如下所示:
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) { }
}
不,不能那样做。只能有一个FooBar(字符串)
您可以将字符串放入上下文中,如下所示:
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) { }
}
提供静态
工厂方法,其名称可以变化并反映实际用途:
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
s的最佳方法。这听起来是下一个最好的方法。提供静态
工厂方法,其名称可能会有所不同,并反映实际用途:
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
s的最佳方法。这听起来是下一个最好的方法。您不能有两个具有相同签名的构造函数。因此,除了建筑商,我只能想到以下选项:
FooBar(String value, boolean isFoo) {
if (isFoo) {
foo = value;
} else {
bar = value;
}
}
不能有两个具有相同签名的构造函数。因此,除了建筑商,我只能想到以下选项:
FooBar(String value, boolean isFoo) {
if (isFoo) {
foo = value;
} else {
bar = value;
}
}
作为已经给出的更好解决方案的替代方案,您可以使用无参数构造函数创建对象,然后使用其setter选择性地设置字段:
FooBar fb = new FooBar();
fb.setFoo(String foo);
或
或
请注意,此方法本身几乎没有缺点。作为已经给出的更好解决方案的替代方案,您可以使用无参数构造函数创建对象,然后使用其setter选择性地设置字段:
FooBar fb = new FooBar();
fb.setFoo(String foo);
或
或
请注意,此方法本身几乎没有缺点。另一种选择是使用带有Enum
参数的构造函数,该参数指示字符串是否为foo或bar。因此,如果您调用newfoobar(“xyz”,ArgType.FOO)
,它将采用FOO变量的值“xyz”;如果您调用newfoobar(“abc”,ArgType.BAR)
,它将采用分配给BAR变量的值“abc”
Foobar(String abc, ArgType at)
{
if(at == ArgType.FOO)
foo = abc;
if(at == ArgType.BAR)
bar = abc;
}
另一种方法是使用带有Enum
参数的构造函数,该参数指示字符串是否为foo或bar。因此,如果您调用newfoobar(“xyz”,ArgType.FOO)
,它将采用FOO变量的值“xyz”;如果您调用newfoobar(“abc”,ArgType.BAR)
,它将采用分配给BAR变量的值“abc”
Foobar(String abc, ArgType at)
{
if(at == ArgType.FOO)
foo = abc;
if(at == ArgType.BAR)
bar = abc;
}
如果可以,你希望语法是什么?如果可以,你希望语法是什么?