2014-09-22 100 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來確保只有其中一個。