2016-05-02 3 views
1

У меня есть дублированный код в моей программе, у меня есть перечисления, которые загружают значения из файла свойств, я хочу сделать мой код чище.java duplicated code in enum

Возможно, решение может быть Interface, но я не могу объявить не конечную переменную.

Это пример:

public enum AlertMessageEnum{ 
    // 
    OUTPUT_FOLDER_EXISTS, 
    ... 
    CONFIG_FILE_IS_MISSING; 
    // the file path to load properties 
    private static final String PATH= "/i18n/alertDialogText.properties"; 
    private static Properties properties; 
    private String value; 

    public void init() { 
     if (properties == null) { 
      properties = new Properties(); 
      try { 
       properties.load(AlertMessageEnum.class.getResourceAsStream(PATH)); 
      } 
      catch (Exception e) { 
       throw new RthosRuntimeException(e); 
      } 
     } 
     value = (String) properties.get(this.toString()); 
    } 

    public String getValue() { 
     if (value == null) { 
      init(); 
     } 
     return value; 
    } 
} 

public enum ConverterErrorEnum{ 
    INVALID_EXTRACTION_PATH, 
    ... 
    PATIAL_DATA_GENERATED; 

    private static final String PATH= "/i18n/converterErrorText.properties"; 
    private static Properties properties; 
    private String value; 

    ... 

} 

ответ

0

Это невозможно сгенерировать перечислений из файла свойств с помощью обычного кода Java. Вам нужен обходной путь, как:

  1. использовать класс, публикующий эти константы AWS неизменные значения
  2. генерировать Java исходный код из файла свойств
  3. генерировать код Java с отражением

Я предлагаю вариант 1. Например с одноплодной:

package com.example; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Enumeration; 
import java.util.List; 
import java.util.Properties; 

public class Props { 

    private static Props INSTANCE; 

    public synchronized Props getInstance() { 
     if (INSTANCE == null) { 
      INSTANCE = new Props(); 
     } 
     return INSTANCE; 
    } 

    private static final String PATH = "/i18n/converterErrorText.properties"; 
    private Properties properties; 
    private List<String> keys; 

    public Props() { 
     properties = new Properties(); 
     keys = new ArrayList<>(); 
     try { 
      properties.load(getClass().getResourceAsStream(PATH)); 
      for (Object key : properties.keySet()) { 
       keys.add(key.toString()); 
      } 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public Enumeration<Object> getKeys() { 
     return properties.keys(); 
    } 

    public String getProperty(String key) { 
     return properties.getProperty(key); 
    } 

} 
+0

код корректно работать это просто дублирование кода –

0

Делегат к другому классу, который содержит Properties для всех enum с:

public class PropertyProvider { 
    private static Map<Class<?>, Properties> pMap = new HashMap<>(); 

    public static String getValue(Enum<?> enumValue, final String path) { 
     Properties properties = pMap.get(enumValue.getClass()); 
     if (properties == null) { 
      properties = new Properties(); 
      try { 
       properties.load(PropertyProvider.class.getResourceAsStream(path)); 
      } 
      catch (Exception e) { 
       throw new RthosRuntimeException(e); 
      } 
      pMap.put(enumValue.getClass(), properties); 
     } 
     return (String) properties.get(enumValue.toString()); 
    } 
} 

public enum ConverterErrorEnum{ 
    INVALID_EXTRACTION_PATH, 
    ... 
    PATIAL_DATA_GENERATED; 

    private static final String PATH= "/i18n/converterErrorText.properties"; 
    private String value; 
    ... 

    public String getValue() { 
     if (value == null) { 
      value = PropertyProvider.getValue(this, PATH); 
     } 
     return value; 
    } 
} 
+0

спасибо, это работа correclty;) –