2016-06-30 72 views
1

我想設計一個應該返回某個第三方對象的單例的類。 例如,我想創建一個第三方B類對象的單例。以下是我所做的設計。單例類返回兩個不同的單例對象

public class A{ 

private static A A = null; 
private static B B = null; 

private A() { 

    B = code to instantiate B Object; 

} 

public static synchronized A getAInstance() { 

    if(A ==null){ 
     synchronized(A.class){ 
      if(A == null){ 
       A = new A(); 
      } 
     } 
    } 
    return A; 
} 
public B getB(){ 
    return B; 
} 

}

你能幫幫我,這是一個適當的單

+0

我沒有看到任何阻止其他代碼同時實例化類B的對象的東西(不確定是否是問題或不)。 – Thilo

+1

如果您將它視爲單個「A」實例的成員(因爲您似乎使用該「getB」實例方法),那麼'B'不應該是'static'。雖然'getB'可以與靜態''B'一起工作,這是非常令人誤解的。 –

+0

'synchronized'方法內不需要第二個'synchronized'塊(在同一個監視器上)(可能會在方法中丟失)。 – Thilo

回答

0

如果我理解你的問題正確,你想有一個第三方類的一個實例。首先,通過包裝類obj訪問第三方obj是一個很好的習慣(敏捷軟件工藝第8章乾淨的代碼手冊),在你的案例中,類b由類a包裝。 爲了使類的單個實例b,你可以只讓一個類的實例變量,然後使課堂單身,代碼波紋管

Public class A{ 

private static A A = null; 
private B B = null; 

private A() { 
    B = code to instantiate B Object; 
} 

public static synchronized A getAInstance() { 

if(A ==null){ 
    synchronized(A.class){ 
     if(A == null){ 
      A = new A(); 
     } 
    } 
    } 
    return A; 
} 

public B getB(){ 
    return B; 
} 
} 
+0

看起來不錯,謝謝你的建議。 –

0

你可以簡單地具有這種結構。不需要明確的同步化,只需將其留給JVM即可。

public class A { 

private static class BInstanceHolder { 
    B BInstance = new B(); 
} 

private A(){} 

public static B getB(){ 

    return BInstanceHolder.BInstance; 

} 

} 
0

如果您只想擁有B的一個副本,就這樣做! 你甚至不需要一個單獨的類A. ,所以你可以嘗試:

public final class A{ 

    private A(){} 

    private static B instance; 

    static{ 
    instance = code to instantiate B Object 
    } 

    public static synchronized B getInstance() { 
     return B; 
    } 
} 

靜態塊將創建B的實例時,首先提到的類,並且將實例的實例。構造函數將阻止A被創建,但仍然可以訪問B的唯一實例。