什么是;“可选操作”;例如,在Javadoc中表示集合#add(E)?

什么是;“可选操作”;例如,在Javadoc中表示集合#add(E)?,java,set,javadoc,Java,Set,Javadoc,在java文档中,当它在方法的规范中说明可选操作时,例如(由我强调) 添加(E) 如果指定的元素尚未存在,则将其添加到此集合(可选操作) 这里的可选项是什么意思 如果我使用的是SUN/Oracle以外的JVM,那么该Java实现可能不会提供此操作 Set是一个接口。实现该接口的类不一定需要为可选操作提供实现 我认为这些可选操作可以追溯到通用的集合界面,其中的操作是可选的,对于某些类型的集合来说没有意义。例如,add是一种对某种只读集合没有实际用处的操作。它在Javadoc中有明确的说明,因此它成

在java文档中,当它在方法的规范中说明
可选操作时,例如(由我强调)

添加(E)
如果指定的元素尚未存在,则将其添加到此集合(可选操作)

这里的可选项是什么意思


如果我使用的是SUN/Oracle以外的JVM,那么该Java实现可能不会提供此操作

Set
是一个接口。实现该接口的类不一定需要为可选操作提供实现

我认为这些可选操作可以追溯到通用的
集合
界面,其中的操作是可选的,对于某些类型的集合来说没有意义。例如,
add
是一种对某种只读集合没有实际用处的操作。它在Javadoc中有明确的说明,因此它成为所有集合类提供的内容的一部分,但是使用它的人知道,对于一些他们并不确切知道的集合,可能是该方法只是从文档中抛出了一个
不支持的操作异常

此接口中包含的“破坏性”方法,即 修改其操作的集合的方法是 如果此集合 不支持该操作。如果是这样的话,这些方法 可以但不是必须抛出不支持的OperationException 如果调用对集合没有影响。例如 在不可修改的集合上调用addAll(Collection)方法 如果集合为,则可以(但不是必需)引发异常 要添加的内容为空

注意,这里描述的许多方法都不是可选的


可以说,Java集合框架并不完美;这可能是其(微小的)缺陷之一。

在JavaDoc中将接口方法指定为可选的意味着实现该接口的类不一定要实现该方法。相反,他们可以抛出一个异常

更具体地说,JavaDoc中的接口方法是可选的并不意味着它是特定于实现的行为。类的每个具体实现都将指定是否实现它。查看该类,它包含add操作,但没有将其指定为可选操作。因此,Java库的每个实现都必须为它们的
HashMap
类包含此方法的实现。这同样适用于
TreeMap


将此操作声明为可选操作可能有意义的原因是,某些集合在概念上可能是不可变的,例如

返回的集合。我明白你的意思。因此,它取决于程序中使用的具体类,而不是JVM中使用的具体类,对吧?奇怪的是,对于
Set
来说,
添加
是基本的IMO@user384706,如果您有一个
ImmutableSet
,那么如果操作不存在,则有意义。并非每个集合都是可变的(有些可能只是遵从某些其他数据源,例如,可能不可修改的数据源)。未实现此方法的类应引发异常,例如
UnsupportedOperationException
。例如,这就是不可修改集合的迭代器.remove()抛出的内容。@AlexR,它们可能抛出异常,但不是必需的。那是不同的。(参见下面Matt的回答,其中引用了Javadoc中的相关位)我找到了在和中使用可选操作而不是更多接口的设计选择的原因。你的意思是这是一个设计问题。他们只是声明了一些在某些子类上可能无用的方法,并使子类无论如何都携带它们?但是
是否为
集合添加
基本操作?哦,数据库API的情况更糟,例如
行集
结果集
,其中有未移植的操作是(a)常见的,而(b)更是PITA;)@用户384706——简而言之,是的。虽然
add
是针对
Set
的操作,但它可能不适用于
集合的另一个实现。他们能做得更好吗?也许吧,但软件是硬的,谁知道他们还受到什么其他的限制。我几乎肯定会做得更糟@user384706实际上,在某些上下文中(例如,作为数学对象),不可变集是完全正常的。另一种方法是使用不同的接口,如Set(不可变)和MutableSet(这将是它的子接口),以及整个集合接口层次结构的这种区别。然后让我们有一些支持删除但不支持添加或其他方式的集合。他们决定采用这些可选操作。