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