来自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 Singleton
和private
上的Singleton()
是否相互冗余?
它们中只有一个是否足够?
感谢。
答案 0 :(得分:3)
一般来说,这两个关键词彼此之间不是多余的"。也就是说,它们有不同的效果。
将Singleton
声明为final
意味着它不能被分类。将其构造函数声明为private
意味着它不能被其他人实例化。后者通常是强制执行Singleton模式所需的。
但是,正如OP在我的答案初稿的注释中指出的那样,将构造函数声明为private
确实会阻止在此实例中对进行子类化。这是因为子类没有其他构造函数可用。因此,在这种情况下,将类声明为final
是不必要的。但是,如果有另一个构造函数声明为protected
,则可以创建一个子类。