2012-05-18 22 views
2

給定一個對象,我們如何檢查一個類是否是Singleton?如何找到一個類是否是來自該對象的單例類?

目前我使用這個

public class SingletonClass implements IsSingleton 

其中IsSingleton是我的單身類實現一個空白的界面。所以這個類可以作爲單例測試

SingletonClass obj = SingletonClass.getInstance(); 
if(obj instanceof IsSingleton) 
    System.out.println("Class is Singleton"); 
else 
    System.err.println("Class not singleton"); 

有沒有更好的方法來確定一個單例類。我試過我的方式,通過reflection但問題是getConstructors()只返回宣佈公共類。所以它會將一個沒有聲明構造函數的類視爲Singleton。

+0

我不是一個Java專家,但如果以編程測試孤單的路要走,如果一個對象的構造函數是私有或不(通過反射,可能),那我怎麼會做了測試。 – Kristian

+4

@Kristian - 那裏是測試是一種方式,但私有構造並不能保證一類是單。您仍然可以通過靜態方法在所述對象上構建儘可能多的構造。 – jtahlborn

+1

擁有一個私有構造函數並不一定意味着該類被實現爲一個單例。 – birryree

回答

4

單例是一個語義定義,其中一個通常不能通過代碼測試。沒有界面或任何其他計劃可以保證該課程僅作爲單身人士使用。

因爲這個(語義性質),這將是更好IMO創建自定義的註釋,以表明該功能

+0

+1以獲得更清晰的解釋。 –

1

這看起來很複雜。

Java支持「的instanceof」

SingletonClass obj = SingletonClass.getInstance(); 
if(obj instanceof IsSingleton) 
    System.out.println("Class is Singleton"); 
else 
    System.err.println("Class not singleton"); 
2

有編程知道,如果一個類是單與否沒有通用的方法。

1

instanceof應該與接口一起工作。

SingletonClass obj = SingletonClass.getInstance(); 

if (obj instanceof IsSingleton) 
    System.out.println("Yay !"); 

但是要小心!如果對象是從final類,如String

http://www.xyzws.com/Javafaq/how-does-instanceof-work-with-interface/67

這是行不通的。對於你的自定義類,只要你不讓類本身成爲最終的,它應該沒問題。

1

我想這可能會幫助你.... 當在內存中創建的任何對象,還有的總是與它相關的哈希碼。這個哈希碼是通過使用少數參數的數學運算來計算的,例如啓動內存分配地址。所以,如果您將對任意對象調用hashcode()任意次數,它將返回相同的哈希碼。 因此,只需調用返回您期望的單例類型對象的方法並調用hashcode()方法即可。如果它打印每一次相同的hashCode,這意味着它的單,否則不是。人

地塊是說的instanceof關鍵字可以幫助你決定一個對象是否是單身OT沒有。但是,我真的不明白這怎麼可能? instanceof只是讓我們檢查實例是否有特定的類。因此,如果有多個類A的實例並且它們不是由單例模式創建的,那麼檢查其中任何一個的instanceof總是會返回true。但是,它不能被稱爲單例,因爲單獨的實例存在於內存中的每個對象。

相關問題