2014-09-30 50 views
2

有時你必須決定使用一個Singleton對象(一個真正的單身人士,還是隻是一個事實上的單身人像一個注入的bean),或者每次只使用新的東西。你做什麼取決於對象。單身或不是。如何測量?

如果一個對象需要一分鐘的時間才能創建,並且需要10MB的內存,如果沒有必要,您不想創建多個內存。但是,如果只需要一毫秒和20個字節的內存,誰會在乎你是否在你的整個應用程序中創建了10個字節,並且在我看來,單例的其他複雜性是不值得的。

但我想衡量這一點。我發現了一些使用Instrumentation軟件包查看內存使用情況的選項,但是這似乎相當困難和繁瑣。所以我想知道,是否有一些很好的技巧可以用在單元測試中,例如只是爲了獲得一些有關對象的內存和時間屬性的球場圖?

澄清:在這種情況下單身人士我的意思是:你只創建一個對象。不是一個真正的單身人士,你強制執行,只有一個。

例如,我們使用resteasy來生成REST代理。你可以使用依賴注入代理:

@Bean 
@Autowired 
public AccountRequestResource accountsServiceClient(JaxRsProxyClientBuilder builder) { 
    return builder.createProxy(AccountRequestResource.class, accountsServiceBaseUrl); 
} 

@Autowired 
AccountRequestResource accountsServiceClient 

或者你可以構建每一個在你需要它的類一個新問題:

AccountRequestResource accountsServiceClient = 
builder.createProxy(AccountRequestResource.class, accountsServiceBaseUrl) 

我想衡量這幾樣中存在的問題一般情況下(不僅僅是簡單,而是任何類型的注入對象)。

+0

根據一些程序員,單身人士被認爲是反模式... – 2014-09-30 07:12:35

回答

2

你想製作一個單件的原因通常不是爲了節省時間/內存。

假設你有一個類,它維護一個DatabaseConnection池。你需要確保你只有其中一個,否則你會使你的池增加一倍/三倍,也許會壓倒數據庫。

同樣,您可能有一個緩存類,並且您希望確保只有一個緩存副本,以便在應用程序中保持一致。

在我看來,你不需要創建很多單例的小實例是一個次要的考慮因素。

一般來說,在春季注入豆類並不是真正的「單身」。它們只是由容器實例化一次。沒有什麼能阻止你做new YourBean();,從而創建兩個類的副本。 A 真正的單身人士永遠不會讓你在同一個JVM中創建兩個副本。

+0

這就是爲什麼我使用術語「事實上的單身人士」。在春天,豆類不是真正的單身人士,但系統通常只會創建一個,所以他們在實踐中是單身人士。 – 2014-09-30 09:15:42

1

你應該讓一件物品成爲單身的唯一原因是,只有一種可能。

這是無關: - 花費的時間創造 - 內存,它使用 - 事實上你只在當前的設計使用一個實例。

關於最後一項:假設你make一個文本編輯器。你決定一個文件是一個單身人士。然而,後來你認爲能夠擁有多個文檔是很好的......所以在你將一個實例變成單例之前,請三思。如果你知道現在和之後只有一個實例(即使我只在需要從不同點訪問時才使用它),單身人士也應該是單身人士。