が と の両方をLinkedList<E>
実装している実際のユース ケースを抽出した次のコードを考えてみましょう。List<E>
Deque<E>
両方のインターフェイスにsize()
とisEmpty()
メソッドがあり、isEmpty()
に関してメソッドをデフォルトにすることができますsize()
。
Java 8はまだそれをしていないので、それを(ダミーインターフェースで)やってみましょう:
interface List<E> {
public int size();
default public boolean isEmpty() {
return (size() == 0);
}
//more list operations
}
interface Deque<E> {
public int size();
default public boolean isEmpty() {
return (size() == 0);
}
//more deque operations
}
class LinkedList<E> implements List<E>, Deque<E> {
private int size;
@Override
public int size() {
return size;
}
}
おっとっと!でコンパイル時エラーが発生します。使用する実装LinkedList
がわからないisEmpty()
ため、次のように追加します。
@Override
public boolean isEmpty() {
return List.super.isEmpty();
}
メソッドを記述するのに以前と同じくらい多くのコードが必要になるため、このユースケースのデフォルトメソッドの利点は実質的にすべて失われましisEmpty()
た。
しかし、それは解決できますか?はい!
次の実装を検討してください。
interface Sizable {
public int size();
default public boolean isEmpty() {
return (size() == 0);
}
}
interface List<E> extends Sizable {
//list operations
}
interface Deque<E> extends Sizable {
//deque operations
}
class LinkedList<E> implements List<E>, Deque<E> {
private int size;
@Override
public int size() {
return size;
}
}
だから質問:
- これは、私たちとJDKが将来の実装でそれを処理することになっている方法ですか?