Java 8 інтерфейси

Інтерфейси в Java - це деякий контракт, опис методів, які обов'язково повинні бути присутніми в класі, що реалізує цей інтерфейс. Інтерфейси дозволяють мати кілька різних реалізацій одного і того ж дії, але виконується різними способами або з різними видами даних. Коли ви пишете якусь бібліотеку, має сенс давати користувачам працювати тільки з публічними інтерфейсами. Тоді користувачі зможуть замінити одну реалізацію цих інтерфейсів на іншу без переписування більшої частини коду, також ви зможете змінювати внутрішню архітектуру бібліотеки без необхідності переписування залежить клієнтського коду.

Інтерфейси в Java є посилальними типами, як класи, але вони можуть містити в собі тільки константи, сигнатури методів, default методи (методи за замовчуванням), static методи (статичні методи) і вкладені типи. Тіла методів можуть бути тільки у статичних методів і методів за замовчуванням.

Не можна створити екземпляр інтерфейсу. Інтерфейс може бути тільки реалізований будь-яким класом, або успадковуватися іншим інтерфейсом.

Приклад інтерфейсу, що описує загальні методи для всіх монстрів:

Ключове слово public означає, що інтерфейс буде доступний з усіх пакетів. Можна не вказувати модифікатор доступу, і тоді інтерфейс буде package-private.

Будь нестатичних і не default метод метод в інтерфейсі public і abstract. Немає ніякого сенсу писати будь-яке з цих ключових слів.

Будь-який метод в інтерфейсі public. немає потреби вказувати цей модифікатор.

Ключове слово abstract для методу означає, що у методу немає реалізації, а ключове слово abstract у всього інтерфейсу означає, що всі методи примірників не мають реалізації (крім статичних методів і методів за замовчуванням). Для класів abstract має приблизно таку ж дію, воно буде пояснено в статті про спадкування.

Щоб використовувати інтерфейс потрібно оголосити клас, який реалізує цей інтерфейс. за допомогою ключового слова implements:

Для методів за замовчуванням потрібно обов'язково вказати реалізацію. Ця реалізація може викликати інші методи з цього інтерфейсу і інтерфейсів, від яких він успадковується.

Тепер класи, що реалізують інтерфейс Monstr. і інтерфейси, що розширюють його, отримають метод doSomething (). і їм не потрібно буде змінювати або перекомпіліровать себе.

Коли ви розширюєте своїм інтерфейсом інший інтерфейс, який містить default метод, то ви можете:

  • Чи не згадувати цей метод, і тоді ваш інтерфейс успадкує його.
  • Переоб'явіть default метод, що зробить його abstract.
  • Оголосити свій default метод з тими ж параметрами і ім'ям, що перевизначити його.

Статичні методи (static методи)

Інтерфейс може містити статичні методи, як і клас. Статичні методи відносяться до самого типу і викликаються через нього.