Если у меня есть переменная, содержащая a, List
она может содержать объекты разных типов, например, ArrayList
или LinkedList
. Разница между а LinkedList
и ArrayList
довольно большая. Поведение больших О методов сильно отличается. Например, сортировка List
и последующее использование его для выполнения бинарного поиска вполне подходит для, ArrayList
но не имеет смысла для a LinkedList
.
java
object-oriented-design
частокол
источник
источник
Ответы:
Я бы так не сказал.
Утечка абстракции - это та, которая заставляет вас иметь дело с деталями реализации, которые она должна абстрагировать. Но производительность всегда различается между реализациями, поэтому, если вы считаете это утечкой, то нет никаких утечек абстракций.
Если что-то объявлено как
List
без дополнительной документации, следует понимать, что просто нет никаких гарантий относительно производительности, и если вы собираетесь делать с этим что-либо чувствительное к производительности, вы должны сделать копию и работать с этим.Кроме того , не стоит забывать , что есть еще более общий интерфейс , который часто бывает достаточно функциональности и не искушать вас , чтобы сделать так много предположений о производительности:
Collection
.источник
Iterable
.Все нетривиальные абстракции, в какой-то степени, негерметичны. Тем не менее, я не совсем уверен, что это применимо здесь. :-)
Абстракции связаны с поведением. Если в поведении не указана конкретная производительность (а в Java
List
это не так), это - деталь реализации, т.е. не имеет значения.Java не позволяет вам указывать минимальную производительность для интерфейсов вне документации, и я не знаю ни одного языка, который бы это сделал - компилятору было бы невероятно сложно (невозможно?) Проверить это. Я могу увидеть несколько вариантов, если производительность является проблемой:
BinarySearchPerformantList
(yuck!) - который определяет требования к производительности различных методов.Вариант 2, вероятно, является лучшей абстракцией, но имеет дополнительные издержки.
источник
equals
для сравнения объектов.LinearSpace
и ,LogarithmicTime
а затем объявить классы , какpublic class BinarySearch : ISearchStrategy<T>, LogarithmicTime
. Другие классы могут принимать такие параметры, какpublic T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }
принудительное ограничение производительности.В Java есть интерфейс RandomAccess, который определяется как список с обычно постоянным временем произвольного доступа (O (1) get, put и т. Д.). Если вы чувствуете, что вашему модулю требуется список с этими характеристиками производительности, рассмотрите возможность использования
RandomAccess
вместоList
. Если вы не чувствуете необходимости вносить это изменение (а это делают немногие), то, возможно, List не так уж и плох.источник
Вы правы, список - это дырявая абстракция. STL использует идею концепций для моделирования этой конкретной проблемы. Чтобы использовать ваш пример,
ArrayList
моделируется итератор произвольного доступа, а LinkedList моделирует прямой итератор . Различные концепции имеют разные требования к производительности, что делает их подходящими для разных алгоритмов .источник