Ранее я сам писал вспомогательные классы, которые синхронизировали файл свойств с классом констант.Но это работает, только если вы придерживаетесь соглашений.
Допустим, у вас есть такой класс:
public final class Constants{
private Constants(){}
public static final String SOME_PROPERTY_NAME = "some.property.name";
public static final String THIS_ONE_NOT_SET_YET = null;
public static final String PROPERTY_NOT_DEFINED = "property.not.defined";
}
и файл свойств, подобный этому:
some.property.name=Hello World
no.constant.for.this.yet=Hello again
Мой вспомогательный класс должен был бы перебрать все свойства и все константы, сопоставить и идентифицировать те, которые ни к чему не относились.
Так что в этом случае:
a)
В Constants.java
public static final String THIS_ONE_NOT_SET_YET = null;
будет изменен на
public static final String THIS_ONE_NOT_SET_YET = "this.one.not.set.yet";
, а в файле свойств будет введена эта строка:
this.one.not.set.yet=
b)
в файле свойств, эта строка будет добавлена
property.not.defined=
c)
В Constants.java эта строка будет добавлена:
public static final String NO_CONSTANT_FOR_THIS_YET = "no.constant.for.this.yet";
Это не идеально, но таким образом вы получаете безопасность псевдокомпиляции.Вы компилируете с использованием констант, и ваш помощник поддерживает синхронизацию этих констант со свойствами.
Очевидно, что этот подход становится намного сложнее, если у вас есть более сложные сценарии.Например,
- Свойства, начинающиеся с "foo".хранится в «foo.properties», а свойства называются «bar».хранятся в "bar.properties"
- Интернационализация: теперь у вас есть foo.properties, foo.properties.es, foo.properties.de и т. д. Поддерживать синхронизацию - это большая неприятность.
Возможно, нужно учесть, что класс констант должен динамически создаваться из одного или нескольких файлов свойств в процессе сборки.Ваш генератор кода (основной класс, скрипт Groovy или даже скрипт оболочки) должен был бы просто сделать это (псевдокод):
properties = readProperties()
writeClassHeader()
for prop : properties
writeln "public static final String "
+ prop.name.upperCase().replace(".","_") + "= \"" + prop.name + "\";"
writeClassFooter()