2016-03-03 96 views
1

我想傳遞一個可變數量的參數到一個構造函數中,因爲並不是所有的值都是必需的,而且空值是可以的。我可以這樣做,以便我可以按任何順序傳遞變量,並讓它們正確地分配給類中相應的變量。使用可變參數,我可以根據變量名稱爲變量賦值嗎?

在我的情況下,很少有值得注意的是類中的變量是序列化的;值可以是字符串,整數,布爾值或日期;並且傳遞給構造函數的值將始終與其相應的類值匹配(如果類中的值是整數,則將始終傳入整數以獲取該值,而不是String.parseInt(),例如)

Class Foo { 
    @SerializedName("id") 
    private Integer id; 

    @SerializeName("name") 
    private String name; 

    @SerializedName("isFoo") 
    private Date isFoo; 

    public Foo (Object... args){ 
    } 
} 

在構造函數中,我希望能夠詢問任何對象名稱是否與類中的某個變量相匹配,以便將其分配給該變量。所以如果一個Object的傳遞是一個Integer命名的id,有沒有辦法將它匹配到id?它應該能夠在幾種情況下匹配:

Foo foo = new Foo(id, name) //In this case, the bool would be null 
Foo foo2 = new Foo(name, id, isFoo) //Here the Integer is second, but should still be able to be passed in correctly 

我認爲這可以通過反射來解決,但我不知道如何。任何幫助將是驚人的。

+2

對象沒有名稱。只有變量有名字。調用者使用的變量名稱對於被調用者而言是未知的(並且不相關)。所有你收到的是一個對象數組。將三個參數傳遞給您的構造函數,如果您希望其中一個參數爲null,則傳遞null參數。 –

+0

我認爲你的目標是避免混亂的構造函數重載。我建議你將整個設計更改爲[流利的構建器](https://en.wikipedia.org/wiki/Fluent_interface#Java)。 – Mena

回答

3

我回答你的問題的實際以下,但回答問題的根本願望,你可能尋找Builder模式:

Foo foo = new Foo.Builder().id(id).name(name).build(); 
Foo foo = new Foo.Builder().name(name).id(id).isFoo(isFoo).build(); 

這四個模式的原岡之一。

(在上面我內FooBuilder嵌套類,如生成器類和它建立往往是密切相關的東西。但是,這是沒有必要的,這是它的工作只是一種方式。)


...我可以根據變量名稱給變量賦值嗎?

編號變量未傳遞給您的方法。將變量中包含的從它們中讀出,並將那個值傳遞給你的方法。當它到達你的方法時,沒有任何連接返回值的來源(如果實際上它來自一個變量)。

在你的具體的例子,因爲他們每個人都有一個獨特的類型,你可以檢查每個條目中args來看看它的類型和工作從,但它會很奇怪,我止跌」 t推薦它。

強調我不會推薦它,這將是這樣的:

for (Object arg : args) { 
    if (arg instanceof Integer) { 
     this.id = (Integer)arg; 
    } else if (arg instanceof String) { 
     this.name = (String)arg; 
    } else if (arg instanceof Date) { 
     this.isFoo = (Date)arg; 
    } 
} 

但同樣,我不會推薦它,如果我在代碼審查碰到它我會想要一個真的,真的很好的理由它。 :-)

+0

我可以使用(鍵,值)對來匹配我想將它分配給該值的變量嗎?所以每個值都在一個集合中,例如<"id", 1234>。如果是這樣,我將如何去匹配這些? – Hunter

+1

我認爲Builder模式似乎是最好的方式。我遇到的問題是,如果我需要向構造函數添加另一個變量,我必須重構每個構造函數方法,這樣我可以添加到構建器中,並且正在使用的構建器繼續工作。謝謝! – Hunter

+0

@獵人:是的,這是Builder的動機之一。我不知道GoF現在是否像十年前一樣出名,但我指的是[*設計模式:Gamma,Helm,Johnson和Vlissides的可重用面向對象軟件的元素](https:// en.wikipedia.org/wiki/Design_Patterns)。 –

相關問題