处理必须子类化的单身人士

时间:2012-07-12 13:33:02

标签: java servlets enums singleton

在问题What is an efficient way to implement a singleton pattern in Java?中,最热门投票的答案是,使用Enum来实现单身人士。

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

然而,我有一组我定义单例但需要扩展其他类的类,这对于枚举方法是不可能的,因为枚举不能继承

约书亚布洛赫在他的幻灯片中说:

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

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

3 个答案:

答案 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指的是扩展枚举类型,而不是让单例类型扩展别的东西。