2015-08-03 3 views
0

Любой пользователь, который хотел бы получить доступ к объекту java.util.ArrayList, должен выполнить договор об использовании, указанный в java.util.List.Почему методы trimToSize/securityCapacity обеспечивают доступ к «общедоступному» уровню?

Но один может разорвать этот договор об использовании легко и доступ к методам trimToSize

public void trimToSize() { ... } 

и ensureCapacity

public void ensureCapacity(int minCapacity) { ...} 

Поскольку эти два метода не являются ни переопределяется из java.util.AbstractList ни осуществлялся с java.util.List.

Итак, почему эти два метода обеспечивают доступ к уровню public и нарушают абстракцию, предоставляемую java.util.List?

+2

Эти методы являются дополнительной функциональностью. Я не думаю, что они нарушают какой-либо контракт в 'java.util.List', поскольку все эти функции также (предположительно) правильно реализованы. Как вы думаете, как они нарушают контракт? – msandiford

+2

Каким образом абстракция, предоставляемая 'java.util.List',« сломана »этими методами« ArrayList »? Это похоже на то, что собаки «ломают абстракцию« млекопитающих », потому что они могут лаять, а лай не является частью абстракции« млекопитающее ». –

+0

Итак, вы говорите, что подклассы никогда не должны расширять интерфейс своих суперклассов публичными методами? – Smutje

ответ

4

В некоторых случаях эффективность может стоить больше, чем абстракция данных. ensureCapacity может использоваться для предварительного распределения внутреннего буфера один раз, когда вы собираетесь добавить известное количество элементов. trimToSize может использоваться, когда вы не собираетесь добавлять больше элементов в свободную потраченную память. Оба метода не применимы к другим реализациям List, поэтому они добавляются только к ArrayList.

Обратите внимание, что обычно создается список и изначально заполняется одним методом, который знает, какая реализация используется. Таким образом, это не нарушает абстракции. Например, рассмотрим такой код:

public List<String> createList() { 
    ArrayList<String> list = new ArrayList<>(); 
    // populate the list 
    list.trimToSize(); 
    return list; 
} 

Таким образом, вы можете сохранить память и еще вернуть List interace.

2

Ничего здесь не работает List Контракт. ArrayList - это конкретная реализация List, и если ваша программа имеет определенные требования к производительности, которые достаточно важны для вас, чтобы отказаться от абстракции от использования List, нет причин не позволять вам использовать определенные методы для настройки поведения ArrayList.

Смежные вопросы