Использование методов setter в конструкторе: плохая практика?

Я часто вижу конструкторы вроде этого

public class A {

   private int b;

   public A(int b) {
      setB(b);
   }

   public void setB(int b) {
      this.b = b;
   }
}

Это хорошая идея? Должен ли я использовать методы setter в конструкторе? Разве это не проблема, если я переопределяю конструктор или методы setter в подклассе?

Ответы

Ответ 1

Это, вероятно, хорошая не. Если вы не сделаете этот класс окончательным и не сделаете метод setName (...) частным или окончательным, кто-то другой сможет расширить ваш класс и переопределить метод setName (...). Ваш конструктор (в вашем базовом классе) вызовет этот метод в расширяющемся классе вместо вашей реализации. Никто не знает, что может сделать этот метод. Как правило: конструктор не должен вызывать методы, которые можно переопределить.

Ответ 2

Я думаю, вы должны тщательно выбирать и знать о недостатках каждого из них.

Если класс, который вы определяете, скорее всего, будет подклассифицирован, тогда будьте особенно осторожны, чтобы избежать неинициализации в то время, когда подкласс нуждается в вас.

Это может быть полезным механизмом, но это, на мой взгляд, неприятно.

public class A {

   private int b;

   public A(int b) {
      _setB(b);
   }

   private void _setB(int b) {
      this.b = b;
   }

   public void setB(int b) {
      _setB(b);
   }
}

Я лично предпочел бы что-то вроде этого:

public class A {

   private int b;

   public A(int b) {
      this.b = b;
   }

   public void setB(int b) {
      this.b = b;
   }
}