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

tgm*_*_rr 35 java constructor

可能重复:
Java可选参数

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

function foo(int param1, int param2 = "2");
Run Code Online (Sandbox Code Playgroud)

现在我可以打电话foo(2),param2并将设置为2.

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

谢谢!

Jon*_*eet 97

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

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

public Foo(int param1)
{
    this(param1, 2);
}
Run Code Online (Sandbox Code Playgroud)


Sim*_*son 19

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 = "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);
       }
     }
   }
Run Code Online (Sandbox Code Playgroud)

这可以让你说:

Foo myFoo = new Foo.Builder().param1("myvalue").build();
Run Code Online (Sandbox Code Playgroud)

它将具有默认值param2.


rea*_*000 8

你可以使用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
}
Run Code Online (Sandbox Code Playgroud)

但是这种方法不是一种好方法,因此最好使用重载.