Файл свойства java как enum

Можно ли преобразовать файл свойства в перечисление.

У меня есть файл propoerty с множеством настроек. например

equipment.height
equipment.widht
equipment.depth 
and many more like this and not all are as simple as the example

Разработчик должен знать ключ, чтобы получить значение свойства. вместо этого можно сделать что-то, где разработчик будет печатать MyPropertyEnum. и список ключей будет отображаться в среде IDE, как показано на Enum

MyPropertyEnum.height

Ответ 1

Я часто использую комбинацию свойств файла + enum. Вот пример:

public enum Constants {
    PROP1,
    PROP2;

    private static final String PATH            = "/constants.properties";

    private static final Logger logger          = LoggerFactory.getLogger(Constants.class);

    private static Properties   properties;

    private String          value;

    private void init() {
        if (properties == null) {
            properties = new Properties();
            try {
                properties.load(Constants.class.getResourceAsStream(PATH));
            }
            catch (Exception e) {
                logger.error("Unable to load " + PATH + " file from classpath.", e);
                System.exit(1);
            }
        }
        value = (String) properties.get(this.toString());
    }

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

}

Теперь вам также нужен файл свойств (я его размещаю в src, поэтому он упакован в JAR) со свойствами, как и в перечислении. Например:

constants.properties:

#This is property file...
PROP1=some text
PROP2=some other text

Теперь я очень часто использую статический импорт в классах, где я хочу использовать мои константы:

import static com.some.package.Constants.*;

И пример использования

System.out.println(PROP1);

Ответ 2

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

Что вы можете сделать, это сгенерировать enum из этого файла свойств. Или используйте словарь (Карта) для доступа к вашим свойствам с помощью чего-то вроде:

equipment.get("height");

Ответ 3

нет, я так не думаю. Перечисления создаются во время компиляции, и поэтому их количество элементов не может меняться в зависимости от того, что находится в файле свойств.

Скорее всего, вам понадобится структура, которая будет гибкой для построения во время выполнения - возможно, ассоциативный массив.

Ответ 4

Нет. Ну, я полагаю, вы могли бы, если бы вы могли скомпилировать файл свойств в класс Java (или enum). Я не могу найти ничего подобного (но было бы очень круто)

Ответ 5

Один из способов, я мог представить, чтобы получить все свойства в вашей среде IDE, можно определить Enum со всеми из них, например:

public enum Settings
{
   EQUIPMENT_HEIGHT("equipment.height", "0"),

   EQUIPMENT_WIDTH("equipment.width", "0"),

   EQUIPMENT_DEPTH("equipment.depth", "0");

   private String property;

   private String value;

   Settings(final String aProperty, final String aValue)
   {
      property = aProperty;
      value = aValue;
   }

   public String getProperty()
   {
      return property;
   }

   public String getValue()
   {
      return value;
   }

   private void setValue(final String aValue)
   {
      value = aValue;
   }

   public static void initialize(final Properties aPropertyTable)
   {
      for(final Settings setting : values())
      {
         final String key = setting.getProperty();
         final String defaultValue = setting.getValue();
         setting.setValue(aPropertyTable.getProperty(key, defaultValue));
      }
   }
}

Инициализация перечисления объясняется самостоятельно (метод initialize()).

После этого вы можете использовать его следующим образом:

Settings.EQUIPMENT_HEIGHT.getValue();

Добавление нового свойства просто добавляет новый enum-Constant.

Ответ 6

Вы можете превратить файл свойств в enum с сгенерированным кодом. Вы можете сделать это статически до того, как программа будет скомпилирована и, возможно, во время выполнения, используя API компилятора. Это значительно усложняет работу и обычно упрощает использование карты, как было предложено.

Ответ 7

Был задан вопрос о перечислении, я хотел создать enum на основе свойства. Я отказался от этой идеи, потому что это перечисление должно быть динамическим, если мы получим новый код ошибки, его следует добавить в файл свойств. К сожалению, я не вижу возможности сделать это с перечислением, поэтому я выбрал другой путь, поскольку я читаю, что все предлагают решение на основе карты. Вместо enum я создал синглтон, который просто читает файл свойств и отвечает на ключевые слова, чтобы вернуть значение.

файл свойства:

C102 = Blablabla1
C103 = Blablabla2
C104 = Blablabla3

одноэлементный код:

package mypackage;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Properties;

public class ResponseValidationTypeCodes {

private final HashMap<String, String> codes;

private static ResponseValidationTypeCodes instance;

public static ResponseValidationTypeCodes getInstance() {
    if (instance == null) {
        instance = new ResponseValidationTypeCodes();
    }
    return instance;
}

private ResponseValidationTypeCodes() {
    super();
    codes = new HashMap<String, String>();
    initEntry();
}

private void initEntry() {
    Properties prop = new Properties();
    try {
        prop.load(new FileInputStream(
                "src/main/resources/validationcodes.properties"));
        for (Entry<Object, Object> element : prop.entrySet()) {
            codes.put(element.getKey().toString(), element.getValue()
                    .toString());
        }

    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public String getValueByCode(String code) {
    return codes.get(code);
}
}

чтобы получить значения, просто вызовите:

ResponseValidationTypeCodes.getInstance()
            .getValueByCode("C102");

начальное считывание свойств выполняется только один раз. Таким образом, вы просто расширяете свойство, когда происходят какие-то изменения, и перераспределите ваши ресурсы в это время. Надеюсь, это поможет кому-то, кто открыт для использования альтернативы перечислению.

Ответ 8

public enum ErrorCode{


    DB_ERROR( PropertiesUtil.getProperty("DB_ERRROR_CODE"), PropertiesUtil.getProperty("DB_ERROR")),
    APP_ERROR(PropertiesUtil.getProperty("APPLICATION_ERROR_CODE"), PropertiesUtil.getProperty("APPLICATION_ERROR")),
    ERROR_FOUND(PropertiesUtil.getProperty("ERROR_FOUND_CODE"), PropertiesUtil.getProperty("ERROR_FOUND"));


    private final String errorCode;
    private final String errorDesc;



    private ErrorCode(String errorCode, String errorDesc) {
        this.errorCode = errorCode;
        this.errorDesc = errorDesc;
    }

    public String getErrorDesc() {
        return errorDesc;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public static String getError(String errorCode)
    { 
        System.out.println("errorCode in Enum"+errorCode);
        System.out.println(java.util.Arrays.asList(ErrorCode.values()));
        for (ErrorCode errorEnum : ErrorCode.values()) {
            System.out.println(errorEnum.errorCode);
            System.out.println(errorEnum.errorDesc);
        if ((errorEnum.errorCode).equals(errorCode)) {
            return errorEnum.getErrorDesc();
        }
        }
        return ERROR_FOUND.getErrorDesc();

    }


public class PropertiesUtil {
static  Properties prop = new Properties();

    static{

        try {

              InputStream inputStream =
                      PropertiesUtil.class.getClassLoader().getResourceAsStream("db.properties");

             prop.load(inputStream);
    }catch(Exception e)
        {
        e.printStackTrace();
        }
    }



        public static PropertiesUtil getInstance()
        {

            return new PropertiesUtil();
        }

        public Properties getProperties()
        {
            return prop;
        }

        public static String getProperty(String key)
        {
            return prop.getProperty(key);
        }


}