创建类的受保护构造函数有什么好处和缺点

时间:2011-12-23 18:10:59

标签: java constructor protected

我有一个愚蠢的怀疑,但我想听听一些有关它的意见。

我有一个超类(MySuperClass),然后,我有70个类继承自这个超类(Bean类)。

这个超类的目的是使用反射实现“toString”方法,这样,我确保所有这70个类都有toString方法。这70个类是bean,最终目的是记录类信息,而不仅仅是类的实例。

然而,这不是我想要讨论的内容,我想听到你的意思是你有什么想法为超类提供受保护的构造函数,有这个的好处和缺点,而不仅仅是针对这个特例但是对于你能想象的其他情况或场景。

此致

费尔

3 个答案:

答案 0 :(得分:6)

如果你的目标是确保MySuperClass永远不会通过new MySuperClass()直接实例化,只有它的子类,那么声明类abstract更有意义;见http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html。这真的是抽象类的重点。然后构造函数可以是publicprotected,这并不重要。

- protected类中包含所有构造函数abstract的原因是,如果打算实例化类本身,使用new MySuperClass(),但只希望它由子类及其包的其他成员(例如“工厂”对象)实例化。但这听起来并不像你想做的那样。

答案 1 :(得分:1)

如果您只想使用返回此类型实例的静态方法创建一个实例,则可以使构造函数受到保护。当对象很重并且创建许多实例会影响内存时,有利于内存分配

public class A{
   private static A instance = null;
   protected A() {
      // Exists only to defeat instantiation.
   }
   public static A getInstance() {
      if(instance == null) {
         instance = new A();
      }
      return instance;
   }
}

答案 2 :(得分:1)

受保护的构造函数有一个在抽象类中不可用的有用特征:同一个包中的类,子类和类本身中的静态方法可以创建类的实例,而外人则不能。无论构造函数的可访问性如何,都无法实例化抽象类。

话虽如此,我宁愿让这个班级抽象。受保护的构造函数不能阻止子类或同一包中的任何类来说BaseClass x = new BaseClass();。受保护的构造函数对我说“代码可能在某个地方实例化这个类”,并给了我另一件必须跟踪的东西。