В том же ключе, что и проблема ОП, мне нужно было найти способ присвоить значения конечным полям для чтения из файла .properties в файловой системе, поэтому эти значения не могут быть известны моимприложение, пока это не произошло.Использование обобщенного вызова метода для присвоения значения после считывания содержимого файла .properties в объект Properties при запуске приложения было удачным проходом Hail Mary.Это также ограничивает нет.раз файл должен быть прочитан один раз для загрузки приложения в память просто путем проверки кода, чтобы видеть, является ли объект Properties в настоящее время нулевым или нет.Но, разумеется, после назначения значение окончательного поля не может быть изменено, кроме как путем изменения его «конечного» состояния посредством манипуляции изменяющим определением поля во время выполнения (как обсуждалось в некоторых других местах здесь, в SO, например, https://stackoverflow.com/a/3301720/1216686 -подлый, но я люблю это!).Пример кода, с типичной проверкой ошибок во время выполнения, такой как для NPE, для краткости опущен:
import java.util.Properties;
public class MyConstants {
private static Properties props; // declared, not initialized,
// so it can still be set to
// an object reference.
public static String MY_STRING = getProperty("prop1name", "defaultval1");
public static int MY_INT = Integer.parseInt(getProperty("prop2name", "1"));
// more fields...
private static String getProperty(String name, String dflt) {
if ( props == null ) {
readProperties();
}
return props.getProperty(name, dflt);
}
private static void readProperties() {
props = new Properties(); // Use your fave way to read
// props from the file system; a permutation
// of Properties.load(...) worked for me.
}
// Testing...
public static void main(String[] args) {
System.out.println(MY_STRING);
System.out.println(MY_INT);
}
}
Это позволяет вам выводить свойства, которые будут считаны в приложение, и по-прежнему помечать поля, используемые для хранения их значений, как "final",Это также позволяет вам гарантировать возвращаемое значение для окончательного значения поля, поскольку getProperty () в классе Properties позволяет вызывающему коду метода передавать значение по умолчанию для использования в случае, если пара ключ-значение свойства не была найдена во внешнемФайл .properties.