Интерфейсы, часть 1: поля и методы



Интерфейс — базовый механизм джавы для поддержки ООП, а также главный герой этой недели🦸🏼‍♂️



🔸 Какие методы можно добавить в интерфейс в разных версиях java?



Java 7 — только нестатические public методы:



interface Интерфейс {

public void метод();

}



Классы реализуют эти методы под угрозой ошибки компиляции.



Java 8 — плюс 2 возможности:



▪️Методы по умолчанию с заданной реализацией:



default void метод() {…};



Конкретный класс переопределяет его при необходимости. Дефолтные методы уместны в трёх случаях, об этом будет статья в среду.



▪️ Статические методы с реализацией:



static void метод() {…};



Статические методы не наследуются и не переопределяются. Вызвать такой метод можно только через имя интерфейса:



Интерфейс.метод()



Зачем он нужен?



В интерфейсе определяется необходимый минимум методов. Например, в Collection это методы add(), remove() и пара других. Чем меньше методов, тем больше свободы действий у конкретных классов.



Эти базовые методы комбинируются между собой в другие полезные методы:

▪️Поиск элемента,

▪️Поиск минимального элемента

▪️Скопировать коллекцию



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



static E copy() {…};



До java 8 статические методы часто объединяли в утилитный класс с похожим именем. Например, методы binarySearch, copy, min реализованы в классе Collections.



Java 9 — добавились private и private static методы с реализацией:



private void m() {…};

private static void m() {…};



Эти методы недоступны для классов, реализующих интерфейс.



Зачем они нужны?



Код внутри дефолтных и статических методов может дублироваться. Чтобы улучшить читаемость, можно вынести общие части в приватный метод.



🔸 С методами разобрались, а какие поля можно добавлять в интерфейс?



Только константы с модификаторами public static. Из-за того, что других вариантов нет, в Intellij IDEA public и static подсвечиваются как избыточные и вместо



public static int NUM = 1;



допустима запись:



int NUM = 1;



Такие поля компилируются в статические!



🔸 Правильный ответ на вопрос перед постом



Ошибку компиляции в последней версии java вызовут:

default int get();

private int get();

public static int get();



У приватных, статических и default методов в интерфейсах должна быть реализация.