为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2023-03-09 14:09:09
它在 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 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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

例如:

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

或者

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


查看完整回答
反对 回复 2023-03-09
?
墨色风雨

TA贡献1853条经验 获得超6个赞

如果您传递 literal ,这只是一个问题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-argcreate方法以传达不提供年龄的含义)。


尽管如此,如果没有 String 重载,就不会出现此问题。为方便起见,我假设您有 String 重载:您不需要对 API 的调用者如此“友善”。

就目前而言,不清楚您会接受什么 String 值:您接受空格吗?千位逗号分隔?十六进制?ETC。

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

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


查看完整回答
反对 回复 2023-03-09
  • 2 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号