2013-02-15 93 views
2

这个单身设计模式是否正确?我的意思是,当它是静态的并且方法被同步时,检查对象的需求是否为null。这个单身设计模式是否正确?

public class MySingleton { 

    int val = 10; 
    private static final MySingleton singleton = new MySingleton(); 

    private MySingleton() { } 

    public static synchronized MySingleton getSingleton() { 
     return singleton; 
    } 
} 

回答

8

您不需要使您的方法同步。变量在静态初始化器中被初始化的事实就足够了。此外,您val变量应该几乎可以肯定是私有的......

双重检查锁定模式(与无效检查)通常被用来当你要同步的方法,你想要一个静态初始化器。 (在我看来,它在几乎所有情况下不必要的复杂和脆弱。)

另一种选择是使用一个枚举:

public enum MySingleton { 
    INSTANCE; 

    private int val = 10; 

    // Presumably something to use val 
} 

使用枚举强制执行单的烦躁,甚至在得到它的权利序列化的脸。它也没有实际的代码做的一个非常简单的方法:)。另一方面,它从来没有感觉到完全我的权利......

+0

关于synchronized关键字,我还有一个疑问,是静态的变量或方法的线程安全的我用Google搜索了一下,我的第一印象,他们都没有,大公的 – 2013-02-15 09:02:30

+2

@Praveen Kumar,通过调用方法getSingleton(),创建单例对象。由于它已经创建,所以不需要同步。 – Jagannath 2013-02-15 09:18:18

2

最好的模式是一个在他的著作有效约书亚布洛赫给出Java中使用枚举:

public enum MySingleton { 
    INSTANCE; 

    public void doSomething() { 

    } 
} 

竞标书:

“这种方法在功能上等同于公共领域的做法,但它更简洁,免费提供系列化机械,其提供的对于多重实例化,即使面对复杂的情况,铁证保证完美的序列化或反射攻击。虽然这种方法尚未被广泛采用,但单元枚举类型是实现单例的最佳方式。“

+0

你好,我的答案不提供。 bute much,因为你不说*为什么*这种模式是“最好的”。为了改善你的答案,你可以写一些关于它的优点和缺点,以及为什么优于OPs方法。 – Philipp 2013-02-15 08:37:07

+0

我编辑了我的答案 – overmeulen 2013-02-15 08:43:40

2

你可以这样做,但在很多情况下,你可以使用”懒惰评估“ - 你创建实例是要求在第一时间:

public class MySingleton { 

    private static MySingleton singleton = null 

    private MySingleton() { } 

    public static synchronized MySingleton getSingleton() { 
     if (singleton == null) { 
      singleton = new MySingleton(); 
     } 
     return singleton; 
    } 
} 
+2

值得注意的是,除非您有其他静态方法,您希望能够在不创建实例的情况下运行,否则只需使用静态初始化程序就可以了 - 在第一次使用该类之前,它仍然很懒。 – 2013-02-15 08:35:28