静态类和单例模式之间存在什么实际的区别?

两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?


当前回答

单例只是一个被实例化的普通类,但仅从客户端代码间接实例化一次。静态类未实例化。据我所知,静态方法(静态类必须有静态方法)比非静态方法更快。

编辑:FxCop性能规则描述:“不访问实例数据或调用实例方法的方法可以标记为静态(在VB中共享)在这样做之后,编译器将向这些成员发出非虚拟调用点,这将防止在运行时对确保当前对象指针为非空的每个调用进行检查。这可以为性能敏感的代码带来可衡量的性能增益。在某些情况下,无法访问当前对象实例表示正确性问题。"我不知道这是否也适用于静态类中的静态方法。

其他回答

Singleton的被实例化。只是只有一个实例被创建过,因此在Singleton中只有一个。

另一方面,静态类无法实例化。

与静态类相比,Singleton模式有几个优点。首先,单例可以扩展类和实现接口,而静态类不能(它可以扩展类,但不继承它们的实例成员)。单例可以延迟或异步初始化,而静态类通常在首次加载时初始化,这会导致潜在的类加载器问题。然而,最重要的优点是,可以在不强迫用户假设只有一个实例的情况下以多态的方式处理单态。

Singleton类在应用程序生命周期期间提供一个对象(仅一个实例),例如java.lang.Runtime而静态类只提供静态方法,如java.lang.MathJava中的静态方法不能被重写,但Singleton类中定义的方法可以通过扩展来重写。Singleton类能够继承和多态性来扩展基类、实现接口并能够提供不同的实现。而不是静态的。

例如:java.lang.Runtime是java中的Singleton类,调用getRuntime()方法返回与当前java应用程序关联的运行时对象,但确保每个JVM只有一个实例。

静态类通常用于库,如果我只需要特定类的一个实例,则使用单实例。但是,从内存的角度来看,存在一些差异:通常在堆中只分配对象,分配的唯一方法是当前正在运行的方法。静态类的所有方法都是静态的,从一开始就在堆中,所以通常静态类会消耗更多的内存。

与静态类的区别

JDK有单例和静态的例子,一方面java.lang.Math是带有静态方法的最终类,另一方面java.lang.Runtime是单例类。

单例的优点

如果您需要维护状态,那么单例模式比静态类更好,因为在静态类中维护状态会导致错误,特别是在并发环境中,如果没有多个线程进行适当的同步并行修改,则可能会导致竞争条件。如果Singleton类是一个沉重的对象,那么它可以被延迟加载,但静态类没有这样的优势,总是急切地加载。使用singleton,您可以使用继承和多态性来扩展基类、实现接口并提供不同的实现。由于Java中的静态方法不能被重写,它们会导致灵活性。另一方面,您可以通过扩展singleton类来重写它中定义的方法。

静态类的缺点

为单例编写单元测试比静态类更容易,因为只要需要单例,就可以传递模拟对象。

静态类的优点

静态类提供了比单例更好的性能,因为静态方法是在编译时绑定的。

单例模式有几种实现方式,每种实现方式都有优缺点。

Eager加载单例双重检查锁定单例按需初始化持有者习惯用法基于枚举的单例

详细描述每一个都太冗长了,所以我只需要链接到一篇好文章-你想知道的关于Singleton的所有信息