Зачем объявлять интерфейс внутри интерфейса?

Это упрощенная версия java.util.Map

public interface Map {
    interface Entry{
        int getKey();
    }

    void clear();
}

У меня вопрос, почему это так?

Как должен быть реализован внутренний интерфейс? Могу я просто реализовать внутренний?


person Ryan    schedule 21.08.2013    source источник
comment
Какой альтернативы вы ожидаете?   -  person    schedule 22.08.2013
comment
например Почему бы просто не объявить методы во внешнем интерфейсе?   -  person Ryan    schedule 22.08.2013
comment
@ Райан: Это два разных типа.   -  person SLaks    schedule 22.08.2013


Ответы (2)


Я собираюсь быть ... ужасным теоретиком ... так что будьте непредвзято, пожалуйста. Отдельный интерфейс Entry отделит эту концепцию от контекста, для которого она предназначена. Не думайте только об интерфейсе, а о его реализациях. Возьмем, к примеру, внутренний статический класс Entry, определенный в HashMap:

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    final int hash;

    (...)
}

Этот класс Entry не предназначен для использования снаружи, и интерфейс, который он реализует, представляет собой контракт службы, предназначенный только для внутреннего использования среди Map, в частности потому, что Map является самим интерфейсом и нуждается в небольшой абстракции, чтобы позволить конкретным реализациям определять вид запись, которую они будут использовать.

В самом деле, держу пари, вы задаетесь вопросом: "Конечно, но запись может использоваться во многих ситуациях, особенно когда вам нужна пара" ключ-значение ". Фактически, это правда, но я лично согласен с текущим дизайнерским решением, поскольку оно обеспечивает все, что требуется для реализации Map в одном месте.

person Fritz    schedule 21.08.2013

Здесь Map также используется как пространство имен. Это потому, что Entry не принадлежит глобальной области видимости - есть много других сущностей, которые Entries и не являются необходимыми записями Map. Это означает, что Entry представляет записи, относящиеся к Map.

person BartoszKP    schedule 21.08.2013