Я продолжаю сталкиваться с небольшими изменениями проблемы в Java, и он начинает добираться до меня, и я не могу действительно думать о надлежащем способе обойти его.
У меня есть свойство объекта, которое является окончательным, но динамичным. Таким образом, я хочу, чтобы значение было постоянным когда-то присвоенное, но значение может отличаться каждое время выполнения. Таким образом, я объявляю, что переменная уровня класса в начале класса - говорит private final FILE_NAME;
. Затем в конструкторе я присваиваю его, значение - говорит FILE_NAME = buildFileName();
Проблема начинается, когда у меня есть код в buildFileName()
метод, который выдает исключение. Таким образом, я пробую что-то вроде этого в конструкторе:
try{
FILE_NAME = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
Теперь у меня есть ошибка - "Пустое заключительное поле FILE_NAME, мог не быть инициализирован". Это - то, где я начинаю немного раздражаться в строгом компиляторе Java. Я знаю, что это не будет проблемой, потому что, если это добирается до выгоды, программа выйдет... Но компилятор не знает, что и так не позволяет этот код. Если я пытаюсь добавить фиктивное присвоение на выгоду, я добираюсь - "Заключительное поле FILE_NAME, возможно, уже был присвоен". Я ясно не могу присвоить значение по умолчанию перед выгодой попытки, потому что я могу только присвоить ей однажды.
Какие-либо идеи...?
Если подумать, мне кажется, я только что нашел решение! - использовать промежуточную переменную.
String fileName = null;
try{
fileName = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
FILE_NAME = fileName;
Не знаю, почему мне понадобилось столько времени, чтобы додуматься до этого...
Либо
try {
FILE_NAME = buildFileName();
} catch (Exception e){
...
System.exit(1);
throw new Error();
}
Или некоторые предпочитают:
private static final String FILE_NAME = fileName();
private static String fileName() {
try {
return buildFileName();
} catch (Exception e){
...
System.exit(1);
throw new Error();
}
}
Но вызов System.exit
в статическом инициализаторе, вероятно, плохая идея. Это испортит ваши модульные тесты.
Я бы лично просто выдал ошибку - если ваш поток ошибок спроектирован правильно, System.exit () должен быть избыточным. Предположительно ваша программа не пойдет в глушь, если выдается ошибка ...?
Как насчет
String tempName = null;
try{
tempName = buildFileName();
}
catch(Exception e){
...
System.exit(1);
}
FILE_NAME = tempName;