На примере коллекций, мы первый раз столкнулись с типами данных, которые завязаны на интерфейс и имеют несколько его реализаций. Определение свойств и методов с такой структурой отличается от того, как мы до этого работали с примитивными типами.
Рассмотрим пример, когда мы работаем с числами или строками, то определяем свойства и методы соответственно:
class Point {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
Здесь мы указываем ровно тот тип, про который мы думаем. Применим такой же подход к спискам. Создадим класс пользователя, у которого есть возможность добавлять друзей:
import java.util.ArrayList;
class User {
private ArrayList<User> friends;
public ArrayList<User> getFriends() {
return friends;
}
public void setFriends(ArrayList<User> friends) {
this.friends = friends;
}
}
Пока все выглядит отлично, но посмотрите на возможный пример использования.
import java.util.List;
var user = new User();
var friends = List.of(new User(), new User());
user.setFriends(friends); // Упс
Этот код не скомпилируется, потому что тип переменной friends
будет List<User>
, а не ArrayList<User>
как ожидается. Правильным выходом из этой ситуации будет завязка не на конкретную реализацию ArrayList
, а на интерфейс List
.
import java.util.List;
class User {
private List<User> friends;
public List<User> getFriends() {
return friends;
}
public void setFriends(List<User> friends) {
this.friends = friends;
}
}
Почему именно так? Фактически в этом и есть смысл интерфейсов. Реализация может поменяться, но код от этого меняться не должен, если интерфейс не меняется. Код выше работает с любой конкретной реализацией:
import java.util.ArrayList;
var user = new User();
var friends = new ArrayList<User>();
friends.add(new User());
friends.add(new User());
user.setFriends(friends);
Сегодня мы решили использовать ArrayList
, а завтра захотели поменять его на LinkedList
, потому что так будет эффективнее. Код по-прежнему будет работать:
import java.util.LinkedList;
var user = new User();
var friends = new LinkedList<User>();
friends.add(new User());
friends.add(new User());
user.setFriends(friends);
Дополнительные материалы

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.