Использование методов 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;
}
}