所以我发现我们有零点或更多的3点符号,但有零或一个吗?
我需要改变一个方法而不是重载它我想知道是否有一个语法只允许传递零个或一个值?
public void test(String sample, ObjectMapper... argOm){
ObjectMapper om = (!argOm.equals(null)?argOm:new ObjectMapper());
}
这并不是我想要的,因为它期待[]。我只想零或一个。
除了改变对此的所有引用之外,重载是唯一的方法吗?
答案 0 :(得分:6)
如果您希望编译器为您检查参数的数量,则需要使用重载。不幸的是,Java没有提供默认参数机制,用于建模"零或一个"用其他语言。
幸运的是,重载非常简单,它允许您替换实现中的条件赋值:
public void test(String sample){
test(sample, new ObjectMapper());
}
public void test(String sample, ObjectMapper om){
if (om == null) {
throw new IllegalArgumentException("object mapper");
}
...
}
请注意,用于允许调用者不传递对象映射器的条件代码将替换为重载,该重载在编译时检测到这种情况。
答案 1 :(得分:5)
最佳做法是重载方法并提供默认值,如下所示:
public void test(String sample) {
test(sample, new ObjectMapper());
...
}
public void test(String sample, ObjectMapper argOm) {
ObjectMapper om;
if (argOm != null)
om = argOm;
...
}
默认值是一个新的ObjectMapper对象。带有1个参数的方法使用2个参数调用该方法,包括默认值。
答案 2 :(得分:3)
正如其他答案所述,重载可能是您的最佳选择。但请记住,使用Builder Pattern也可以解决此问题:
class Foo {
private final String sample;
private final ObjectMapper objectMapper = new ObjectMapper();
private Foo(String sample, ObjectMapper objectMapper) {
this.sample = sample;
if (objectMapper != null) {
this.objectMapper = objectMapper;
}
}
public static class Builder {
private final String sample;
private final ObjectMapper objectMapper;
public Builder sample(String sample) {
this.sample = sample;
return this;
}
public Builder objectMapper(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
return this;
}
public Foo build() {
return new Foo(sample, objectMapper);
}
}
}
然后是:
Foo.Builder
.sample(mySample)
.objectMapper(myObjectMapper)
.build()
或者简单地说:
Foo.Builder
.sample(mySample)
.build()
我喜欢这种方法的优雅和流畅的清晰度。毕竟,像Uncle Bob这样的许多软件专家都警告每个附加参数给方法带来的复杂性,但这对于你的简单情况来说可能有些过分。不过,总的来说,这是一个很好的模式。