ワイルドカードを使ったイミュータブル
色々検索していたら、ワイルドカードを使ったイミュータブルという面白そうな話題を見つけた。以下で紹介されている本は、洋書の『Java Generics And Collections』という本みたいだが結構面白そう。
- るいもの戯れ言: Java Generics and Collections (http://www.ruimo.com/2006/01/19/1137674185271.html)
import java.util.*; class test { public static void main(String[] args) { List<Integer> L = Arrays.asList(1, 2, 3); L.add(4); } } /* 実行結果 */ >java test Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:131) at java.util.AbstractList.add(AbstractList.java:91) at test.main(test.java:6)
上記の記事ではわざわざワイルドカードを使うことによってイミュータブルを実現しているらしいが、上のサンプルコードではL.add(4)でエラー。工夫しなくてもイミュータブルになっている。asList()のAPIリファレンスを読むと「指定された配列に連動する固定サイズのリストを返します」と書いてある。バージョンが6.0から変更になったのだろうか?