У Java 8 інтерфейси можуть містити реалізовані методи, статичні методи та так звані "типові" методи (які класам реалізації не потрібно переосмислювати).
На мій (напевно, наївний) погляд, не було потреби порушувати такі інтерфейси. Інтерфейси завжди були контрактом, який ви повинні виконати, і це дуже проста і чиста концепція. Зараз це поєднання кількох речей. На мою думку:
- статичні методи не належать до інтерфейсів. Вони належать до корисних класів.
- Методи "за замовчуванням" взагалі не повинні бути дозволені в інтерфейсах. Ви завжди могли використовувати для цього абстрактний клас.
Коротко:
Перед Java 8:
- Ви можете використовувати абстрактні та регулярні класи для надання статичних та стандартних методів. Роль інтерфейсів зрозуміла.
- Усі методи в інтерфейсі повинні бути замінені реалізацією класів.
- Ви не можете додати новий метод в інтерфейс без зміни всіх реалізацій, але це насправді хороша річ.
Після Java 8:
- Практично немає різниці між інтерфейсом та абстрактним класом (крім багатократного успадкування). Насправді ви можете наслідувати звичайний клас за допомогою інтерфейсу.
- Програмуючи реалізації, програмісти можуть забути замінити методи за замовчуванням.
- Існує помилка компіляції, якщо клас намагається реалізувати два чи більше інтерфейсів, що мають метод за замовчуванням з однаковою підписом.
- Додаючи метод інтерфейсу до інтерфейсу, кожен клас реалізації автоматично успадковує цю поведінку. Деякі з цих класів, можливо, не були розроблені з урахуванням нової функціональності, і це може спричинити проблеми. Наприклад, якщо хтось додає новий метод за замовчуванням
default void foo()
до інтерфейсуIx
, то клас, щоCx
реалізуєIx
та має приватнийfoo
метод з тим же підписом, не компілюється.
Які основні причини таких великих змін та які нові переваги (якщо такі є) вони додають?
@Deprecated
категорії! статичні методи - одна з найбільш зловживаних конструкцій на Яві через незнання та лінь. Багато статичних методів зазвичай означають некомпетентного програміста, збільшують зв'язок на кілька порядків і є кошмаром для тестування та рефактора, коли ти зрозумієш, чому вони погана ідея!