`singleton`上的`final`和`Singleton()`上的`private`是彼此冗余的吗?

时间:2017-09-29 01:27:14

标签: java design-patterns singleton

来自https://en.wikipedia.org/wiki/Singleton_pattern#Implementation

  

单例模式的实现必须:

     
      
  • 确保只存在单例类的一个实例;和
  •   
  • 提供对该实例的全局访问权。
  •   
     

通常,这可以通过以下方式完成:

     
      
  • 声明该类的所有构造函数都是私有的;和
  •   
  • 提供一个返回对实例的引用的静态方法。
  •   
     

实例通常存储为私有静态变量;该   在某个时刻初始化变量时会创建实例   在第一次调用静态方法之前。以下是一个示例   用Java编写的实现。

public final class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

final上的class Singletonprivate上的Singleton()是否相互冗余?

它们中只有一个是否足够?

感谢。

1 个答案:

答案 0 :(得分:3)

一般来说,这两个关键词彼此之间不是多余的"。也就是说,它们有不同的效果。

Singleton声明为final意味着它不能被分类。将其构造函数声明为private意味着它不能被其他人实例化。后者通常是强制执行Singleton模式所需的。

但是,正如OP在我的答案初稿的注释中指出的那样,将构造函数声明为private确实会阻止在此实例中对进行子类化。这是因为子类没有其他构造函数可用。因此,在这种情况下,将类声明为final是不必要的。但是,如果有另一个构造函数声明为protected,则可以创建一个子类。