Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Java. Конструктор, который использует сеттер - когда это нужно?

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

Комментариев нет:

Отправить комментарий