Извините, что не согласен, но я думаю, что основное правило таково:
- Для входных аргументов использовать наиболее универсальных .
- Для выходных значений, наиболее специфических .
Итак, в этом случае вы хотите объявить реализацию как:
public ArrayList<String> foo() {
return new ArrayList<String>();
}
Обоснование :
Случай ввода уже известен и объяснен всем: используйте интерфейс, точку. Тем не менее, выходной регистр может выглядеть нелогичным.
Вы хотите вернуть реализацию, потому что вы хотите, чтобы клиент имел наибольшую информацию о том, что получает. В этом случае больше знаний - больше силы .
Пример 1: клиент хочет получить 5-й элемент:
- return Collection: должен повторяться до 5-го элемента против return List:
- возврат списка:
list.get(4)
Пример 2: клиент хочет удалить 5-й элемент:
- return List: должен создать новый список без указанного элемента (
list.remove()
необязательно).
- return ArrayList:
arrayList.remove(4)
Так что большая правда в том, что использование интерфейсов великолепно, потому что оно способствует повторному использованию, уменьшает связь, улучшает удобство обслуживания и делает людей счастливыми ... но только когда используется как input .
Итак, опять же, правило можно сформулировать так:
- Будьте гибки в том, что вы предлагаете.
- Будьте информативны с тем, что вы доставляете.
Итак, в следующий раз, пожалуйста, верните реализацию.