【问题标题】:Java constructor/method with optional parameters? [duplicate]带有可选参数的Java构造函数/方法? [复制]
【发布时间】:2011-11-17 16:30:07
【问题描述】:

可能重复:
Java optional parameters

我知道在 PHP 中,如果你想调用一个参数较少的函数,你可以像这样声明函数:

function foo(int param1, int param2 = "2");

现在我可以调用foo(2) 并且param2 将设置为2。

我尝试在 Java 构造函数中执行此操作,但似乎不可能。有没有办法做到这一点,或者我只需要声明两个构造函数?

谢谢!

【问题讨论】:

  • 我对PHP不熟悉,为什么不在方法里面声明param2呢?
  • 这表明它是一个可选参数,如果你指定param2它得到你给的值,否则它得到值“2”

标签: java constructor


【解决方案1】:

Java 在构造函数或方法中没有具有默认值的可选参数的概念。你基本上被超载所困。但是,您可以轻松链接构造函数,因此您无需重复代码:

public Foo(int param1, int param2)
{
    this.param1 = param1;
    this.param2 = param2;
}

public Foo(int param1)
{
    this(param1, 2);
}

【讨论】:

    【解决方案2】:

    Java 不支持默认参数。你需要有两个构造函数来做你想做的事。

    如果有很多可能的默认值,另一种方法是使用 Builder 模式,即使用带有 setter 的辅助对象。

    例如

       public class Foo {
         private final String param1;
         private final String param2;
    
         private Foo(Builder builder) {
           this.param1 = builder.param1;
           this.param2 = builder.param2;
         }
    
         public static class Builder {
           private String param1 = "defaultParam1";
           private String param2 = "defaultParam2";
    
           public Builder param1(String param1) {
             this.param1 = param1;
             return this;
           }
    
           public Builder param2(String param2) {
             this.param2 = param2;
             return this;
           }
    
           public Foo build() {
             return new Foo(this);
           }
         }
       }
    

    允许你说:

    Foo myFoo = new Foo.Builder().param1("myvalue").build();
    

    默认值为param2

    【讨论】:

      【解决方案3】:

      你可以使用可变参数来模拟它,但是你应该检查它是否有太多参数。

      public void foo(int param1, int ... param2)
      {
         int param2_
         if(param2.length == 0)
            param2_ = 2
         else if(para2.length == 1)
            param2_ = param2[0]
         else
            throw new TooManyArgumentsException(); // user provided too many arguments,
      
         // rest of the code
      }
      

      但是这种方法不是很好的方法,因此最好使用重载。

      【讨论】:

        【解决方案4】:

        你可以使用varargs作为可选参数:

        public class Booyah {
            public static void main(String[] args) {
                woohoo(1);
                woohoo(2, 3);
            }
            static void woohoo(int required, Integer... optional) {
                Integer lala;
                if (optional.length == 1) {
                    lala = optional[0];
                } else {
                    lala = 2;
                }
                System.out.println(required + lala);
            }
        }
        

        同样重要的是要注意使用Integer 而不是intIntegera wrapper around the primitive int,它允许根据需要与null 进行比较。

        【讨论】:

          【解决方案5】:

          你为什么要这么做?

          但是,您可以这样做:

          public void foo(int param1)
          {
              int param2 = 2;
              // rest of code
          }
          

          或:

          public void foo(int param1, int param2)
          {
              // rest of code
          }
          
          public void foo(int param1)
          {
              foo(param1, 2);
          }
          

          【讨论】:

            【解决方案6】:

            在 Java 中,您不能有默认为某个值的可选参数。 与您所说的最接近的是java varargs,您可以将任意数量的参数(相同类型)传递给方法。

            【讨论】:

              猜你喜欢
              • 2015-04-08
              • 1970-01-01
              • 2016-07-26
              • 1970-01-01
              • 2019-03-02
              • 2021-03-12
              • 1970-01-01
              • 1970-01-01
              • 2021-03-22
              相关资源
              最近更新 更多