我有一个应用程序,代码有点像这样编写
public Interface SuperCLass{
//....to do some methods
}
public class BaseClass1 implements SuperCLass{
//....to do some methods
}
public class BaseClass2 implements SuperCLass{
//....to do some methods
}
现在在我的应用程序中,只有一个对象可以实例化为SuperClass引用,即同步单例。
现在,我可以加入
public static synchronized SuperCLass getInstance(){
//initialise
}
在任何基类中,但是我不能在SuperClass接口中包含这个声明,因为我无法使用超类的引用来获取基类的实例。 例如 我想这样做(这是一个非常模糊的例子)
BaseClass1 bc1 = BaseClass1.getInstance();
SuperClass sc = bc1.getInstance();
现在在代码的后面某处
bc1=sc.getInstance();
如何实现这一目标?
注意:多个线程将访问这些对象,因此同步是必需的
答案 0 :(得分:1)
而不是使用单身人士为什么不使用依赖注入,例如:google guice。
Guice将为您创建超类的实例,然后您可以通过injector.getInstance()方法访问它。
答案 1 :(得分:0)
首先,您必须同步对实例的访问权限。有很多关于如何做到这一点的例子(例如线程安全发布只读或线程安全类)。
因为单例表示静态方法。您必须决定在某处使用哪种实现。通常这是通过setInstance
方法。
答案 2 :(得分:0)
使Superclass方法返回Subclass类型的一种方法是通过Generics。
您将无法制作方法static
,因为您无法覆盖static
方法,因此这项技术无法帮助您,但它会像:
public interface SuperClass<T extends SuperClass<T>> {
public T getInstance();
}
public class BaseClass1 implements SuperClass<BaseClass1> {
@Override
public BaseClass1 getInstance() {
// Do my create.
}
}
但是,对于您需要扩展基类的线程安全Singletons的特定需求,您可以使用enum
作为它们的工厂并使用Multiton来确保它们中只有一个