0

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

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

4 回答 4

2

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

于 2012-06-08T18:28:51.527 回答
1

请看这个,

当你这样做时:

private static Singleton instance = new Singleton();

IE。在上面的代码中声明期间初始化对象。

那么,就不需要在 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来实现单例模式,Please refer HEAD FIRST DESIGN PATTERN

于 2012-06-08T18:31:30.153 回答
1

当您创建一个单例时,您会尽一切努力强制执行该模式。这意味着,不应该有任何方法来创建单例类的第二个实例。

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

显然,除非你真的想要这样,否则这不可能发生,但是,如果你想让你的单例防弹,如果你声明它是最终的,你可能会尽一切可能防止模式被打破。

于 2012-06-08T18:34:11.197 回答
0

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

于 2012-06-08T18:26:16.003 回答