带有可选参数的Java构造函数/方法?

时间:2011-09-15 08:37:12

标签: java constructor

  

可能重复:
  Java optional parameters

我知道在PHP中如果要调用参数较少的函数,则声明函数如下:

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

现在我可以致电foo(2)param2将设为2。

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

谢谢!

6 个答案:

答案 0 :(得分:91)

Java在构造函数或方法中没有带缺省值的可选参数的概念。你基本上处于超负荷状态。但是,您可以轻松地链接构造函数,因此您无需重复代码:

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

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

答案 1 :(得分:17)

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

如果有许多可能的默认值,则可以使用Builder模式,从而使用带有setter的辅助对象。

e.g。

   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 = "defaultForParam1";
       private String param2 = "defaultForParam2";

       public Builder param1(String param1) {
         this.param1 = param1;
         return this;
       }
       public Builder param2(String param1) {
         this.param2 = param2;
         return this;
       }
       public Foo build() {
         return new Foo(this);
       }
     }
   }

允许你说:

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

将具有param2的默认值。

答案 2 :(得分:7)

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

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
}

然而,这种方法并不是一种很好的方法,因此最好使用重载。

答案 3 :(得分:2)

您可以使用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进行比较。

答案 4 :(得分:0)

你为什么要这样做?

但是,你可以这样做:

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);
}

答案 5 :(得分:0)

您不能在Java中使用默认为特定值的可选参数。 你所谈论的最接近的是java varargs,你可以将任意数量的参数(相同类型)传递给方法。