#java #инициализация
Прошу объяснить, чем опасна "слепая инициализация" на каком-нибудь примере из практики? public class ShopActivity { private int revenue = Prefs.getRevenue(); } Всегда ли нужно выносить код инициализации переменных в конструкторе? Когда можно сделать исключение?
Ответы
Ответ 1
Компилятор переносит инициализацию полей в месте объявления (как и инициализацию полей в нестатических блоках) в конструктор (точнее говоря, во все имеющиеся). Инициализация полей при объявлении и инициализация полей в конструкторе – это практически одно и то же. Разница лишь в том, что: Инициализация полей в месте объявления происходит перед инициализацией полей в конструкторе. В случае инициализации полей в месте объявления невозможно перехватить исключение (при этом, если исключение checked, то нужно будет создать конструктор, который далее будет прокидывать возникшее исключение).Ответ 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 работает с инициализированным контекстом, которого на данном моменте просто не существует }
Комментариев нет:
Отправить комментарий