10

在问题中,什么是在 Java 中实现单例模式的有效方法?投票最多的答案是,使用枚举来实现单例。

很好,我理解这些论点,分别是语言优势。

但是,我有一组定义单例但需要扩展其他类的类,这对于 enum 方法是不可能的,因为 enums 不能 subclass

Joshua Bloch 在他的幻灯片中说:

  • 但是缺少一件事——你不能扩展枚举类型
    • 在大多数情况下,您不应该
    • 一个引人注目的用例——操作代码

在大多数情况下,您不应该:有人可以详细说明吗?我已经实现了几个 servlet 并且它们扩展了HttpServlet,为什么这些不应该是单例?我的应用程序中只需要它们的一个实例。

4

3 回答 3

7

一个 Singleton 类可以扩展其他类;实际上默认情况下在 Java 中它无论如何都会扩展 Object. 然而 Josh 指的是你不应该扩展一个 Singleton 类,因为一旦你扩展它,就会出现超过 1 个实例。

回复评论:

实际上,实现 Singleton 的最佳方法是:

从有效的Java

// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}

在这里,Elvis 可以扩展任何其他类。

于 2012-07-12T13:45:22.910 回答
3

您不应该关心 servlet 的实际实例 - 生命周期管理由 servlet 容器根据您同意的 Servlet 规范合同处理。如果将部分服务器端功能实现为单例是有意义的,那么请继续按照您喜欢的方式执行此操作,并从您的 servlet 中使用它。

于 2012-07-12T13:44:52.950 回答
1

Josh 指的是扩展枚举类型,而不是让单例类型扩展其他东西。

于 2012-07-12T13:40:23.733 回答