繁体   English   中英

实施Java Singleton设计模式

[英]Implementing the Java Singleton Design Pattern

使下面的类最终(添加公共最终类)对实现单例模式的此类类有任何实际影响吗?

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.");
    }
}

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

请看这个

执行此操作时:

private static Singleton instance = new Singleton();

即。 在上面的代码中的声明过程中初始化对象。

然后,无需在getInstance()方法上使用同步,请放心。 仍然以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

创建单例时,请务必尝试执行该模式。 这意味着,应该没有任何办法来创建单例类的第二个实例。

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

显然,除非您确实希望这样做,否则这不会发生,但是,再次,如果您想使单例子弹证明,如果您声明它是最终的,则可以通过所有可能的方式防止该模式被破坏。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM