Интерфейс — базовый механизм джавы для поддержки ООП, а также главный герой этой недели🦸🏼♂️
🔸 Какие методы можно добавить в интерфейс в разных версиях 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();У приватных, статических и default методов в интерфейсах должна быть реализация.
private int get();
public static int get();