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



Интерфейс — инструмент поддержки инкапсуляции. Что можно добавить в интерфейс в разных версиях java?



Java 7

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

interface Интерфейс {

public void метод();

}



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

class M implements Интерфейс {

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

}



Java 8

Появились 2 новых возможности:

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

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

Конкретный класс переопределяет его при необходимости.



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

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



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

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

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

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



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

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

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

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

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

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



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

static E min() {…};



До 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();



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