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

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


哆啦的时光机
浏览 184回答 2
2回答

ABOUTYOU

您需要转换null为您想要的类型,以便编译器可以解决歧义。例如:PersonFactory.get("John", "Doe", (String) null);或者PersonFactory.get("John", "Doe", (Integer) null);

墨色风雨

如果您传递 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 面更小。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java