2017-07-04 180 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

希望这有助于。

相关问题