gpt4 book ai didi

oop - 单例子类

转载 作者:行者123 更新时间:2023-12-02 22:30:39 24 4
gpt4 key购买 nike

我有一个抽象基类和一个实现类,例如:

public abstract class Base
{
public Base getInstance( Class<? extends Base> clazz )
{
//expected to return a singleton instance of clazz's class
}

public abstract absMeth();
}

public A extends Base
{
//expected to be a singleton
}

在这个例子中,我可以让 A 成为一个单例,甚至可以在 Base 中编写 getInstance 来为每次调用返回一个 A 的单例对象,这样做是这样的:

public abstract class Base
{
public Base getInstance( Class<? extends Base> clazz )
{
try
{
return clazz.getDeclaredMethod("getInstance").invoke(null,null);
}
}

public abstract void absMeth();
}

public A extends Base
{
private static A inst;

private A(){}

public static A getInstance( )
{
if( inst!= null)
inst = new A();
return inst;
}

public void absMeth(){
//...
}
}

但我担心的是,如果有人编写另一个类 class B extends Base,它也应该是一个单例并且它必须实现一个名为 getInstance 的静态方法吗?

换句话说,我需要将此作为使用 Base 类扩展的所有类的规范来执行。

最佳答案

你不能相信扩展你的类来创建它们自己的单个实例1:即使你能以某种方式确保它们都实现了 getInstance , 没有办法告诉他们在该方法中检查 inst在构建自己的新实例之前。

保持对过程的控制:创建一个 Map<Class,Base> , 并实例化通过反射传入的类2。现在你的代码可以决定是否创建一个实例,而不依赖于 getInstance一个子类。


1 一句流行的谚语说,“如果你想把工作做好,就自己动手吧。”

2 这是一个 link描述基于 setAccessible(true) 的解决方案

关于oop - 单例子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12318901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com