Интерфейс java.util.List
не поддерживает getLast()
, потому что дизайнеры выбрали «минимальный интерфейс». Благодаря минимальному количеству определенных методов это облегчает понимание и ускоряет изучение.
Это отличается от «гуманного интерфейса» (такого как используемый в классе массива Ruby ), который пытается предоставить методы для выполнения общих операций (например, getLast()
). Поскольку существует много применений, к которым может быть применено такое фундаментальное понятие, как список, это приводит к гораздо более широким интерфейсам.
Для получения дополнительной информации см. Минимальный интерфейс Мартина Фаулера и Гуманный интерфейс описания.
Относительно того, почему LinkedList поддерживает getLast()
и т. Д., Чтобы процитировать Javadoc:
... класс LinkedList предоставляет методы с одинаковыми именами для получения, удаления и вставки элемента в начале и конце списка. Эти операции позволяют использовать связанные списки в качестве стека, очереди или двусторонней очереди (deque).
Предположительно было высказано мнение, что общий Список не подходит для этих конкретных случаев использования.
В качестве идеи главного дизайнера API коллекций Java (Джошуа Блоха) он предоставляет этот список принципов разработки API , по которым он работает. Из которых наиболее актуальными для этого вопроса являются:
Ранние версии API должны быть короткими, обычно это одна страница с сигнатурами классов и методов и однострочными описаниями. Это позволяет легко реструктурировать API, если вы не поняли его с первого раза.
Если сомневаетесь, оставьте это. Если есть фундаментальная теорема проектирования API, то это она. Это в равной степени относится к функциональности, классам, методам и параметрам. Каждый аспект API должен быть как можно меньше, но не меньше. Вы всегда можете добавить вещи позже, но вы не можете их убрать. Минимизация концептуального веса важнее, чем подсчет классов или методов.
Держите API свободными от деталей реализации. Они вводят пользователей в заблуждение и мешают им развиваться. Не всегда очевидно, что является деталью реализации: остерегайтесь чрезмерного уточнения.
Минимизировать доступность; если сомневаешься, сделай это приватным. Это упрощает API и уменьшает связь.
Рассмотрите последствия для производительности при принятии решений по разработке API, но не деформируйте API для достижения прироста производительности. К счастью, хорошие API, как правило, пригодны для быстрой реализации.
Однако он также заявляет:
Не заставляйте клиента делать то, что может делать библиотека. Нарушение этого правила приводит к шаблонному коду в клиенте, который раздражает и подвержен ошибкам.
Это просто показывает, что рекомендации по проектированию часто конфликтуют, и самая сложная часть работы разработчиков API - это сбалансировать эти конфликты.