Какие объекты обычно содержатся в плейлисте в Java
Что проверяют
Это задача на объектное моделирование, а не на знание особой библиотеки: в стандартной Java никакого «плейлиста» нет. Интервьюер смотрит, как вы выделяете сущности, выбираете коллекцию и разделяете данные и поведение. Следом обычно просят добавить перемешивание, повтор или перенос трека на другую позицию.
Как отвечать
Начните с сущностей:
- трек: неизменяемый объект значения. С Java 16 удобно взять
record Track(String id, String title, String artistId, Duration duration). Длительность черезjava.time.Duration, а неintбез единиц; - исполнитель и альбом: отдельные сущности, трек ссылается на них по идентификатору, а не хранит строку с именем;
- плейлист: название, владелец и упорядоченный список треков;
- элемент плейлиста: если трек может встретиться дважды и нужна дата добавления, заведите
PlaylistEntryсо своим идентификатором вместо гологоTrack.
Выбор коллекции объясните явно. ArrayList сохраняет порядок, допускает дубли и даёт быстрый доступ по индексу, для плейлиста это обычный выбор. LinkedHashSet подходит, если дубли запрещены. Наружу список отдают копией через List.copyOf() или обёрткой Collections.unmodifiableList(), чтобы порядок менялся только методами самого плейлиста: add, remove, move.
Воспроизведение вынесите в отдельный класс Player с текущей позицией и режимом: enum для обычного порядка, повтора и перемешивания. Перемешивают через Collections.shuffle() над копией списка индексов, чтобы исходный порядок плейлиста не терялся. Обход удобно выразить через Iterator, а режимы через паттерн «Стратегия».
Где спотыкаются
Кладут play() и pause() прямо в класс Song. Трек это данные, состояния воспроизведения у него нет, и такую модель неудобно тестировать.
Отдают из геттера внутренний List. Любой вызывающий код может очистить плейлист в обход проверок.
Реализуют equals() у трека по названию. Две песни с одинаковым названием у разных исполнителей начинают считаться одной, и remove() удаляет не ту.