Что такое использование класса внутри интерфейса

Я нашел следующий пример в одном из java-форумов.

interface employee{
    class Role{
          public String rollname;
          public int roleId;
          public Object person;
     }
    Role getRole();
    // other methods
}

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

Мой вопрос в том, что такое использование таких классов? Это какой-либо шаблон дизайна?

Ответ 1

Этот фрагмент кода уже отвечает на ваш вопрос. Класс Role используется интерфейсом employee в методе getRole(). Дизайнер интерфейса решил, что этот класс настолько тесно связан с интерфейсом, что стоит определить его внутри этого интерфейса, чтобы подчеркнуть, насколько важно этот класс для интерфейса.

Также он предоставляет семантическое пространство имен для класса: employee.Role. Однако я вижу такую ​​конструкцию впервые, в то время как статические классы, определенные внутри других классов, довольно распространены (для тех же целей, что и выше).

Ответ 2

Использование здесь такое же, как для любого внутреннего класса. Он ограничивает область действия класса тем, где он принадлежит.

В этом случае разработчик подумал, что Role не подходит как класс верхнего уровня и помещает его в интерфейс employee. Причина этого, скорее всего, заключается в том, что намерение Role должно быть тесно связано с employee.

Ответ 3

Класс обеспечивает важную часть интерфейса: возвращаемое значение для getRole. Поэтому имеет смысл определить класс внутри интерфейса.

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

Ответ 4

В вашем примере есть небольшая проблема с компиляцией, которую я установил ниже:

public interface Employee {
class Role{
      public String rollname;
      public int roleId;
      public Object person;
    }

Role getRole();
}

Кроме того, да, он компилируется. Это не значит, что это хорошая идея. Это еще один способ разделения имен вашего класса Role, но я считаю это довольно уродливым.

Ответ 5

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

Интерфейсы используются для определения API, и в этом случае автор, возможно, захотел сказать, что "эти два не могут жить отдельно".

Надеюсь, что это поможет.

Ответ 6

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

Интерфейсы используются для определения API, и в этом случае автор, возможно, захотел сказать, что "эти два не могут жить отдельно".