它在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()
,但是它没有定义的类型,因此不能用来选择正确的方法...
答案 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表面较小。