2011-09-15 58 views
25

可能重複:
Java optional parameters具有可選參數的Java構造函數/方法?

我知道,在PHP中,如果你想調用一個函數聲明的參數少的功能,如:

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

現在我可以撥打foo(2)param2將設置爲2.

我試圖在Java構造函數中做到這一點,但它似乎是不可能的。有沒有辦法做到這一點,或者我只需要聲明兩個構造函數?

謝謝!

+0

我不熟悉PHP,但爲什麼不在聲明方法中聲明param2? –

+2

這表明它是一個可選參數,如果你指定param2它將得到你給出的值,否則它將得到值「2」 – luketorjussen

回答

13

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默認值。

+0

+1,但是......其中* does * Java支持默認參數? ;-) – 2011-09-15 08:41:53

+0

:-)足夠公平。將編輯。 –

71

Java在構造函數或方法中沒有帶有默認值的可選參數的概念。你基本上被超載。但是,您可以輕鬆地鏈接構造函數,因此您不需要重複代碼:

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

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

這一個應該是被接受的答案! –

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

你不能有可選參數是默認Java中的一定的價值。 最接近你說的是java varargs,你可以將任意數量的參數(相同類型)傳遞給一個方法。

6

你可以使用可變參數來模擬它,然而你應該檢查它是否有太多的參數。

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 
} 

但是,這種方法不是這樣做的好方法,因此最好使用重載。

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超過int是很重要的。 Integera wrapper around the primitive int,它允許根據需要與null進行比較。

相關問題