本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Java optional parameters
我知道在PHP中,如果要调用参数较少的函数,则声明函数如下:
function foo(int param1, int param2 ="2");
现在我可以调用foo(2)并将param2设置为2。
我尝试在Java构造函数中执行此操作,但似乎不可能。 有没有办法做到这一点,或者我只需要声明两个构造函数?
谢谢!
我不熟悉PHP,但为什么不在方法中声明param2?
这表明它是一个可选参数,如果你指定param2它会得到你给的值,否则它得到值"2"
Java没有构造函数或方法中具有默认值的可选参数的概念。你基本上处于超负荷状态。但是,您可以轻松地链接构造函数,因此您无需重复代码:
public Foo(int param1, int param2)
{
this.param1 = param1;
this.param2 = param2;
}
public Foo(int param1)
{
this(param1, 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 ="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的默认值。
你可以使用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
}
但是这种方法不是一种好方法,因此最好使用重载。
您可以使用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在int上的使用。 Integer是原语int的包装器,允许根据需要与null进行比较。
您不能在Java中使用默认为特定值的可选参数。
最接近你所说的是java varargs,你可以将任意数量的参数(相同类型)传递给方法。
你为什么要那样做?
但是,您可以这样做:
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);
}