Почему библиотека коллекций Java говорит, что методы "могут генерировать" исключения вместо "будут выбрасывать"?
В [java.util.Collections][1]
в Java SE 6 написано:
"Деструктивные" алгоритмы, содержащиеся в этом классе, то есть алгоритмы, которые модифицируют коллекцию, в которой они работают, определены как
UnsupportedOperationException
если коллекция не поддерживает соответствующие мутационные примитивы, такие какset
метод. Эти алгоритмы могут, но не обязаны, генерировать это исключение, если вызов не окажет влияния на коллекцию. Например, вызов метода сортировки в неизменяемом списке, который уже отсортирован, может выдать или не выдатьUnsupportedOperationException
,
Почему он указывает, что неподдерживаемые методы "могут" генерировать исключение, вместо того, чтобы просто сказать, что они выбросят?
Я неправильно понял, читая этот абзац, я думал, что это говорит о том, что методы для объектов, возвращаемых коллекциями, могут генерировать, если они не поддерживаются. Это действительно говорит о методах в классе Collections. Так что этот вопрос недействителен. Пожалуйста, закройте / удалите этот вопрос, так как он не имеет значения.
2 ответа
Почему он указывает, что неподдерживаемые методы "могут" генерировать исключение, вместо того, чтобы просто сказать, что они выбросят?
Вы должны читать эти строки как контракт, а не как описание какого-либо конкретного объекта. Javadoc определяет правила, которым должна следовать каждая реализация; в данном конкретном случае подчеркивается свобода, которую может принять реализация.
Обновить
Ваш вопрос, по-видимому, связан с обоснованием этого контракта, поэтому позвольте мне привести один веский аргумент: как Collections.sort
знать, поддерживает ли переданная коллекция set
без фактического вызова set
? Если в договоре требуется исключение, то sort
нужно будет вставить неоперативный вызов set
просто чтобы увидеть, что происходит.
Очевидными примерами являются реализации, возвращенные, скажем, из Collections.unmodifiableCollection()
и другие подобные методы. Методы, которые могли бы изменить коллекцию, выдают это исключение.
Например, когда вы звоните Collections.unmodifiableList(list)
возвращенный список не поддерживает add(..)