Получить доступ

Ради чего в Java 8 добавили default-методы интерфейсов?

MiddleООП
Коротко

Эволюция API без слома совместимости: добавление метода в интерфейс раньше ломало все реализации, а Collection и Iterable реализованы в бесчисленных библиотеках. Без default не появились бы stream() и forEach().

  • Это не способ получить множественное наследование состояния
  • Default-метод не может переопределить equals, hashCode, toString
  • Риск: default-реализация может не подходить конкретному классу (removeIf у синхронизированных коллекций)

А ещё Для новых API лучше проектировать интерфейс сразу полным

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

До Java 8 добавление метода в интерфейс означало, что весь код, реализующий его, перестанет компилироваться — а Collection и Iterable реализованы в бесчисленном количестве библиотек. Без default-методов появление stream() и forEach() было бы невозможно. Отсюда следует и правильное отношение к ним: это инструмент эволюции API, а не способ протащить в интерфейс полноценную реализацию. Ключевое ограничение никуда не делось — состояния у интерфейса по-прежнему нет, поля могут быть только public static final. Поэтому выбор между интерфейсом и абстрактным классом остался прежним: нужно общее изменяемое состояние — абстрактный класс, нужен контракт и множественная реализация — интерфейс.

Что хотят услышать

  • Причина появления.
  • Ограничения и риски.

Частые ошибки

  • Считать, что default-методы отменили абстрактные классы.
  • Пытаться хранить состояние в интерфейсе.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Чтобы расширять существующие интерфейсы, не ломая уже написанные реализации — например, добавить stream() и forEach() в Collection и Iterable
  • ✗Чтобы интерфейсы могли хранить изменяемое состояние
  • ✗Чтобы заменить абстрактные классы во всех сценариях
  • ✗Чтобы ускорить вызовы методов интерфейса

Что спросят дальше

  • Почему у интерфейса не может быть состояния?
  • Когда всё-таки выбирают абстрактный класс?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем