大家都知道JDK提供了Collections.UnmodifiableList(),Collections.UnmodifiableSet()和Collections.unmodifiableMap()這些包裝方法。事實上它們的實現都是包裝了原來的集合對象,然後在add,put,remove這樣的方法上面拋出UnsupportedOperationException。這樣就實現了Unmodifiable特性。這種做法在編程中叫作轉發(forwarding)。
這樣的Unmodifiable集合能滿足一般的需求,但是如果碰到下面的情況 - 例如你需要定義2個常數放在List裏面然後把這個List做成final,而且用Collections.UnmodifiableList()包裝一下,就以爲高枕無憂了:
看上去unmodifiableList是不可改變的,但是如果這樣:
你再看unmodifiableList已經被加了"NORMAL"。
當然有經驗的程序員可以把原來的List放到新作的List然後Unmodifiable包裝一下:
但是已經有Google Collection的Immutable集合解決了這個問題。剛纔unmodifiableList可以這樣來做:
除此之外Immutable集合還提供了ImmutableSet和ImmutableMap來包裝集合。
爲了便捷開發Immutable集合還能讓開發者方便地在初始化設值:
值得注意的是這些Immutable集合都是abstract類,它們的初始化都是由of(),copyOf()以及builder模式這樣方式來實現。這也體現了作者在編程時候對代碼靈活度的考慮。
下載地址: google guava