在重载方法中将 null 作为参数传递?
Passing null as argument in overloaded methods?
java 中有针对以下类型问题的解决方案:具有一个参数不同的重载方法。 different参数传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()
,但是它没有定义类型,因此不能用来选择正确的方法...
您需要将 null
转换为您想要的类型,以便编译器可以解决歧义。
例如:
PersonFactory.get("John", "Doe", (String) null);
或
PersonFactory.get("John", "Doe", (Integer) null);
只有在传递文字 null
时才会出现此问题。
考虑添加另一个只有 2 个参数的重载,以避免出现 call-site a) null
; b) :
建议的消歧空转换
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.
的调用者如此 "kind"
就目前而言,尚不清楚您会接受哪些字符串值:您接受空格吗?千位逗号分隔?十六进制?等等
让来电者处理这些问题:如果您只接受一个 Integer
,他们就是必须弄清楚如何构造它的人。
这对他们来说可能更容易,因为他们比您更了解自己的数据,而且他们发现您的 API 更容易理解。这对您来说更容易,因为您需要维护的 API 表面更小。
java 中有针对以下类型问题的解决方案:具有一个参数不同的重载方法。 different参数传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()
,但是它没有定义类型,因此不能用来选择正确的方法...
您需要将 null
转换为您想要的类型,以便编译器可以解决歧义。
例如:
PersonFactory.get("John", "Doe", (String) null);
或
PersonFactory.get("John", "Doe", (Integer) null);
只有在传递文字 null
时才会出现此问题。
考虑添加另一个只有 2 个参数的重载,以避免出现 call-site a) null
; b)
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.
的调用者如此 "kind"就目前而言,尚不清楚您会接受哪些字符串值:您接受空格吗?千位逗号分隔?十六进制?等等
让来电者处理这些问题:如果您只接受一个 Integer
,他们就是必须弄清楚如何构造它的人。
这对他们来说可能更容易,因为他们比您更了解自己的数据,而且他们发现您的 API 更容易理解。这对您来说更容易,因为您需要维护的 API 表面更小。