簡體   English   中英

簽名重疊時如何重載構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM