Почему при создании нового объекта мы записываем его в переменную с типом интерфейса?
Савелий
1 уровень
Не могу до конца понять строчку public static DBObject NEO = new User().initializeIdAndName(1, "Neo")
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Barm
8 января 2022, 06:40
Это, как сказано Коллегами ранее, добавляет гибкости.
Да, это "обрезает" функционал или, как здесь принято говорить о преобразовании ссылок, сужает. Что легко лечится приведением типов.
Для наглядности можно запустить это:
0
Кирилл Java Developer
7 января 2022, 12:43полезный
Почему при создании нового объекта мы записываем его в переменную с типом интерфейса?
Таким образом переменная будет более гибкая. Переменной типа интерфейса можно присвоит любой класс, который реализует этот интерфейс. Возьмём за пример 2 переменные, одну типа List (интерфейс), а вторую типа ArrayList (конкретный класс, который реализует интерфейс List). Если создать переменную типа ArrayList, то её можно будет присвоить лишь объекту того же типа или наследнику, а вот переменную типа List можно присвоит любому объекту, которые реализуют этот интерфейс, а именно:
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector
Поэтому в большинстве случаев принято задавать переменные именно типа нужного интерфейса. Чем дальше будешь изучать язык, тем больше будешь с этой темой встречаться.
+1
Денис Enterprise Java Developer
7 января 2022, 12:37полезный
Привет. Вообще программирование на уровне интерфейса считается хорошей практикой.
Что такое интерфейс сам по себе? Это описание поведения которое гарантируется методами интерфейса.
Тут были аналогии про наследование, из серии что Кошечки и Собачки это все Животные, по этому можно хранить и кошечек и собачек в списке животных. Это примерно то же самое.
В самой задаче это конечно проиллюстрировано так себе, ведь у интерфейса вообще только один метод хранение объектов в таких переменных бессмысленно, потому как для использования их собственных аспектов нам придется приводить их обратно к типу User, но вот другой пример.
Предположим у тебя есть интерфейс Employee, у которого есть один метод doJob()
Но как ты понимаешь, рабочие бывают разные, электрики, секретарши, директора. они все могут считаться сотрудниками? Могут. И вот представь, тебе в программе нужно всех заставить работать. Вот пример как это сделать на уровне интерфейсов
.
Согласись удобно?
Согласись удобно?
+2
Савелий
7 января 2022, 13:35
спасибо
0