我知道,在PHP中,如果你想調用一個函數聲明的參數少的功能,如:
function foo(int param1, int param2 = "2");
現在我可以撥打foo(2)
和param2
將設置爲2.
我試圖在Java構造函數中做到這一點,但它似乎是不可能的。有沒有辦法做到這一點,或者我只需要聲明兩個構造函數?
謝謝!
我知道,在PHP中,如果你想調用一個函數聲明的參數少的功能,如:
function foo(int param1, int param2 = "2");
現在我可以撥打foo(2)
和param2
將設置爲2.
我試圖在Java構造函數中做到這一點,但它似乎是不可能的。有沒有辦法做到這一點,或者我只需要聲明兩個構造函數?
謝謝!
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
默認值。
+1,但是......其中* does * Java支持默認參數? ;-) – 2011-09-15 08:41:53
:-)足夠公平。將編輯。 –
Java在構造函數或方法中沒有帶有默認值的可選參數的概念。你基本上被超載。但是,您可以輕鬆地鏈接構造函數,因此您不需要重複代碼:
public Foo(int param1, int param2)
{
this.param1 = param1;
this.param2 = param2;
}
public Foo(int param1)
{
this(param1, 2);
}
這一個應該是被接受的答案! –
爲什麼要這樣做?
然而,你可以這樣做:
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);
}
你不能有可選參數是默認Java中的一定的價值。 最接近你說的是java 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
是a wrapper around the primitive int
,它允許根據需要與null
進行比較。
我不熟悉PHP,但爲什麼不在聲明方法中聲明param2? –
這表明它是一個可選參數,如果你指定param2它將得到你給出的值,否則它將得到值「2」 – luketorjussen