在问题What is an efficient way to implement a singleton pattern in Java?中,最热门投票的答案是,使用Enum来实现单身人士。
这很好,我理解这些论点,分别是语言优势。
然而,我有一组我定义单例但需要扩展其他类的类,这对于枚举方法是不可能的,因为枚举不能继承。
约书亚布洛赫在他的幻灯片中说:
- 但缺少一件事 - 你无法扩展枚举类型
- 在大多数情况下,你不应该
- 一个引人注目的用例 - 操作代码
在大多数情况下,您不应该:有人可以详细说明吗?我已经实现了几个servlet并扩展了HttpServlet
,为什么这些不应该是单身?我只想在我的应用程序中使用它们的一个实例。
答案 0 :(得分:7)
Singleton类可以扩展其他类;实际上默认情况下在Java中它无论如何都会扩展Object。然而,Josh指的是你不应该扩展Singleton类,因为一旦你扩展它,就会有超过1个实例。
回答评论:
实际上,实现Singleton的最佳方法是:
来自Effective 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() { ... }
}
这里猫王可以扩展任何其他类。
答案 1 :(得分:3)
您不应该关心servlet的实际实例 - 生命周期管理由servlet容器根据您同意的Servlet规范契约来处理。如果将服务器端功能的一部分实现为单例是有意义的,那么继续以您喜欢的方式执行此操作并从servlet中使用它。
答案 2 :(得分:1)
Josh指的是扩展枚举类型,而不是让单例类型扩展别的东西。