第1章 ラムダ式とは : 問題 10 : Collections クラスのメソッドをインターフェースに追加
問題 10
あなたが Java の設計者で Collections Framework を自由に変更できるとしたら、
Collections
クラスのメソッドをどのインターフェースに入れるのが良いかを考えよ
そのとき、そのメソッドをデフォルトメソッドとするか静的メソッドにするかも述べよ
解答
■ デフォルトメソッド
メソッドの第一引数が Collections Framework のインターフェースになっているものは、第一引数のインターフェースのデフォルトメソッドとする。
例えば、与えられたComparator
の逆順のComparator
を返す
public static <T> Comparator<T> reverseOrder(Comparator<T>)
はComparator
にデフォルトメソッドとして入れる。
実際 Java 8 のComparator
には、同じ機能の
default Comparator<T> reversed()
がある。
■ 静的メソッド
メソッドの第一引数が Collections Framework のインターフェースでなく、戻り値が Collections Framework のインターフェースになっているものは、戻り値のインターフェースの静的メソッドとする。
例えば、自然順序の逆順のComparator
を返す
public static <T> Comparator<T> reverseOrder()
はComparator
に静的メソッドとして入れる。
実際 Java 8 のComparator
には、同じ機能の
static <T extends Comparable<? super T>> Comparator<T> reverseOrder()
がある。
■ 鬼っ子
上の原則に当てはまらないメソッドが一つだけある。
マップに連動するセットを返すメソッド
public static <E> Set<E> newSetFromMap(Map<E,Boolean>)
である。
第一引数のMap
は Value の型がBoolean
に固定されているので、戻り値のSet
の静的メソッドにすべきである。
static Set<E> newSetFromMap(Map<? extends E,Boolean>)
おまけ
私ならCollections
クラスは隠蔽して、全てインターフェースのデフォルトメソッドまたは静的メソッドにする。
その方が言語の利用者に分かりやすい(言語の設計者には歯痒いかも...)からである。
実際、Java 8 で導入されたインターフェースjava.util.stream.Stream
には対応するユーティリティクラスjava.util.stream.Streams
があるが、これはpublic
なクラスではないので我々は利用できない。