避免在java中实例化一个类

jai*_*jai 19 java class instantiation

最近我遇到了一个问题:如何避免实例化Java类?

但是,我回答说:

  1. 如果您不想实例化类,请使用"abstract"修饰符.例如:javax.servlet.HttpServlet被声明为抽象(尽管它的方法都不是抽象的)以避免实例化.

  2. 声明一个无参数的私有构造函数.

现在我的问题是a)还有其他方法吗?b)为什么任何人都不想实例化一个类?-在SO搜索后,我从知道这个那个的Util类可以做出不实例化.我们不想在OOP中实例化一个类的任何其他地方?

cle*_*tus 28

有四个原因让人想起:

  1. 允许子类但不允许实例化父类;
  2. 禁止直接实例化,而是提供工厂方法返回,并在必要时创建实例;
  3. 因为所有实例都是预定义的(例如适用于卡片组),但是从Java 5开始,建议使用类型安全的枚举; 和
  4. 这堂课真的不是班级.它只是静态常量和/或方法的持有者.

作为(2)的示例,您可能想要创建规范对象.例如,RGB颜色组合.您不想创建任何RGB组合的多个实例,因此您执行此操作:

public class MyColor {
  private final int red, green, blue;

  private MyColor(int red, int green, int blue) {
    this.red = red;
    this.green = green;
    this.blue = blue;
  }

  public static MyColor getInstance(int red, int green, int blue) {
    // if combo already exists, return it, otherwise create new instance
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:不需要no-arg构造函数,因为显式定义了另一个构造函数.


小智 11

不是你的问题的答案,而只是一个注释:

当您创建一个私有的无参数构造函数来阻止实用程序类的实例化时,您应该让构造函数抛出异常(例如UnsupportedOperationException).这是因为您可以通过反射实际访问私有成员(包括构造函数).请注意,如果这样做,则应附带注释,因为定义构造函数以防止实例化类有点违反直觉.

使实用程序类抽象不是一个好主意,因为它使类看起来像是要扩展,而且你可以扩展类,从而实例化它.