Пример 2 менее гибок. Если вы добавите другой конструктор, вам также нужно запомнить экземпляр поля в этом конструкторе. Просто создайте экземпляр поля непосредственно или введите ленивую загрузку где-нибудь в геттере.
Если для создания экземпляра требуется больше, чем просто new
, используйте блок инициализатора. Это будет выполняться независимо от используемого конструктора. Например,
public class A {
private Properties properties;
{
try {
properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("file.properties"));
} catch (IOException e) {
throw new ConfigurationException("Failed to load properties file.", e); // It's a subclass of RuntimeException.
}
}
// ...
}
Проблема в том, что значение sigma
не вычислялось в каждой итерации. По сути, код вычисления должен быть перемещен в функцию, и он должен вычисляться на каждой итерации.