Что означает «необязательная операция» в Javadoc, например, Set # add (E)? - PullRequest
12 голосов
/ 04 декабря 2011

Когда в документации Java для указан , в спецификации метода указано Optional Operation, например. (выделено мной)

добавить (E e)
Добавляет указанный элемент к этому набору, если он еще не существует (необязательная операция) .

Что означает необязательный здесь?

Что, если я использую JVM, отличную от SUN / Oracle, эта операция может не обеспечиваться этой реализацией Java?

Ответы [ 3 ]

7 голосов
/ 04 декабря 2011

Set - это интерфейс. Классы, реализующие этот интерфейс, не обязательно должны предоставлять реализацию для необязательной операции.

Я думаю, что эти дополнительные операции возвращаются к общему интерфейсу Collection, где операции сделаны необязательными, что не имеет смысла для некоторых видов коллекций. Например. add - это операция, которая не очень полезна для некоторой коллекции, доступной только для чтения. Он четко прописан в Javadoc, поэтому он становится частью того, что предлагают все классы коллекций, но кто-то, использующий его, знает, что, учитывая некоторую коллекцию, которую он точно не знает, может случиться так, что метод просто выдает UnsupportedOperationException.

3 голосов
/ 04 декабря 2011

Из документации java.util.Collections :

«Деструктивные» методы, содержащиеся в этом интерфейсе, то есть методы, которые изменяют коллекцию, в которой они работают, задаются как исключение UnsupportedOperationException, если эта коллекция не поддерживает операцию.В этом случае эти методы могут, но не обязаны, генерировать исключение UnsupportedOperationException, если вызов не окажет влияния на коллекцию.Например, вызов метода addAll (Collection) для неизменяемой коллекции может, но не обязательно, вызывать исключение, если добавляемая коллекция пуста.

Обратите внимание, что многие из описанных методов не необязательно.

Платформа коллекций Java, возможно, не идеальна;это может быть одним из недостатков, поднимающих его (крошечную) головку.

1 голос
/ 04 декабря 2011

То, что метод интерфейса указан как необязательно в JavaDoc, означает, что классы, реализующие этот интерфейс, не обязательно должны реализовывать этот метод.Вместо этого они могли бы, например, бросить исключение.

Более конкретно, то, что метод интерфейса необязательный в JavaDoc, не означает, что это поведение, зависящее от реализации.Каждая конкретная реализация класса будет указывать, реализует ли он его или нет.Глядя на класс HashMap , он включает в себя операцию добавления и не определяет ее как необязательную.Таким образом, каждая реализация библиотеки Java должна включать реализацию этого метода для своего класса HashMap.То же самое относится к TreeMap и т. Д.

Причина, по которой может иметь смысл объявить эту операцию как необязательную , заключается в том, что некоторые наборы могут быть концептуально неизменными, например, возвращаемые Collections.unmodifiableSet

...