如何从文件加载Java枚举元素的值

时间:2014-01-14 09:48:43

标签: java xml properties enums

我有一个Java Enum:

public enum CodeType {
  BRONZE("00001BP", "BAP"),
  SILVER("00002SL", "SAP"),
  GOLD("00003GL", "GAP"),
  MOBILE("00004MB", "TCM"),
  SOCIAL("00005SM", "ASM"),
  WEB_PRESENCE("00006WP", "GLO"),
  EMAIL_MARKETING("00007EM", "PEM"),
  CUSTOM_DIAMOND("00008CD", "PCS"),
  CONSUMER_PORTAL("00009CP", "CPS");

  private String code;
  private String key;

  CodeType(String code, String key) {
    this.code = code;
    this.key = key;
  }

  ...
}

如您所见,我有九个元素,每个元素都有两个值。我的问题是如何从属性或xml等文件中加载这些元素的值?我的意思是:

BRONZE(isLoadedFromFile, isLoadedFromFile),
...
CONSUMER_PORTAL(isLoadedFromFile, isLoadedFromFile);

非常感谢。

3 个答案:

答案 0 :(得分:9)

尝试这样的事情......

public enum EnumTest {

    BRONZE, SILVER;

    public String getProperty(String keyOrCode) {
        Properties prop = new Properties();
        try {
            prop.load(new FileInputStream("E:\\EnumMapper.properties"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return prop.getProperty(this.name() + "." + keyOrCode);
    }

    public String getCode() {
        return getProperty("CODE");
    }

    public String getKey() {
        return getProperty("KEY");
    }

    public static void main(String[] args) {
        System.out.println(EnumTest.BRONZE.getCode());
        System.out.println(EnumTest.BRONZE.getKey());

    }

}

EnumMapper.properties包含

BRONZE.CODE=00001BP
BRONZE.KEY=BAP
SILVER.CODE=00002SL
SILVER.KEY=SAP

只是想分享一些可能性..

答案 1 :(得分:0)

如果我正确理解了您的问题,您需要在构造函数中执行此操作(在您的示例中将其命名为错误)。

您显示的硬编码默认值将作为默认值,但在构造函数中,您将检查/加载某些属性文件并覆盖它们。

总的来说,这有点奇怪/糟糕的设计。您需要在枚举中对该属性文件/资源​​进行硬编码。您还可以动态加载表示常量值的内容。

看起来你应该使用自己的类来保存这些值。

答案 2 :(得分:0)

一种选择是基于枚举类中的资源文件生成静态映射,从枚举值映射到文件中的数据。然后可以将映射用于 getter。

例如一个资源文件格式如下:

A=red
B=blue
C=yellow

它可以像这样初始化:

public enum MyEnum {
    A, B, C;
    
    public String getFoo() {
        return enumFooValuesFromResourceFile.get(this);
    }

    private static final Map<MyEnum, String> enumFooValuesFromResourceFile;
    static {
        Map<MyEnum, String> temp = Collections.emptyMap();
        try {
            String data = new String(MyEnum.class.getResourceAsStream("resourcepath").readAllBytes());
            temp = Arrays.stream(data.split("\n"))
                    .map(line -> line.split("="))
                    .collect(Collectors.<String[], MyEnum, String>toMap(
                            key_val -> MyEnum.valueOf(key_val[0]),
                            key_val -> key_val[1]));
        } catch (IOException iE) {
            // helpful message.
        } finally { enumFooValuesFromResourceFile = temp; }
    }
}