при программировании на Java я практически всегда, просто по привычке, пишу что-то вроде этого:
public List<String> foo() {
return new ArrayList<String>();
}
В большинстве случаев, даже не думая об этом. Теперь возникает вопрос: должен ли я всегда указывать интерфейс как возвращаемый тип? Или целесообразно использовать фактическую реализацию интерфейса, и если да, то при каких обстоятельствах?
Очевидно, что использование интерфейса имеет много преимуществ (почему он там). В большинстве случаев не имеет значения, какая конкретная реализация используется библиотечной функцией. Но, возможно, есть случаи, когда это имеет значение. Например, если я знаю, что я буду в первую очередь обращаться к данным в списке случайным образом, LinkedList
будет плохим. Но если моя функция библиотеки возвращает интерфейс, я просто не знаю. Чтобы быть в безопасности, мне даже может потребоваться скопировать список явно на ArrayList
:
List bar = foo();
List myList = bar instanceof LinkedList ? new ArrayList(bar) : bar;
но это кажется ужасным, и мои коллеги, вероятно, линчут меня в столовой. И это справедливо.
Что вы, ребята, думаете? Каковы ваши рекомендации, когда вы склонны к абстрактному решению, и когда вы раскрываете детали своей реализации для получения потенциальной выгоды?