У этого не может быть одного ответа, поскольку это зависит от варианта использования.
И под этим я подразумеваю, что это зависит от степени гибкости, которую вы хотите иметь в своей реализации, плюс степень гибкости, которую вы хотите датьпотребители вашего API
.
Я дам вам более общий ответ.
Хотите ли вы, чтобы ваш потребитель имел только петли?Вернуть Collection<T>
.
Хотите ли вы, чтобы ваш потребитель мог получить доступ по индексу?Возврат List<T>
Хотите, чтобы ваш потребитель знал и мог эффективно проверить наличие элемента?Возврат Set<T>
и т. Д.
Тот же подход действителен для входных параметров.Какой смысл принимать List<T>
или даже конкретные классы, такие как ArrayList<T>
или LinkedList<T>
, если вы только зациклите его?Вы просто предоставляете своему коду меньше гибкости для будущих модификаций.
То, что вы делаете здесь с возвращаемыми типами IntegerGetter
наследуемых методов, называется специализация типа .Это нормально, если вы продолжаете выставлять интерфейсы внешнему миру.
Мое эмпирическое правило - это как можно более универсальное правило при работе с внешним миром и максимально конкретное, когда это возможно.реализация критических (основных) частей моего приложения, чтобы ограничить возможные варианты использования, защитить себя от злоупотребления тем, что я только что написал, и для целей документации.
То, что вы не должны абсолютноДля этого нужно использовать сравнение instanceof
или class
, чтобы определить фактический тип и выбрать разные маршруты.Это разрушает кодовую базу.