![](/img/trans.png)
[英]java How to pass this to another constructor(Constructor Overload)?
[英]How to overload constructor when signatures overlap?
假設我有一個構造函數FooBar(String foo,String bar)。 有時我需要只使用“ foo”創建對象,有時只使用“ bar”創建對象。
在對象創建期間避免空值的明顯本能是重載構造函數。 但這產生了相同簽名的問題。 例如:
FooBar(String foo)
FooBar(String bar)
FooBar(String foo, String bar).
假設我不想在這里使用構建器,是否有任何已知的替代方法可以避免在不使用null的情況下構造對象? 換句話說,要防止= new FooBar(“ foo”,null)?
提供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
的最佳方法。 這聽起來像是下一個最佳方法。
不,不能那樣做。 只能有一個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個具有相同簽名的構造函數。 因此,除了構建器之外,我只能想到以下選項:
FooBar(String value, boolean isFoo) {
if (isFoo) {
foo = value;
} else {
bar = value;
}
}
作為已經給出的更好解決方案的替代方法,可以使用無參數構造函數創建對象,然后使用其設置器有選擇地設置字段:
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);
請注意,此方法有其自身的不足之處。
另一種選擇是使用帶有Enum
參數的構造函數,該參數指示String是foo還是bar。 因此,如果您調用new Foobar("xyz", ArgType.FOO)
,則它將foo變量的值取為“ xyz”;如果您調用new Foobar("abc", ArgType.BAR)
,則它將取值要分配給bar變量的“ abc”。
Foobar(String abc, ArgType at)
{
if(at == ArgType.FOO)
foo = abc;
if(at == ArgType.BAR)
bar = abc;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.