5

が と の両方を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が将来の実装でそれを処理することになっている方法ですか?
4

1 に答える 1