Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Списки в определении типов Java: Списки

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

Рассмотрим пример, когда мы работаем с числами или строками, то определяем свойства и методы соответственно:

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.ArrayList;

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);

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 16 мая

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу