Нет, класса Queue
нет, потому что существует множество различных способов реализации очереди, и вам нужно выбрать тот, который подходит вашему варианту использования. То же самое касается любой другой коллекции в структуре коллекций - например, ArrayList
и LinkedList
оба реализуют List
. Общий шаблон, который является хорошим способом использования наследования объектов:
Интерфейс , например Queue
, определяет роль, которую вы хотите, чтобы объект играл;
Подинтерфейсы , например Deque
, дополнительно расширяет или специализирует роль - в этом случае «очередь» или двусторонняя очередь позволяет добавлять и удалять элементы с обоих концов очереди, а не только добавлять на заднюю часть и удалять из передний;
Классы обеспечивают реализацию того, как объект выполняет роль. Например, ArrayDeque
использует массив с изменяемым размером для реализации двусторонней очереди, которая имеет различные сильные и слабые стороны, чем LinkedList
, который использует связанный список.
Чтобы развить идею интерфейса как роли, отметим, что, хотя ArrayDeque
реализует Deque
, вы можете использовать его как Queue
, не беспокоясь об этом, поскольку реализация обоих интерфейсов означает, что он может играть обе роли. Точно так же, LinkedList
может носить шляпу List
, Queue
или Deque
.
По этой причине обычный (рекомендуемый) способ использования чего-либо, подобного платформе Collections, - это программирование интерфейса , то есть использование интерфейса при использовании класса, а не самого имени класса. Например, вы могли бы создать объект, подобный этому:
Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");
Таким образом, вы
- не привязан к определенному классу и может использовать замену в случае необходимости, без необходимости большого изменения кода, и
- документируют, что вы делаете с классом, называя его роль. Общий принцип, с которым это помогает, - самодокументируемый код , который, по сути, позволяет самому коду быть понятным без использования комментариев и т. Д.