2016-07-28 81 views
2

我碰巧看到了java.util.Collections類。一個不能實例化這個類。我想這是由於存在一個私人Constructor何時使用不可實例化的類而不是枚舉?

的實例可以則在此創建way-

Class collections = java.util.Collections.class;  
Constructor cons = collections.getDeclaredConstructor(); 
cons.setAccessible(true); 
Collections instance = (Collections) cons.newInstance(); 

首先爲什麼沒有在Java API的創造者停止這種行爲?

它使被覺得我應該何時真的喜歡一個非實例級以上的枚舉

+0

這是兩個完全不同的問題。第一個問題的答案是Java的反射讓你打破了一些Java規則。這是設計。如果你用反射來破壞規則,期望被你打破的東西咬傷。第二個問題是以意見爲基礎,因此是焦點話題。 –

+0

'Collections':自java 1.2;枚舉:自java 5; '2 <5' – fabian

+0

也許他們應該在該私有構造函數中拋出Exception –

回答

1

對第二個問題的簡短回答:只需避免均爲

冗長的答案:實際上這兩個選項都不是很好。事情是:你總是想編寫的代碼是easy來測試。

當您正在製作靜態調用;或者當您直接調用某些枚舉實例的方法時,則只需創建代碼即hard以進行測試。 因爲,在某些時候,你可能想要模擬的東西。爲了嘲弄靜態/枚舉調用......你需要Powermock/ito。而那些嘲笑框架操縱你的字節碼,在我眼裏,造成比他們擅長的更多的麻煩。

儘管使用枚舉作爲單例,實現接口還有一個很好的模式,但請參閱我的一些舊回答here

+1

枚舉不需要任何枚舉值,因此語法'Objects.requireNonNull'也可以通過枚舉來實現。 –

+0

謝謝;我相應地更新了我的答案。 – GhostCat

+0

我道歉。我很欣賞有人花時間回答。 –

相關問題