В моем коде есть множество констант для различных настраиваемых свойств моей системы. Я перемещаю их все в центральный .properties
файл. Мое текущее решение состоит в том, чтобы иметь один Properties.java
, который статически загружает файл .properties
и предоставляет различные методы получения, например:
public class Properties {
private static final String FILE_NAME = "myfile.properties";
private static final java.util.Properties props;
static {
InputStream in = Properties.class.getClassLoader().getResourceAsStream(
FILE_NAME);
props = new java.util.Properties();
try {
props.load(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static String getString(Class<?> cls, String key) {
return props.getProperty(cls.getName() + '.' + key);
}
public static int getInteger(Class<?> cls, String key) {
return Integer.parseInt(getString(cls, key));
}
public static double getDouble(Class<?> cls, String key) {
return Double.parseDouble(getString(cls, key));
}
}
Единственная проблема заключается в том, что для каждой константы, которую я получаю из этого файла, у меня есть шаблон:
private final static int MY_CONSTANT = Properties.getInteger(
ThisClass.class, "MY_CONSTANT");
Я не думаю, что хочу использовать Spring или что-то подобное, потому что это кажется еще более опасным. Я надеялся использовать специальную аннотацию для решения проблемы. Я нашел это руководство, но не могу понять, как получить желаемую функциональность от обработки аннотаций. Документы по Java оказались еще менее полезными. Однако это должно быть то, что я должен уметь делать во время компиляции. Я знаю названия класса и поля.
Я думаю примерно так:
@MyAnnotation
private static final int MY_CONSTANT;
Кто-нибудь знает, как я бы это сделал, или, по крайней мере, передовые практики для того, что я хочу делать?
final
потеряет свой смысл (я даже не уверен, что отражение может присвоить значение полюfinal
). Если они только конфигурация, почему бы вам не использовать структуру конфигурации для облегчения вашей задачи (например, commons-configuration или configafe's config)? Если они константы, зачем их изменять при каждом запуске? - person Olivier Grégoire   schedule 22.03.2015InputStream
в своем блокеtry-catch-finally
. Вы должны попробовать и сделать это. - person Olivier Grégoire   schedule 22.03.2015InputStream
- хороший момент (хотя и не совсем актуальный). - person Ellis Michael   schedule 22.03.2015static final
файла, используя только специальные аннотации и имена этих констант? В java это невозможно. - person Andremoniy   schedule 22.03.2015Properties.getX(ClassName.class, "FIELD_NAME")
- person Ellis Michael   schedule 22.03.2015