Вопрос-ответ

When to use: Java 8+ interface default method, vs. abstract method

Когда использовать: метод интерфейса Java 8 + по умолчанию или абстрактный метод

Java 8 допускает реализацию методов по умолчанию в интерфейсах, называемых Методами по умолчанию.

Я в замешательстве, когда бы я использовал этот вид interface default method вместо abstract classabstract method(s)).

Итак, когда следует использовать интерфейс с методами по умолчанию, а когда следует использовать абстрактный класс (с абстрактными методами)? По-прежнему ли абстрактные классы полезны в этом сценарии?

Переведено автоматически
Ответ 1

В абстрактных классах гораздо больше, чем в реализациях методов по умолчанию (таких как private state), но начиная с Java 8, всякий раз, когда у вас есть выбор из них, вы должны использовать метод defender (он же. default) в интерфейсе.

Ограничение метода по умолчанию заключается в том, что он может быть реализован только в терминах вызовов других методов интерфейса, без ссылки на состояние конкретной реализации. Таким образом, основной вариант использования - это методы более высокого уровня и удобства.

Плюсом этой новой функции является то, что если раньше вы были вынуждены использовать абстрактный класс для удобных методов, тем самым ограничивая разработчика единственным наследованием, то теперь вы можете получить действительно чистый дизайн с одним интерфейсом и минимальными усилиями программиста по реализации.

Первоначальной мотивацией для внедрения default методов в Java 8 было желание расширить интерфейсы платформы Collections с помощью методов, ориентированных на лямбда, без нарушения каких-либо существующих реализаций. Хотя это больше относится к авторам общедоступных библиотек, вы можете найти ту же функцию полезной и в вашем проекте. У вас есть одно централизованное место, где можно добавить новые удобства, и вам не нужно полагаться на то, как выглядит остальная часть иерархии типов.

Ответ 2

Есть несколько технических различий. Абстрактные классы все еще могут делать больше по сравнению с интерфейсами Java 8:


  1. Абстрактный класс может иметь конструктор.

  2. Абстрактные классы более структурированы и могут сохранять состояние.

Концептуально, основной целью методов defender является обратная совместимость после введения новых функций (в виде лямбда-функций) в Java 8.

Ответ 3

Это описывается в этой статье. Подумайте о forEach коллекциях.

List<?> list = …
list.forEach(…);

forEach еще не объявлен java.util.List ни в интерфейсе
java.util.Collection. Одним из очевидных решений было бы
просто добавить новый метод в существующий интерфейс и предоставить
реализацию, где требуется, в JDK. Однако, после публикации его
невозможно добавить методы к интерфейсу, не нарушая
существующие реализации.


Преимущество, которое приносят методы по умолчанию, заключается в том, что теперь в интерфейс можно добавить новый метод по умолчанию, и это не нарушает реализации.


Ответ 4

Как описано в этой статье,

Абстрактные классы в сравнении с интерфейсами в Java 8


После введения метода по умолчанию кажется, что интерфейсы и абстрактные классы одинаковы. Однако в Java 8 они по-прежнему представляют собой разные концепции.


Абстрактный класс может определять конструктор. Они более структурированы и с ними может быть связано состояние. В отличие от этого, метод по умолчанию может быть реализован только в терминах вызова других методов интерфейса, без ссылки на состояние конкретной реализации. Следовательно, оба используются для разных целей, и выбор между двумя действительно зависит от контекста сценария.


java java-8