【问题标题】:Java is there a syntax for specifying zero or one value passed to method?Java是否有指定传递给方法的零或一个值的语法?
【发布时间】:2017-03-06 18:07:54
【问题描述】:

所以我发现我们有 3 点表示法来表示零或更多,但有什么表示零或一吗?

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

public void test(String sample, ObjectMapper... argOm){
    ObjectMapper om = (!argOm.equals(null)?argOm:new ObjectMapper());
}

这并没有像我期望的那样做我想要的 [ ]。我只想为零或一。

除了改变对 this 的所有引用之外,重载是唯一的方法吗?

【问题讨论】:

  • 是的,重载是唯一的方法。
  • 可能是这种特殊情况的最佳方式,但肯定不是唯一方式。见下文。
  • 感谢大家的意见。目前我试图避免改变 POJO,因为它们是由第三方控制的。我将继续尝试寻找解决此问题的其他方法。

标签: java overloading


【解决方案1】:

如果您希望编译器为您检查参数的数量,则需要使用重载。遗憾的是,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");
    }
    ...
}

请注意,用于允许调用者不传递对象映射器的条件代码被替换为重载,它会在编译时检测到这种情况。

【讨论】:

    【解决方案2】:

    最佳做法是重载您的方法并提供如下默认值:

    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参数的方法,包括默认值。

    【讨论】:

      【解决方案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 这样的许多软件专家都警告过每个附加参数给方法带来的复杂性,但这对于您的简单情况可能有点过分了。不过,总的来说,这是一个很好的模式。

      【讨论】:

        猜你喜欢
        • 2021-05-10
        • 2019-02-15
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多