避免初始化在Java类(Avoid instantiating a class in java)

2019-07-03 14:50发布

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

不过,我回答说:

  1. 如果你不希望实例化一个类,用“抽象”修饰符。 例如:javax.servlet.HttpServlet,被声明为抽象的(虽然没有它的方法是抽象的),以避免实例化。

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

现在我的问题是:a)是否有其他方法吗? b)为何没有任何一个不想实例化一个类? -在SO搜索后,我从知道这个那个的Util类可以做出不实例化。 任何其他地方,我们不希望实例化OOP一类?

Answer 1:

理由四映入脑海:

  1. 为了让子类,但不能被实例化父;
  2. 要禁止直接实例化,而是提供一个工厂方法返回,并在必要时创建实例;
  3. 因为所有的实例是预定义的(例如在适合的一副牌)虽然自爪哇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
  }
}

注:没有无参数的构造是必需的,因为另一个构造函数被明确定义。



Answer 2:

不是一个真正的回答你的问题,但只是一张纸条:

当你的私人无参数的构造,以防止你的实用工具类的实例,你应该有构造函数抛出一个异常(如UnsupportedOperationException异常)。 这是因为你实际上可以通过反射访问私有成员(包括构造函数)。 请注意,如果你这样做,你应该有一个评论陪它,因为它是一个有点反直觉,你定义构造函数,以防止类被初始化。

使实用工具类抽象是不是一个好主意,因为它使阶级看上去像是打算延长,而且可以扩展类,从而实例化。



Answer 3:

有时你只是想避免别人实例化你的对象,才能拥有对所有现有的情况下完全控制。 一个例子是单例模式 。



Answer 4:

我认为最常见的原因是不想实例化一个类是当你正在处理一个静态类,因此,其静态方法。 你不希望有人尝试实例化类。 同样,当你正在处理厂类或在某些情况下,许多单班会隐藏自己的构造函数,以不正常的方式进行实例化。



Answer 5:

另一种方法,使一类非实例将其声明为private内部类,然后不提供任何方法来实例化它周围的类。 但是,这是(IMO)很没有意义的。

你想一类是不可实例化的,如果它是没有意义的实例化。 你通常做,如果这个类是真的只是一个(静态)辅助方法集合,或者类为“未完成”。 不完备可能是语法上明显的(即抽象方法),但还有其他种类的不完整的。 例如,你可能会为所有方法提供默认的默认实现,并且需要一个或更多的人被覆盖该类做一些有用的东西。

另一个原因,使一类非实例化(或者至少,不能直接实例化)是,如果你的应用需要控制的实例。 例如,java.util.regex.Pattern中的类不能被直接实例化,以便JRE可以(可能)保持预编译的正则表达式的缓存。



文章来源: Avoid instantiating a class in java