2010-07-01 28 views
3

的我在看一個代碼庫和我經常看到這樣的:Java成員對象的內部類相同類型

public class SomeClass 
{ 
protected static SomeClass myObject; 

//... 

public static SomeClass getObject() 
{ 
    return myOjbect 
} 
} 

我想確保我的理解這背後的目的。是否確保該類的一個實例即使被多次實例化也會被共享?我不知道這裏的詞彙,否則我會尋找答案,所以如果這個模式有一個名字,請讓我知道。

此外,這似乎有點雞和蛋的定義,因爲該類包括類的類型的對象。爲什麼這不是真的矛盾呢?

謝謝!

回答

3

這確實是唯一的共同與Singleton Pattern那裏是隻有這個類的一個實例。雖然它有其用途,但Singleton經常被濫用和濫用(通常是將程序性編程僞裝成OO)。它也經常出現在Java AWT或Swing的示例代碼中,您通常在其中創建子類Frame/JFrame,並在同一類中的main方法中創建實例。

此外,這似乎有點 雞和蛋的定義,因爲 類包含類的 類型的對象。爲什麼這不是實際上 似是而非呢?

你爲什麼認爲這是?該類主要描述此類型的成員實例 - 但static成員不屬於某個實例,它屬於該類本身,因此它與該類的「藍圖」角色沒有任何關係。因此,靜態成員實際上有些非OO。

但即使在實例級別上,也可以具有相同類型的引用。例如,鏈接列表中的條目通常會有兩個對同一類的下一個和前一個條目的引用。

3

您提到的模式被稱爲「Singleton」,但是從您的代碼示例中不清楚這是否真的是預期的。由於該成員是受保護的,所以我猜測不是 - 如果有子類,那麼可能不會有單個實例。

1

這並不罕見;它可以是實現Singleton模式的一種好方法。還可以有其他用途 - 有時你會想要一小部分 - 而不是更多 - 給定班級的對象;那個班級是一個很好的地方。如果您不希望其他類能夠創建此類的對象,則通常也會爲該類提供一個私有構造函數。

這並不矛盾,因爲編譯器可以在完全編譯該類之前知道對該類的引用。之後 - 如果你喜歡這樣想 - 它可以「填補空白」。

4

這被稱爲Singleton設計模式。

你說的目的是爲了確保只創建一個類的實例。

Wikipedia在模式上有一個preyty好文章。

1

它被稱爲Singleton。您確保創建一個給定類的一個(1)對象。

你應該添加一個私人的構造函數,所以創建該對象的唯一人就是該類。

public class SomeClass 
{ 
// Using private constructor 
protected static SomeClass myObject = new SomeClass(); 

private SomeClass(){ 
//... 
} 

public static SomeClass getObject() 
{ 
    return myOjbect 
} 
} 

遠勝這裏,在Wikipedia

你可能想看看以Factory Pattern

相關問題