Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是否有语法来指定传递给方法的零或一个值?_Java_Overloading - Fatal编程技术网

Java是否有语法来指定传递给方法的零或一个值?

Java是否有语法来指定传递给方法的零或一个值?,java,overloading,Java,Overloading,所以我发现我们有3点符号表示零或更多,但是有什么表示零或一的吗 我需要修改一个方法,而不是重载它,我想知道是否有一个语法只允许传递零或一个值 public void test(String sample, ObjectMapper... argOm){ ObjectMapper om = (!argOm.equals(null)?argOm:new ObjectMapper()); } 这不符合我的期望[]。我只想要零或一 除了更改对该方法的所有引用之外,重载是唯一的方法吗?最佳做法是

所以我发现我们有3点符号表示零或更多,但是有什么表示零或一的吗

我需要修改一个方法,而不是重载它,我想知道是否有一个语法只允许传递零或一个值

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,因为它们由第三方控制。我会继续努力找到解决这个问题的另一种方法。