CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第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なクラスではないので我々は利用できない。