我一直在玩一个有趣的主意(不知道是否将其包含在任何代码中,但是考虑到这很有趣)

假设我们有一个程序,该程序需要大量的类,而所有这些类都是某个子类。这些类都必须是单例。现在,我们可以为每个这些类编写单例模式,但是一遍又一遍地编写相同的代码似乎很浪费,而且我们已经有了一个通用的基类。创建一个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

另外,该方案也不是完全透明的。

当然,这很有趣,但是在任何生产系统中进行此操作之前,我都会考虑更多令人信服的原因。

09-05 13:34