关于java:正确的单身设计?

Proper singleton design?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Efficient way to implement singleton pattern in Java

我有一个单例类,它作为我的应用程序的状态保护程序。例如,如果我有一个视图有一些数据,我只需将数据打包到一个保存的状态可序列化对象中,然后将其传递给我的singleton,以便稍后进行检索。这一切看起来都很自然和恰当,但我已经偏离了wiki上的单例。在拥有一个get-instance方法的集成中,该方法允许我检索实例并通过实例调用方法,相反,我只是将每个方法都设置为static并静态地使用类。

这是不好的形式吗?有表演损失吗?

谢谢你给我小费~aedon


是的,它被认为是不好的形式。

Java中的静态类有许多问题使得它们难以使用。例如,您不能实现接口。此外,如果您需要使它再次成为常规的单例(或者需要使它成为非单例,这种情况经常发生),则必须重写与之交互的每一行代码。


如果静态使用满足您的需求,我看不出其中有什么坏处。

唯一的缺点是灵活性稍差。如果将其设计为实际的单例,那么可以有一个用于管理状态的接口,并为特定情况实例化特定的实现。然后可以将此对象作为参数传递到应用程序中。

使用一个严格的静态类,没有要传递的对象,因此您必须使用传递类对象并通过该接口访问函数。

当然,所有这些只有在有任何可能扩展到当前类的合理能力之外时才重要。


是的,只使用静态方法和变量不是面向对象的方法。单身通常被认为是一种坏习惯。不过,我承认有时候它们很有用。下面是一个简单的例子,说明如何创建一个有效的、功能性强的单例类。注意还有其他的方法,但这是最常见的方法之一…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Singleton {
   private static final Singleton uniqueInstance;

   public static synchronized Singleton getInstance() {
     if (Singleton.uniqueInstance == null) {
       Singleton.uniqueInstance = new Singleton();
     }
     return Singleton.uniqueInstance;
   }

   //other methods go here...

   @Override
   protected Singleton clone() throws CloneNotSupportedException() {
     throw new CloneNotSupporedException("cloning of singleton is not supported");
   }

   //hide constructor for others to see
   private Singleton() {
   }
}

喝彩,P


添加到@boris'注释中,如果您只需要一个实用程序类,那么使用枚举更简单

1
2
3
4
public enum Utility {
    ; // no instances
    public static Object myStaticMethod(Object ... args) { }
}

如果您有一个要实现的接口,那么这一个单例就有意义了。注意,可以使用枚举创建多个单例

1
2
3
4
5
6
7
8
public enum Callables implements Callable<String> {
    HELLO {
         public String call() { return"Hello"; }
    },
    WORLD {
         public String call() { return"World"; }
    }
}

注意:Hello和World共享一个超类可调用文件,但实际上有不同的类。


它被认为是不好的形式,因为它不是面向对象的样式。很多人认为单身汉的身体状况很差。坦率地说,这对你想做的事情是很好的。除非你要把这个呈交审查或评估,否则我就不提了。

作为静态类,性能可能会更好。


使用枚举而不是singleton。这是最安全的方法。