В Java 8 интерфейсы могут содержать реализованные методы, статические методы и так называемые методы «по умолчанию» (которые классам реализации не нужно переопределять).
На мой (возможно, наивный) взгляд, не было необходимости нарушать подобные интерфейсы. Интерфейсы всегда были контрактом, который вы должны выполнить, и это очень простая и чистая концепция. Теперь это смесь нескольких вещей. По моему мнению:
- статические методы не принадлежат интерфейсам. Они относятся к служебным классам.
- методы по умолчанию не должны были быть разрешены в интерфейсах вообще. Вы всегда можете использовать абстрактный класс для этой цели.
Короче говоря:
До Java 8:
- Вы можете использовать абстрактные и обычные классы для предоставления статических и стандартных методов. Роль интерфейсов понятна.
- Все методы в интерфейсе должны быть переопределены путем реализации классов.
- Вы не можете добавить новый метод в интерфейс без изменения всех реализаций, но на самом деле это хорошая вещь.
После Java 8:
- Практически нет разницы между интерфейсом и абстрактным классом (кроме множественного наследования). На самом деле вы можете эмулировать обычный класс с интерфейсом.
- При программировании реализаций программисты могут забыть переопределить методы по умолчанию.
- Существует ошибка компиляции, если класс пытается реализовать два или более интерфейсов, имеющих метод по умолчанию с одной и той же сигнатурой.
- Добавляя метод по умолчанию к интерфейсу, каждый реализующий класс автоматически наследует это поведение. Некоторые из этих классов, возможно, не были разработаны с учетом этой новой функциональности, и это может вызвать проблемы. Например, если кто-то добавляет новый метод
default void foo()
по умолчанию к интерфейсуIx
, класс,Cx
реализующийIx
и имеющий закрытыйfoo
метод с той же сигнатурой, не компилируется.
Каковы основные причины таких серьезных изменений и какие новые преимущества (если таковые имеются) они добавляют?
@Deprecated
категории! статические методы - одна из самых злоупотребляемых конструкций в Java из-за невежества и лени. Множество статических методов обычно означает некомпетентный программист, увеличивающий связь на несколько порядков и являющийся кошмаром для юнит-тестирования и рефакторинга, когда вы понимаете, почему они плохая идея!