单例与Java中具有静态成员和方法的类[重复]

Posted

技术标签:

【中文标题】单例与Java中具有静态成员和方法的类[重复]【英文标题】:Singleton v/s class with static members & methods in Java [duplicate] 【发布时间】:2012-09-28 00:28:32 【问题描述】:

可能重复:Difference between static class and singleton pattern?

为什么需要一个且只有一个实例?使用具有静态成员变量和静态方法的类也可以达到同样的目的。

据我所知,可能有两种可能的答案 -

    当你的类需要有状态并且你只想要它的一个对象时。从设计的角度来看,具有静态方法和变量的类被认为是实用程序类,不应保持任何状态。

    如果您的类需要参与多态性,并且您只需要继承树中的类的一个对象。

如果有人可以提供一个来自现实生活场景或任何 Java API 的示例(其中单例对象需要参与多态/继承),那将非常有帮助?

【问题讨论】:

与数据库的连接是单例最常见的例子之一。您需要一个连接。 【参考方案1】:

Collections.emptySet() 是不能作为静态类实现的单例的典型示例,因为很明显,它的目标是成为java.util.Set 接口的实例。创建成本不高,但每次需要空集时都创建一个新实例是愚蠢的,因为可以重复使用唯一的实例。

【讨论】:

【参考方案2】:

执行日志记录或对数据库进行公共访问的类经常遵循单例模式。基本上任何应该有实例方法并且构建成本很高的东西。

【讨论】:

【参考方案3】:

范围和行为是不同的关注点,不应混为一谈。您可能希望您的对象在每次使用、每个线程、每个 Web 请求、每个会话或全局(单例)时都可用。进行这些调整的原因可能是由于资源管理和最终的性能。如果你改变它的范围,你的类内部的行为不应该改变。

Singleton 是一种用于获取常规对象并通过一些附加代码控制其范围的模式。但理想情况下,您真的不应该真正处理对象内部的范围并将其委托给工厂或容器。

【讨论】:

【参考方案4】:

我的回答很短,但使用完全常见的单例而不是静态实现就足够了。答案是:

流行范式(是的!) 线程(同步等) 接口实现(你的静态类有一些限制)

【讨论】:

以上是关于单例与Java中具有静态成员和方法的类[重复]的主要内容,如果未能解决你的问题,请参考以下文章

单例类与具有静态成员的类

Swift单例与静态属性/方法

Java中的单例模式和静态类有啥区别? [复制]

单例类与静态方法和字段? [复制]

Scala基础

工作和面试中的单例