Подтвердить что ты не робот

Почему мы должны объявлять интерфейс внутри класса?

Почему мы должны объявлять интерфейс внутри класса в Java?

Например:

public class GenericModelLinker implements IModelLinker {

  private static final Logger LOG =LoggerFactory.getLogger(GenericModelLinker.class);
  private String joinAsPropertyField;
  private boolean joinAsListEntry;
  private boolean clearList;
  private List<Link> joins;

  //instead of a scalar property
  private String uniqueProperty;

  public interface Link {

    Object getProperty(IAdaptable n);

    void setProperty(IAdaptable n, Object value);

  }
}
4b9b3361

Ответ 1

Если вы хотите собрать некоторые поля в объекте, чтобы подчеркнуть концепцию, вы могли бы либо создать внешний класс, либо внутренний (называемый либо вложенным (статическим), либо внутренним).

Если вы хотите подчеркнуть тот факт, что этот кооперативный класс не имеет смысла (не имеет смысла) вне исходного использования объекта, вы можете сделать его вложенным/внутренним.

Таким образом, имея дело с некоторой иерархией, вы можете описать "вложенный" interface, который будет реализован подклассами класса wrapping.

В JDK наиболее важным примером может быть внутренний интерфейс Map.Entry, определенный в интерфейсе Map и реализованный различными способами с помощью HashMap, LinkedHashMap и т.д.

И, конечно, Map.Entry нужно было объявить как public для того, чтобы быть доступным, итерации по карте везде, где находится код.

Ответ 2

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

Ответ 3

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

Некоторые люди используют этот механизм для создания своего рода пространства имен. ИМХО это злоупотребление языковой функцией (в большинстве случаев).

Ответ 4

Внутри вашего класса вам может потребоваться несколько реализаций интерфейса, что относится только к данному классу. В этом случае сделайте его внутренним интерфейсом, а не общедоступным/приватным пакетом.
Только интерфейс внутри класса может быть объявлен закрытым или защищенным. Иногда это имеет смысл, когда интерфейс подходит только для использования внутри внешнего класса (или его подклассов).

Ответ 5

Чтобы инкапсулировать поведение в общий и resuable способом.

Помимо хорошего примера Map.Entry, используемого классами Map реализации, еще одним хорошим примером является реализация Strategy Pattern, где стратегия выполнения оценивается и применяется внутренне.

class Test
{

..
interface Cipher {
 doAction();
}
class RAMPCipher implements Cipher{}
class DiskCipher implements Cipher{}
..
}