Интерфейсы. Часть 1: поля и методы.
Интерфейс — инструмент поддержки инкапсуляции. Что можно добавить в интерфейс в разных версиях java?
Java 7
Только нестатические public методы:
Появились 2 новых возможности:
1️⃣ Метод по умолчанию с заданной реализацией:
❓Зачем они нужны?
Дефолтные методы уместны в трёх случаях, об этом будет статья в среду.
2️⃣ Статические методы с реализацией:
В интерфейсе определяется необходимый минимум методов. Например, в Collection это методы add(), remove() и другие. Чем меньше методов, тем больше свободы действий у конкретных классов.
Эти базовые методы комбинируются между собой в другие полезные методы:
▪️Поиск элемента,
▪️Поиск минимального элемента,
▪️Скопировать коллекцию,
Каждый из этих методов - всего лишь комбинация базовых, которая не зависит от конкретного класса. Чтобы не копировать код в каждый класс, сделайте такой метод статическим методом в интерфейсе:
Java 9
Можно добавить private и private static методы с реализацией:
❓Зачем они нужны?
Чтобы выделить под-методы в дефолтных и статических методах, таким образом улучшить читаемость и избежать дублирования кода.
С методами разобрались, а какие поля можно добавлять в интерфейс?
Только константы с модификаторами public static. Из-за того, что других вариантов нет, в Intellij IDEA модификаторы public и static подсвечиваются как избыточные и вместо
Правильный ответ на вопрос:
Ошибку компиляции в последней версии java вызовут варианты:
Интерфейс — инструмент поддержки инкапсуляции. Что можно добавить в интерфейс в разных версиях java?
Java 7
Только нестатические public методы:
interface Интерфейс {Классы реализуют эти методы под угрозой ошибки компиляции:
public void метод();
}
class M implements Интерфейс {Java 8
public void метод() {…};
}
Появились 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();