java - Java 中的分层单例可能吗?

标签 java inheritance singleton

我一直在考虑一个有趣的想法(不知道我是否会将它包含在任何代码中,但想想它很有趣)

假设我们有一个程序需要大量的类,所有类都是某个子类。这些类都需要是单例的。现在,我们可以为这些类中的每一个编写单例模式,但一遍又一遍地编写相同的代码似乎很浪费,而且我们已经有了一个公共(public)基类。创建一个 A 的 getSingleton 方法真的很好,当从子类调用时,返回 B 类的单例(为简单起见转换为 A 类)

class A{
     public A getSingleton(){
         //Wizardry
     }
}
class B extends A{
}

A blargh = B.getSingleton()
A gish = B.getSingleton()
if(A == B)
    System.out.println("It works!")

在我看来,这样做的方法是识别并调用 B 的默认构造函数(假设我们不需要传递任何东西。)我知道一点 Java 中反射的黑魔法,但我我不确定这是否可以完成。

有人对此感兴趣吗?

最佳答案

从技术上讲,我认为没有理由不能完成与此类似的事情。你的确切方案将不起作用,因为你的 getSingletonstatic (即使你没有这样声明它)所以它无法告诉它正在调用哪个类。将其更改为 static A getSingleton(Class cls),它可能可行。

但是,与在每个派生类中使用单行代码 getSingleton 相比,这真的有那么大的胜利吗?

对于初学者来说,您的 getSingleton 返回 A,因此如果有人为 B 调用它,他们会返回一个 A 并且必须向下转换才能将其用作 B

此外,该方案并不完全透明。

当然,考虑起来很有趣,但在任何生产系统中执行此操作之前,我会寻找更有说服力的理由。

关于java - Java 中的分层单例可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4546927/

相关文章:

java - SimpleDateFormat 忽略时区

java - tomcat日志请求参数

Java wait/notify 不在线程中调用

java - 如何在 JPA/Hibernate 中按聚合列排序?

java - Maven 添加特定 java 包的依赖

css - 将 'body'字体应用到 'p'(段落)的所有浏览器,Internet Explorer除外

c++ - dynamic_cast "this"到派生类型 : when is it legal?

c++ - 简单 C++ 组合与继承示例的请求

c++ - 使用 libcurl 的线程安全代理

Scala 最佳实践 : Trait Inheritance vs Enumeration