实现Java Singleton设计模式

时间:2012-06-08 18:21:39

标签: java

让下面的类最终(添加公共 final 类)对这个实现单例模式的类有什么实际影响吗?

package org.kodejava.example.pattern.factory;

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        return instance;
    }

    public void doSomething() {
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("Clone is not allowed.");
    }
}

4 个答案:

答案 0 :(得分:2)

不,不是真的。由于构造函数是私有的,所以无论如何它都不能被子类化。它只是使事实更明确,这就是为什么我个人使用final

答案 1 :(得分:1)

请看这个,

执行此操作时:

private static Singleton instance = new Singleton();

即。在上述代码中声明期间初始化对象。

然后,没有必要在getInstance()方法上使用synchronized,别担心。仍然是单身实施100%保证。

这样做:

 public static Singleton getInstance() {
        return instance;
    }

Final keyword will just make sure that the class can Not be extended ..就是这样...... It Will Not effect the singleton pattern.

您也可以使用Double Check Locking来实现Singleton Pattern,Please refer HEAD FIRST DESIGN PATTERN

答案 2 :(得分:1)

创建单例时,您一定要尝试强制执行该模式。这意味着,应该没有任何方法来创建单例类的第二个实例。

通过声明私有构造函数,您确保没有其他顶级类可以扩展您的Singleton类,但是内部类或静态内部类可以扩展它并破坏您的单例,因为内部类可以访问其封闭类的私有成员。

显然,除非你真的想要它,否则这种情况不可能发生,但是,如果你想让你的单身子弹证明,如果你宣布它是最终的,你可以通过各种可能的方式防止这种模式坏了。

答案 3 :(得分:0)

没有。类已经是单例模式。最终修饰符使得类不可派生,但由于它具有私有构造函数,因此它已经是不可派生的。

相关问题