【问题标题】:Passing null as argument in overloaded methods?在重载方法中将 null 作为参数传递?
【发布时间】:2019-07-04 13:36:11
【问题描述】:

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(),但它没有定义类型,因此不能用于选择正确的方法...

【问题讨论】:

  • 你希望它调用哪个重载?
  • 我希望它调用带有Integer的方法。
  • 如果没有 String 重载,就不会出现这个问题。不要对 API 的调用者这么“友善”:如果你需要传入一个 Integer,让他们弄清楚如何将他们的字符串转换为 Integer。就目前而言,尚不清楚您将接受哪些 String 值:您接受空格吗?千位逗号分隔?十六进制?等等。让来电者处理这些问题。
  • @AndyTurner 感谢您的建议。虽然我现在知道如何解决过载问题,但您让我相信这种方法弊大于利。所以我放弃了纯字符串方法。

标签: java overloading


【解决方案1】:

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

例如:

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

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

【讨论】:

【解决方案2】:

仅当您传递文字 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 的调用者这么“友善”。

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

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

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

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 2011-04-30
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2010-11-16
    相关资源
    最近更新 更多