在重载方法中将 null 作为参数传递?

Passing null as argument in overloaded methods?

java 中有针对以下类型问题的解决方案:具有一个参数不同的重载方法。 different参数传null怎么办?

class PersonFactory {
    public static Person create(String firstname, String lastname, String age) {
          return create(firstname, lastname, Integer.valueOf(age));
    }

    public static Person create(String firstname, String lastname, Integer age) {
           Person p = new Person();
           p.setFirstname(firstname);
           p.setLastname(lastname);
           p.setAge(age);
           return p;
    }
}

PersonFactory.get("John", "Doe", null); //ambigous mapping

我以为可以在这里传递一个 Optional.empty(),但是它没有定义类型,因此不能用来选择正确的方法...

您需要将 null 转换为您想要的类型,以便编译器可以解决歧义。

例如:

PersonFactory.get("John", "Doe", (String) null);

PersonFactory.get("John", "Doe", (Integer) null);

只有在传递文字 null 时才会出现此问题。

考虑添加另一个只有 2 个参数的重载,以避免出现 call-site a) null; b) :

建议的消歧空转换
public static Person create(String firstname, String lastname) {
  return create(firstname, lastname, (Integer) null);
  // Or (String), if that's the one you want to invoke.
}

null 本身(或强制转换)对代码的读者来说意义不大。

现有重载的替代方法是定义一个常量:

public static final Integer MISSING_AGE = null;

// ...
Person.create(firstname, lastname, MISSING_AGE)

您可以为此常量选择一个准确传达空参数值语义的名称:

  • 隐瞒年龄
  • 未知年龄
  • 零岁
  • 默认年龄
  • 现在创建没有年龄,稍后会提供
  • ...

(类似地,上面建议的 2-arg create 方法应该命名以传达不提供年龄的含义)。


尽管如此,如果您没有 String 重载,就不会遇到此问题。为了方便起见,我假设您有 String 重载:您不需要对 API.

的调用者如此 "kind"

就目前而言,尚不清楚您会接受哪些字符串值:您接受空格吗?千位逗号分隔?十六进制?等等

让来电者处理这些问题:如果您只接受一个 Integer,他们就是必须弄清楚如何构造它的人。

这对他们来说可能更容易,因为他们比您更了解自己的数据,而且他们发现您的 API 更容易理解。这对您来说更容易,因为您需要维护的 API 表面更小。