На основе моего понимания языка Java статические переменные могут быть инициализированы в static initialization block
.
Однако, когда я пытаюсь реализовать это на практике (static
переменные, которые являются final
также), я показал ошибку в снимке экрана ниже:
Да, конечно: static final
переменные могут быть инициализированы в статическом блоке но.... у вас есть неявные GOTO в этом примере (try/catch
это по сути 'GOTO catch if something bad happens').
Если возникнет исключение, ваши конечные
переменные не будут инициализированы.
Обратите внимание, что использование статических конструкций идет вразрез с догмой объектно-ориентированного подхода. Это может усложнить тестирование и затруднить отладку.
Вы можете сделать это, но вам нужно выйти из статического блока, вызвав исключение - вы можете повторно выбросить исключение, которое было перехвачено, или новое. Обычно это исключение должно быть RuntimeException
. Вам действительно не следует перехватывать общее исключение
, а более конкретные исключения, которые могут быть сгенерированы в вашем блоке try
. Наконец, если статический инициализатор генерирует исключение, он сделает класс непригодным для использования во время этого конкретного запуска, потому что JVM попытается инициализировать ваш класс только один раз. Последующие попытки использовать этот класс приведут к другому исключению, например NoClassDefFoundError
.
Итак, для работы ваш инициализатор должен читать что-то вроде этого:
static {
try {
...
} catch (Exception e) {
e.PrintStackTrace();
throw new InitializationFailedException("Could not init class.", e);
}
}
Предполагая, что InitializationFailedException
- это пользовательское RuntimeException
, но вы можете использовать существующее.