Что означает "необязательная операция" в Javadoc, например, Set # add (E)?

В документации java для Set в описании метода Optional Operation указано, например. (выделение мной)

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

Что здесь означает опция?

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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