Зачем нужен интерфейс в java?

Зачем нужен интерфейс в java, если в разных классах на прямую могу объявить методы с одинаковыми названиями. Я понимаю, что интерфейс как абстрактный класс или семантическая конструкция.
  • Вопрос задан
  • 19101 просмотр
Решения вопроса 2
pi314
@pi314
Президент Солнечной системы и окрестностей
Для реализации модульности и слабой связанности. Интерфейс - это, по сути, контракт (на "поставляемое" множество и сигнатуры методов).

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

Если же учесть при этом, что есть еще и абстрактные методы, становится понятно, что абстрактный класс/методы и интерфейс - инструменты для разных задач.

Классический пример правильного использования интерфейсов - явовские коллекции. Прикиньте, учитывая соображения выше, какой бы это был геморой в использовании, если бы API было сделано не через интерфейсы, а через абстрактные классы :)
Ответ написан
вот есть обсуждение В чем суть интерфейсов в программировании?
Я бы сказал что интерфейс это контракт между слоями приложения. У вас есть слои дао, сервисов, может секьюрети и ещё что-то. Между ними есть интерфейсы. А значит вы без труда можете заменить реализацию какого то слоя другой реализацией. Например нечто подобное делает спринг когда создает дополнительную прослойку для управления транзакциями над дао. Так же это бывает удобно при тестировании когда для тестов вы пишете Mock объект
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Классический пример - класс логгер. Можно просто не париться и сделать класс Logger со своей реализацией, и везде в клиентском коде (то есть тот код, который этот класс будет использовать) завязать на этот класс.

Но чу, теперь логи у нас должны храниться не в файлах а в базе, внезапно так. У нас меняется конструктор, у нас меняется реализация всех методов (предположим что у нас он один, log(string message, int level, string category);

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

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

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

А вообще, почитайте про GRASP и SOLID.
Ответ написан
@lookid
https://ru.wikipedia.org/wiki/GRASP
Одинаковые имена тут не при делах.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы