Чем опасна слепая инициализация?

161
27 октября 2017, 11:23

Прошу объяснить, чем опасна "слепая инициализация" на каком-нибудь примере из практики?

public class ShopActivity {
    private int revenue = Prefs.getRevenue();
}

Всегда ли нужно выносить код инициализации переменных в конструкторе? Когда можно сделать исключение?

Answer 1

Компилятор переносит инициализацию полей в месте объявления (как и инициализацию полей в нестатических блоках) в конструктор (точнее говоря, во все имеющиеся).

Инициализация полей при объявлении и инициализация полей в конструкторе – это практически одно и то же. Разница лишь в том, что:

  1. Инициализация полей в месте объявления происходит перед инициализацией полей в конструкторе.

  2. В случае инициализации полей в месте объявления невозможно перехватить исключение (при этом, если исключение checked, то нужно будет создать конструктор, который далее будет прокидывать возникшее исключение).

Answer 2

Если совсем теоретически, то инициализируя свойства класса в момент их объявления необходимо быть твердо уверенным в том, что используемые для инициализации объекты существуют, а методы отработают корректно, так как вставить проверки и try/catch не получится.

public class Test{
    private Int number = 10;    
//тут вообще никаких проблем
    private String string = SomeStaticClass.getString(); 
//А если getString() бросит исключение?
    private Int number2 = Integer.parseInt(string); 
//А если string "кривая"?
    private View view = findViewById(R.id.view); 
//findViewById работает с инициализированным контекстом, которого на данном моменте просто не существует
}
READ ALSO
добавление ресурсов в jar файл

добавление ресурсов в jar файл

Господа знатоки подскажите

239
Отправка POST-запроса на сервер

Отправка POST-запроса на сервер

Задача - отправить на сервер запрос (либо параметры для запроса на сервере) и получить выборкуОднако с отправкой возникли проблемы

178
Как найти разницу во времени? [дубликат]

Как найти разницу во времени? [дубликат]

На данный вопрос уже ответили:

164
Recompile with the -verbose option for more details about the issue

Recompile with the -verbose option for more details about the issue

При компиляции проекта перед деплоем на weblogic ide jDeveloper выдает ошибку:

262