Общая идея скрывает столько, сколько вы можете, поэтому все проще изменить. Если вам нужна индексация, например (List.get (int index), то она ДОЛЖНА быть списком, потому что коллекция не поддерживает .get (index). Если вам не нужна индексация, а затем скрывает тот факт, что вы используете список , означает, что вы можете переключиться на другие коллекции, которые впоследствии не могут быть перечислены без каких-либо проблем.
Например, возможно, через месяц я хочу использовать набор вместо списка, но Set не поддерживает .get (index). Таким образом, любой, кто использует этот Список, может использовать функции индексирования списка, и это затруднит переход к набору, потому что каждый, где кто-то еще использовал .get(), будет ломаться.
С другой стороны, чрезмерное скрытие ваших типов может привести к случайным проблемам производительности, поскольку потребитель вашего метода не знал этого типа. Предположим, вы вернули List th at на самом деле связанный список (где индексирование O (n)). Предположим, что потребитель этого списка выполняет поиск каждой записи в другом списке. Это может быть производительность O (n * m), которая очень медленная. Если вы рекламируете, что это был связанный список, в первую очередь, потребитель связанного списка понял бы, что, вероятно, не очень хорошая идея сделать несколько индексов в этом списке, и потребитель может сделать локальную копию.
код библиотеки (предположим, что один вы разрабатываете)
public class Util {
public static List<String> makeData() {
return new LinkedList(Arrays.asList("dogs", "cats", "zebras", "deer"));
}
}
код вызывающего абонента (предположим, тот, который использует вашу библиотеку или метод)
public static void main(String [] args) {
List<String> data = Util.makeData();
int [] indicesToLookUp = {1,4,2,3,0};
for(int idx : indicesToLookUp) {
if(idx < data.size()) {
// each index (LinkedList.get()) is slow O(N)
doSomethingWithEntry(idx, list.get(idx));
}
}
}
Вы можете возразить, что это вина абонента, потому что он неправильно предположил, что List является ArrayList <> и должен был сделать локальную копию списка.
Это может быть хороший ответ так, я дам вам один голос вверх. но я не мог понять значение последнего пара, в котором вы упомянули «Это может быть производительность O (n * m), которая очень медленная». Не могли бы вы дать мне несколько хороших ссылок на это, чтобы лучше понять это? – Joy
У меня нет ссылки на него, так как это анекдот моего развития. Я попытаюсь добавить пример. У меня есть больше на первых двух параграфах здесь: http://softwareengineering.stackexchange.com/questions/132019/what-is-the-value-in-hiding-the-details-through -abstractions-isnt-there-value , Они делают БОЛЬШУЮ лучшую работу, чем я. – joseph