2014-09-22 86 views
0

使用Singleton设计与继承我有其中的代码是有点这样写的在多线程应用程序

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 
} 

现在,在我的应用程序只有一个对象可以被实例化超类引用的应用程序,即同步单。现在

,我可以包括

public static synchronized SuperCLass getInstance(){ 
    //initialise 
} 
任何基类的

,但我不能包括在父类接口此声明,由于我不能回来使用超类的引用基类的实例。 例如 我想以后要做到这一点(它是一个非常模糊的例子)

BaseClass1 bc1 = BaseClass1.getInstance(); 

SuperClass sc = bc1.getInstance(); 

现在某处代码

bc1=sc.getInstance(); 

如何才能实现这一目标?

注:多个线程会访问这些对象,因此同步是强制性

+0

为什么你想显式强制转换为'SuperClass'? 'BaseClass1'继承了“接口”。 – Smutje 2014-09-22 10:53:58

+0

你的问题目前还不清楚,但只要在singleton工厂方法中加入'synchronized',绝对不会让你的单例线程安全。 – 2014-09-22 10:54:14

+0

你的陈述“使用超类的引用取回基类的实例”尚不清楚。 – 2014-09-22 10:54:26

回答

0

你必须将访问实例同步的第一位。有很多关于如何做到这一点的例子(比如只读或线程安全类的线程安全发布)。

因为单件意味着静态方法。您必须决定在哪个地方使用哪个实现。通常这是通过setInstance方法。

1

而不是使用单例为什么不使用依赖注入例如:谷歌guice。

Guice将为您创建超类的实例,然后您可以通过injector.getInstance()方法访问它。

+0

不知道谷歌果汁......但我没有非常复杂/应用程序,所以我避免使用任何外部框架... – kushal 2014-09-22 11:53:20

0

使超类方法返回子类类型的一种方法是通过泛型。

您将无法使方法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. 
    } 
} 

然而,对于您需要的线程的具体需求 - 安全单身人士扩展基类,你可以使用enum作为他们的工厂,并使用Multiton来确保只有其中一个。