#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. Конструкторы класса не должны вызывать переопределяемые методы, непосредственно или опосредованно. Нарушение этого правила может привести к аварийному завершению программы. Конструктор суперкласса выполняется прежде конструктора подкласса, а потому переопределяющий метод в подклассе будет вызываться перед запуском конструктора этого подкласса. И если переопределенный метод зависит от инициализации, которую осуществляет конструктор подкласса, то этот метод будет работать совсем не так, как ожидалось
Комментариев нет:
Отправить комментарий