[英]Using Varargs, can I assign values to variables based on the variable name?
我試圖將一個可變數量的參數傳遞給構造函數,因為並不是所有的值都是必需的,並且空值是可以的。 我可以這樣做,以便我可以按任何順序傳遞變量,並讓它們正確地分配給類中相應的變量嗎?
在我的例子中,很少有注意事項是類中的變量是序列化的; 值可以是String,Integer,boolean或Date; 並且傳遞給構造函數的值將始終與其對應的類值匹配(如果類中的值是Integer,則總是為該值傳入Integer,而不是String.parseInt(),例如)
Class Foo {
@SerializedName("id")
private Integer id;
@SerializeName("name")
private String name;
@SerializedName("isFoo")
private Date isFoo;
public Foo (Object... args){
}
}
在構造函數中,我希望能夠詢問對象名稱是否與類中的變量匹配,以將其分配給該變量。 因此,如果傳遞的Object之一是一個名為id的Integer,有沒有辦法將它與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
我認為這可以通過Reflection解決,但我不確定如何。 任何幫助都會很棒。
我在下面回答你的實際問題,但回答問題的潛在願望,你可能正在尋找Builder模式:
Foo foo = new Foo.Builder().id(id).name(name).build();
Foo foo = new Foo.Builder().name(name).id(id).isFoo(isFoo).build();
它是最初的Gang of Four模式之一。
(在上面我將Builder
作為一個嵌套類在Foo
,因為構建器類和它構建的東西往往是密切相關的。但這不是必需的,它只是它完成的一種方式。)
...我可以根據變量名稱為變量賦值嗎?
不會。 變量不會傳遞給您的方法。 從它們讀取變量中包含的值 ,並將該值傳遞給您的方法。 當它到達你的方法時,沒有任何連接回到值來自的變量(事實上,它來自變量)。
在您的具體示例中,由於它們中的每一個都具有不同的類型,您可以檢查args
每個條目以查看其類型是什么並從中起作用,但這將是相當奇怪的,我不會推薦它。
強調我不推薦它 ,看起來像:
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;
}
}
但同樣,我不推薦它,如果我在代碼審查中遇到它,我想要一個非常非常好的理由 。 :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.