#java #конструктор #setter
Встретил такую конструкцию в обучающем примере. public class Vehicle { private String color; //Constructor Vehicle(String c) { this.setColor(c); } // Setter public void setColor(String c) { this.color = c; } } Насколько я понимаю, сеттер используют чтобы задать значение приватной переменной, на что способен и конструктор. Зачем использовать конструктор, который использует сеттер, который присвоит значение переменной, если можно обойтись конструктором? Бывают случаи когда это необходимо, или это просто теоритический пример что так можно?
Ответы
Ответ 1
Сеттер не всегда просто присваивает значение переменной, чаще всего он ещё выполняет какие-то действия(нормализует данные, например), поэтому чтобы не дублировать код из сеттера в конструкторе - можно просто вызывать сеттер из конструктора.Ответ 2
Плохой обучающий пример. Я бы не рекомендовал использовать сеттеры внутри конструктора, особенно если сеттер простой. Если сеттер содержит много всего, то в этом случае лучше пересмотреть структуру класса, быть может, будет лучше использовать Билдер паттерн для создания экземпляра класса. Главная проблема с сеттерами внутри конструктора (а точнее, с сеттерами, которые могут быть переопределены) это то, что они могут создать кучу проблем, если метод будет переопределен. Цитата из книги JAVA:Эффективное программирование. 2е издание, Джошуа Блох. Статья 17. Конструкторы класса не должны вызывать переопределяемые методы, непосредственно или опосредованно. Нарушение этого правила может привести к аварийному завершению программы. Конструктор суперкласса выполняется прежде конструктора подкласса, а потому переопределяющий метод в подклассе будет вызываться перед запуском конструктора этого подкласса. И если переопределенный метод зависит от инициализации, которую осуществляет конструктор подкласса, то этот метод будет работать совсем не так, как ожидалось
Комментариев нет:
Отправить комментарий