2011-11-09 29 views
1

我一直在想:訪問的變量命名VARIABLENAME +數

  • 如果我有一個例如8周的JLabel命名LABEL1,LABEL2,LABEL3 ...
  • 我收到一條消息,在一個顯示其中1到8的整數

是否有任何聰明的方式來訪問名稱爲標籤+數字的變量而不使用開關或一堆if-elses?如果是這樣,它比開關/ if-elses方法更有效嗎?

我爲Java添加了標籤,但我認爲這對於任何經典語言都是一個有趣的問題。

+1

爲什麼不使用數組'JLabel [] label'?然後你可以使用'label [x-1]'(x是1到8)來訪問它們。 – Thomas

回答

2

你可以使用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)); 
    } 
} 
+0

很好的回答:)無論如何,一個switch語句必須有多少次檢查(近似地)的性能比反射差?交換機的地圖是不是更糟糕(只是不如反思差)? –

+1

@RomanRdgz:很難估計需要多少個交換機才能獲得最差的性能,然後反射,因爲反射的一個缺點是jvm優化,當您使用反射時不會進行這種優化。對於'Map'解決方案:請注意,如果您使用'HashMap',則搜索時間爲'O(1)',這對於switch語句不是真實的。然而,我認爲這些微觀優化很少考慮更喜歡另一種,因爲性能差異通常很小。可讀性通常應該是選擇其中一個的考慮因素。 – amit

+0

所以,如果我理解了,HashMap應該比switch語句更快? –

1

你應該把標籤在array(或collection):反射的用法

簡單的例子。