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

时间:2019-07-04 13:36:11

标签: java overloading

它在Java中为以下类型的问题提供了一种解决方案:具有一个参数不同的重载方法。如果将不同的参数传递为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(),但是它没有定义的类型,因此不能用来选择正确的方法...

2 个答案:

答案 0 :(得分:7)

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

例如:

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

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

答案 1 :(得分:4)

仅当您传递文字null时,这才是问题。

请考虑添加仅具有2个参数的另一个重载,以避免调用站点出现以下问题:a)null; b)marstran建议的消除歧义的空类型转换:

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调用者那么“亲切”。

就目前而言,尚不清楚您将接受哪些String值:是否接受空格?逗号分隔成千上万?十六进制?等

让呼叫者处理这些问题:如果您只接受Integer,那么他们就是必须解决如何构造它们的人。

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