2017-07-04 152 views
1

我擁有所有的常量下面給出的java類:如何通過其他變量從java類訪問常量?

public final class CategoryIDs { 

    public static final String Extraction_of_natural_gas = "1111"; 
    public static final String Mining_of_hard_coal = "2222"; 
    public static final String Mining_of_iron_ores = "3333"; 
    public static final String Mining_of_lignite = "4444"; 

} 

現在我想通過持有該變量的名稱的變量訪問一些其他類這些常量。

例如:

String temp = "Extraction_of_natural_gas"; 

使用這種臨時可變我想從上面的類訪問常數。但我不能做CategoryIDs.temp,因爲它是不允許的。那麼實現這個目標的最好方法是什麼?

+0

CategoryIDs.yourconstants – Frank

+1

使用'Map'我覺得 – Jerry06

+0

'CategoryIDs.Extraction_of_natural_gas.equals( 「1111」)' –

回答

5

您可以使用反射來提取它:

String value = (String) CategoryIDs.class.getField(temp).get(null); 

null參數傳遞給get表示這是一個靜態字段,沒有實例,以獲得其所需的價值。

請注意,這種技術是非常容易出錯的。上面的代碼不包含任何錯誤檢查或異常處理,以便於閱讀,但真正的應用程序應該包含它們。

+0

嘿..感謝這個解決方案。這是我從未使用過的新東西。我試過這個,它給出了異常處理的選項。它爲我工作:) – Madhusudan

7

如果你真的需要用你當前的結構來做到這一點,你可以使用反射。

但是,您可能會發現枚舉會更合適。喜歡的東西:這種方法的

public enum CategoryID { 

    EXTRACTION_OF_NATURAL_GAS("Extraction_of_natural_gas", 1111), 
    MINING_OF_HARD_COAL("Mining_of_hard_coal", 2222), 
    MINING_OF_IRON_ORES("Mining_of_iron_ores", 3333), 
    MINING_OF_LIGNITE("Mining_of_lignite", 4444); 

    private static final Map<String, CategoryID> keyMap; 

    static { 
     keyMap = new HashMap<>(); 
     for (CategoryID category : CategoryID.values()) { 
      keyMap.put(category.getKey(), category); 
     } 
    } 

    private final String key; 
    private final int value; 

    public int getValue() { 
     return value; 
    } 

    public String getKey() { 
     return key; 
    } 

    private CategoryID(String key, int value) { 
     this.key = key; 
     this.value = value; 
    } 

    public static CategoryID fromKey(String key) { 
     return keyMap.get(key); 
    } 
} 

優點:

  • 你分開的代碼名稱(也就是現在的Java更傳統的)從你的數據提供了關鍵。這意味着你可以在數據中使用你想要的任何密鑰,包括空格等。他們不再需要有效的標識符。
  • 當您引用代碼中的枚舉值時,您仍然可以獲得編譯時安全性。
  • 您獲得更好安全,因爲您永遠不會意外地使用字符串而不是類別ID,您可以輕鬆地使用常量完成該操作。
+0

嗨..感謝您的解決方案。我會檢查我是否可以在我的代碼中使用枚舉。 :) – Madhusudan

+0

其實我有大量的條目要處理。我嘗試擁有一個屬性文件。但是我將我的代碼導出到jar文件中,並且它沒有識別屬性文件的路徑。所以我不能這樣走。 – Madhusudan

+1

@Madhusudan:恐怕我真的不理解你的評論。這些與jar文件和屬性文件有什麼關係?這就像你正在回答一個完全不同的問題... –

1

我想你是在尋找內省。這是反射的「只讀」部分,您可以在其中檢索對象的值。

的代碼將如下,拼湊爲了便於理解:

Object value = null; 
    String constName = "Bar"; 
    Field constant = Foo.class.getField(constName); 

    if (constant != null) { 
     value = constant.get(null); 
    } 

    if (value != null) { 
     System.out.println(value); 
    } else { 
     System.out.println("Constant " + constName + " was not found."); 
    } 

有趣的是,你可以從對象調用get()訪問值,你傳遞null,因爲常是靜態的,因此你沒有一個實例從中提取值。

你可以找到整個代碼在這裏:http://ideone.com/v4fcvH

希望這有助於。