Есть несколько различий при использовании интерфейса в объявлении:
- Обозначает что минимально важно. Если вам нужны специальные методы, доступные только в конкретном подклассе, объявите его как таковой.
- Позволяет менять в другой реализации (
LinkedList
или CopyOnWriteList
) с минимальными изменениями.
- Tiny штраф за исполнение из-за полиморфизма.
Учитывая вышеизложенное, объявляйте параметр метода и возвращаемые типы, используя интерфейс, чтобы скрыть несущественные детали реализации и минимизировать ограничения. Объявлять локальные переменные, используя фактический класс, только если производительность равна ultra-critical или если вам нужны дополнительные методы, которые она предоставляет. Если позже вы выберете другой конкретный класс, вам нужно будет изменить вызов на конструктор, который, вероятно, будет в той же строке, что и декларация.
Я нахожу этот аргумент немного пустым. Если я напишу 'final List l = new ArrayList ', то я, очевидно, не буду ссылаться ни на что другое, кроме 'ArrayList'. Используя 'ArrayList' как параметр или возвращаемое значение общественного метода, это ** является смертельным грехом. –
@ Марко да, это имеет смысл, если это окончательно, но в целом его нет, вот где мы воспользуемся заменой –
Да, но 90% всех местных варов (особенно типизированных в коллекции), которые вы когда-либо видели, являются окончательными по своей природе , просто никто не мешает им «финал». –