суббота, 5 июля 2014 г.

Отличия абстрактного класса от интерфейса в Java.


     Написать эту статью меня заставило несколько факторов. Во время поисков информации о  собеседованиях на должность Java developer я понял, что этот вопрос входит в десятку самых распространённых. И можно с уверенностью сказать, что вас об этом спросят!

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

Сводная таблица



     Стоит добавить, что в Java 8 в интерфейсах может быть имплементация с ключевым словом default.
     Теперь самый интересный вопрос:
     в каких случаях уместно использовать абстрактный класс и интерфейс?

  1. Абстрактный класс уместно использовать, если вы собираетесь использовать наследование, которое будет обеспечивать общую структуру.
  2. Абстрактный класс также уместно использовать, если вы хотите объявить приватные экземпляры. В интерфейсах, все методы должны быть публичными.
  3. Если вы считаете, что в будущем вам понадобится прибегать к добавлению новых методов, тогда абстрактный класс – лучший вариант. В случае интерфейса вам необходимо будет объявлять новый метод в каждом классе, который реализует ваш интерфейс.
  4. Интерфейсы – хороший выбор, если вам известно, что API не будет меняться некоторое время.
  5. Также, для реализации «множественного наследования» кроме интерфейсов вы не найдете альтернативных решений.
     Абстрактный класс в отличии от интерфейса описывает больше структуру. Обычно он определяет общее представление и обеспечивает пользователя абстрактным классом некоторым инструментарием для работы с ним, но уже в классах-потомках. Суть заключается в следующем: код, использующий абстрактный класс должен использовать его, как фундамент.

     В свою очередь интерфейс позволяет сторонним разработчикам реализовать методы вашего интерфейса на свое усмотрение. Им не нужно брать во внимание особенности вашего кода, т.к. для них будет стоять иная задача: написать свою реализацию интерфейса. Им также следует брать во внимание еще один недостаток использования интерфейсов: каждый метод интерфейса – public, что может нарушать инкапсуляцию.

     Заключение

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


Комментариев нет:

Отправить комментарий