我一直在想:訪問的變量命名VARIABLENAME +數
- 如果我有一個例如8周的JLabel命名LABEL1,LABEL2,LABEL3 ...
- 我收到一條消息,在一個顯示其中1到8的整數
是否有任何聰明的方式來訪問名稱爲標籤+數字的變量而不使用開關或一堆if-elses?如果是這樣,它比開關/ if-elses方法更有效嗎?
我爲Java添加了標籤,但我認爲這對於任何經典語言都是一個有趣的問題。
我一直在想:訪問的變量命名VARIABLENAME +數
是否有任何聰明的方式來訪問名稱爲標籤+數字的變量而不使用開關或一堆if-elses?如果是這樣,它比開關/ if-elses方法更有效嗎?
我爲Java添加了標籤,但我認爲這對於任何經典語言都是一個有趣的問題。
你可以使用reflection,但它會遭受糟糕的性能,或者你可以使用Map<Integer,JLabel>
做到這一點,它已經與你的對象預計算。
對於更一般的情況,反射可能是你正在尋找的東西。
public class TestSomething {
public int elem1 = 1;
public int elem2 = 2;
public int elem3 = 3;
public int elem4 = 4;
public static void main(String[] str) throws NoSuchFieldException,IllegalAccessException {
TestSomething test = new TestSomething();
int num = 3;
Field field = test.getClass().getField("elem" + num);
System.out.println(field.get(test));
}
}
很好的回答:)無論如何,一個switch語句必須有多少次檢查(近似地)的性能比反射差?交換機的地圖是不是更糟糕(只是不如反思差)? –
@RomanRdgz:很難估計需要多少個交換機才能獲得最差的性能,然後反射,因爲反射的一個缺點是jvm優化,當您使用反射時不會進行這種優化。對於'Map'解決方案:請注意,如果您使用'HashMap',則搜索時間爲'O(1)',這對於switch語句不是真實的。然而,我認爲這些微觀優化很少考慮更喜歡另一種,因爲性能差異通常很小。可讀性通常應該是選擇其中一個的考慮因素。 – amit
所以,如果我理解了,HashMap應該比switch語句更快? –
你應該把標籤在array(或collection):反射的用法
簡單的例子。
您可以使用反射:http://download.oracle.com/javase/tutorial/reflect/
例如
int i = 0;
Field f = this.getClass().getDeclaredField("prefix" + i);
f.setInt(this, 42);
反射不是特別快,但它非常靈活。對於你的例子,你可以使用switch語句可能獲得最佳性能。
爲什麼不使用數組'JLabel [] label'?然後你可以使用'label [x-1]'(x是1到8)來訪問它們。 – Thomas