Java 签名重叠时如何重载构造函数?

Java 签名重叠时如何重载构造函数?,java,constructor,overloading,Java,Constructor,Overloading,假设我有一个构造函数FooBar(stringfoo,stringbar)。有时我需要创建只包含“foo”的对象,有时只包含“bar”,有时两者都包含 在对象创建过程中避免null的明显本能是重载构造函数。 但这就造成了相同签名的问题。 例如: 假设我不想在这里使用构建器,是否有任何已知的替代方法可以避免在不使用null的情况下构建对象?换句话说,防止类似于=new FooBar(“foo”,null) 不,不能那样做。只能有一个FooBar(字符串) 您可以将字符串放入上下文中,如下所示: c

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

在对象创建过程中避免null的明显本能是重载构造函数。 但这就造成了相同签名的问题。 例如:


假设我不想在这里使用构建器,是否有任何已知的替代方法可以避免在不使用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;
}

如果可以,你希望语法是什么?如果可以,你希望语法是什么?