Java 为什么是';添加';方法在AbstractCollection中不是抽象的? 公共抽象类AbstractCollection实现集合{ 公共布尔加法(E){ 抛出新的UnsupportedOperationException(); }

Java 为什么是';添加';方法在AbstractCollection中不是抽象的? 公共抽象类AbstractCollection实现集合{ 公共布尔加法(E){ 抛出新的UnsupportedOperationException(); },java,collections,abstract,Java,Collections,Abstract,方法add(E)不是抽象的,而是在扩展抽象类时抛出一个异常。采用这种方法的好处是什么?如果该方法是抽象的,它将强制重写并避免一些混淆。答案在: 如果集合由于任何原因拒绝添加某个特定元素,而不是因为它已经包含该元素,则它必须抛出异常(而不是返回false)。这将保留在该调用返回后集合始终包含指定元素的不变量 其思想是,如果方法成功执行,您就知道元素在集合中。答案在: 如果集合由于任何原因拒绝添加某个特定元素,而不是因为它已经包含该元素,则它必须抛出异常(而不是返回false)。这将保留在该调用返回

方法
add(E)
不是抽象的,而是在扩展抽象类时抛出一个异常。采用这种方法的好处是什么?如果该方法是抽象的,它将强制重写并避免一些混淆。

答案在:

如果集合由于任何原因拒绝添加某个特定元素,而不是因为它已经包含该元素,则它必须抛出异常(而不是返回false)。这将保留在该调用返回后集合始终包含指定元素的不变量

其思想是,如果方法成功执行,您就知道元素在集合中。

答案在:

如果集合由于任何原因拒绝添加某个特定元素,而不是因为它已经包含该元素,则它必须抛出异常(而不是返回false)。这将保留在该调用返回后集合始终包含指定元素的不变量


其思想是,如果方法执行成功,您就知道元素在集合中。

并非所有集合都是可变的。此默认实现使实现不可变集合变得容易。

并非所有集合都是可变的。此默认实现使实现不可变集合变得容易。

如果您试图修改任何不可修改的集合,则划行
UnsupportedOperationException
是标准行为。例如,它由集合返回的类的所有可变方法引发。不可修改包装器(当前有八个),例如,和不可变的,以及它们的所有迭代器

因此,
AbstractCollection.add(E)
抛出此异常只是为了通过提供一个有用的默认行为更容易实现不可修改的集合。您也将在所有这些方法中看到相同的行为:

(此外,默认情况下,许多方法不会故意抛出异常,但会调用这样做的方法,例如)

如果该方法变得抽象,它将强制重写并避免一些混乱

可能吧,但是有很多地方需要不可修改的行为,因此可以方便地使用默认实现。它还鼓励不可修改的集合一致地抛出异常;否则,有人可能会通过让
add
方法不做任何事而不是抛出异常来实现它,这将更令人困惑

当您想要一个可修改的集合时,只需查看您扩展的
Abstract*
基类的文档,它将始终说明您需要覆盖哪些附加方法。例如:

要实现一个不可修改的集合,程序员只需扩展这个类,并提供
迭代器
size
方法的实现。(由
迭代器
方法返回的迭代器必须实现
hasNext
next

要实现可修改的集合,程序员必须另外重写此类的
add
方法(否则会抛出
UnsupportedOperationException
),并且
iterator
方法返回的迭代器必须另外实现其
remove
方法


如果试图修改任何不可修改的集合,则抛出
UnsupportedOperationException
是标准行为。例如,它由集合返回的类的所有可变方法抛出。不可修改的包装器(当前有八个),例如,和不可变的,以及它们的所有迭代器

因此,
AbstractCollection.add(E)
抛出此异常只是为了通过提供一个有用的默认行为更容易实现不可修改的集合。您也将在所有这些方法中看到相同的行为:

(此外,默认情况下,许多方法不会故意抛出异常,但会调用这样做的方法,例如)

如果该方法变得抽象,它将强制重写并避免一些混乱

可能吧,但是有很多地方需要不可修改的行为,因此可以方便地使用默认实现。它还鼓励不可修改的集合一致地抛出异常;否则,有人可能会通过让
add
方法不做任何事而不是抛出异常来实现它,这将更令人困惑

当您想要一个可修改的集合时,只需查看您扩展的
Abstract*
基类的文档,它将始终说明您需要覆盖哪些附加方法。例如:

要实现一个不可修改的集合,程序员只需扩展这个类,并提供
迭代器
size
方法的实现。(由
迭代器
方法返回的迭代器必须实现
hasNext
next

要实现可修改的集合,程序员必须另外重写此类的
add
方法(否则会抛出
UnsupportedOperationException
),并且
iterator
方法返回的迭代器必须另外实现其
remove
方法

public abstract class AbstractCollection<E> implements Collection<E> {
    public boolean add(E e) {
        throw new UnsupportedOperationException();
    }