Java是否有语法来指定传递给方法的零或一个值?
所以我发现我们有3点符号表示零或更多,但是有什么表示零或一的吗 我需要修改一个方法,而不是重载它,我想知道是否有一个语法只允许传递零或一个值Java是否有语法来指定传递给方法的零或一个值?,java,overloading,Java,Overloading,所以我发现我们有3点符号表示零或更多,但是有什么表示零或一的吗 我需要修改一个方法,而不是重载它,我想知道是否有一个语法只允许传递零或一个值 public void test(String sample, ObjectMapper... argOm){ ObjectMapper om = (!argOm.equals(null)?argOm:new ObjectMapper()); } 这不符合我的期望[]。我只想要零或一 除了更改对该方法的所有引用之外,重载是唯一的方法吗?最佳做法是
public void test(String sample, ObjectMapper... argOm){
ObjectMapper om = (!argOm.equals(null)?argOm:new ObjectMapper());
}
这不符合我的期望[]。我只想要零或一
除了更改对该方法的所有引用之外,重载是唯一的方法吗?最佳做法是重载方法并提供默认值,如下所示:
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个参数(包括默认值)的方法。如果希望编译器为您检查参数数量,则需要使用重载。不幸的是,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");
}
...
}
请注意,用于允许调用者不传递对象映射器的条件代码将替换为重载,重载会在编译时检测到这种情况。正如其他答案所述,重载可能是最好的选择。但请记住,使用works也可以解决此问题:
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()
我喜欢这种方法的优雅和流畅清晰。毕竟,许多软件专家喜欢警告每个附加参数给方法带来的复杂性,但对于您的简单情况来说,这可能是矫枉过正。不过,总的来说,这是一个很好的模式 是的,重载是唯一的方法。对于这种特殊情况,可能是最好的方法,但肯定不是唯一的方法。请看下面。谢谢大家的意见。此时,我正试图避免修改POJO,因为它们由第三方控制。我会继续努力找到解决这个问题的另一种方法。