在构造函数中使用setter方法:不好的做法?

时间:2011-12-14 08:58:28

标签: java

我经常看到像这样的构造函数

public class A {

   private int b;

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

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

这是个好主意吗?我应该在构造函数中使用setter方法吗?如果我要覆盖子类中的构造函数或setter方法,那么这不是问题吗?

2 个答案:

答案 0 :(得分:29)

这可能是一个好主意。如果你没有让那个类成为final,并且不使setName(...)方法成为私有或最终的,那么其他人就可以扩展你的类并覆盖setName(...)方法。您的构造函数(在您的基类中)将在扩展类而不是您的实现中调用该方法。没有人知道该方法可以做什么。根据经验:构造函数不应该调用可以覆盖的方法。

答案 1 :(得分: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;
   }
}