避免在java中实例化类

避免在java中实例化类,java,class,instantiation,Java,Class,Instantiation,最近我遇到了一个问题:如何避免实例化Java类 然而,我的回答是: 如果不想实例化类,请使用“抽象”修饰符。Ex:javax.servlet.HttpServlet被声明为抽象(尽管它的任何方法都不是抽象的),以避免实例化 声明一个无参数私有构造函数 现在我的问题是 a) 还有别的办法吗? b) 为什么任何人都不想实例化一个类在SO中搜索之后,我从中了解到可以使Util类不实例化。我们不想在OOP中实例化类的任何其他地方?我认为不想实例化类的最常见原因是在处理静态类时,因此也就是在处理其静态方法

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

然而,我的回答是:

  • 如果不想实例化类,请使用“抽象”修饰符。Ex:javax.servlet.HttpServlet被声明为抽象(尽管它的任何方法都不是抽象的),以避免实例化

  • 声明一个无参数私有构造函数

  • 现在我的问题是 a) 还有别的办法吗?
    b) 为什么任何人都不想实例化一个类在SO中搜索之后,我从中了解到可以使Util类不实例化。我们不想在OOP中实例化类的任何其他地方?

    我认为不想实例化类的最常见原因是在处理静态类时,因此也就是在处理其静态方法时。您不希望有人尝试实例化该类。同样,当您处理工厂类时,或者在某些情况下,许多单例类将隐藏其构造函数,以免以正常方式实例化

    我想到了四个原因:

  • 允许实例化子类,但不允许实例化父类
  • 不允许直接实例化,而是提供一个工厂方法返回实例,必要时创建实例
  • 因为所有的实例都是预定义的(例如适合一副卡片),尽管从Java5开始,建议使用类型安全枚举;及
  • 这门课真的不是一门课。它只是静态常量和/或方法的持有者
  • 作为(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
      }
    }
    

    注意:不需要参数构造函数,因为另一个构造函数是显式定义的。

    有时,为了完全控制所有现有实例,您只想避免其他人实例化您的对象。一个例子是。

    使类不可实例化的另一种方法是将其声明为私有内部类,然后不提供在周围类中实例化它的任何方法。但这(依我看)毫无意义

    如果实例化一个类没有意义,那么您希望它是不可实例化的。如果类实际上只是(静态)帮助器方法的集合,或者如果类是“不完整”的,通常会这样做。不完整性可能在句法上是明显的(即抽象方法),但也存在其他类型的不完整性。例如,您可能为所有方法提供默认实现,并要求重写其中一个或多个,以便类执行有用的操作


    使类不可实例化(或至少不可直接实例化)的另一个原因是应用程序需要控制实例化。例如,java.util.regex.Pattern类不能直接实例化,因此JRE可以维护预编译正则表达式的缓存

    不是你问题的答案,只是一个提示:

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

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