Написать эту статью меня заставило несколько факторов. Во время поисков информации о собеседованиях на должность Java developer я понял, что этот вопрос входит в десятку самых распространённых. И можно с уверенностью сказать, что вас об этом спросят!
Я также понял, что даже для людей со значительным опытом в разработке, вопрос «чем отличается абстрактный класс от интерфейса?» может стать поводом для несвязной речи и покраснения лица. Чтобы дать возможность людям избежать «этого неловкого момента» и строить грамотную архитектуру приложения я решил осветить эту тему.
Сводная таблица
Я также понял, что даже для людей со значительным опытом в разработке, вопрос «чем отличается абстрактный класс от интерфейса?» может стать поводом для несвязной речи и покраснения лица. Чтобы дать возможность людям избежать «этого неловкого момента» и строить грамотную архитектуру приложения я решил осветить эту тему.
Сводная таблица
Стоит добавить, что в Java 8 в интерфейсах может быть имплементация с ключевым словом default.
Теперь самый интересный вопрос:
в каких случаях уместно использовать абстрактный класс и интерфейс?
- Абстрактный класс уместно использовать, если вы собираетесь использовать наследование, которое будет обеспечивать общую структуру.
- Абстрактный класс также уместно использовать, если вы хотите объявить приватные экземпляры. В интерфейсах, все методы должны быть публичными.
- Если вы считаете, что в будущем вам понадобится прибегать к добавлению новых методов, тогда абстрактный класс – лучший вариант. В случае интерфейса вам необходимо будет объявлять новый метод в каждом классе, который реализует ваш интерфейс.
- Интерфейсы – хороший выбор, если вам известно, что API не будет меняться некоторое время.
- Также, для реализации «множественного наследования» кроме интерфейсов вы не найдете альтернативных решений.
Абстрактный класс в отличии от интерфейса описывает больше структуру. Обычно он определяет общее представление и обеспечивает пользователя абстрактным классом некоторым инструментарием для работы с ним, но уже в классах-потомках. Суть заключается в следующем: код, использующий абстрактный класс должен использовать его, как фундамент.
В свою очередь интерфейс позволяет сторонним разработчикам реализовать методы вашего интерфейса на свое усмотрение. Им не нужно брать во внимание особенности вашего кода, т.к. для них будет стоять иная задача: написать свою реализацию интерфейса. Им также следует брать во внимание еще один недостаток использования интерфейсов: каждый метод интерфейса – public, что может нарушать инкапсуляцию.
Заключение
Надеюсь, описанные мною различия и рекомендации в сочетании с достаточным временем на проектирование позволят вам улучшишь архитектуру своих приложений. Или ответить на дополнительные вопросы на собеседовании.
Заключение
Надеюсь, описанные мною различия и рекомендации в сочетании с достаточным временем на проектирование позволят вам улучшишь архитектуру своих приложений. Или ответить на дополнительные вопросы на собеседовании.
Комментариев нет:
Отправить комментарий