我的代码中有一个错误,我正在尝试修改一个实际上是从客户端程序/程序员传入的 Guava ImmutableList 的列表。
对此进行测试的最佳方法是什么,而不是在 .add() 失败时等待异常?
对此进行测试的最佳方法是什么,而不是在 .add() 失败时等待异常?
如果您不知道返回的列表是否可变,则无论如何都应该将其复制到可变集合中。如果返回的列表是另一个列表ArrayList
,则复制的成本是最低的——它会以极快的速度减少System.arraycopy
。
(也就是说,客户端库有时返回可修改列表,有时返回不可修改列表本身就是一种邪恶行为。)
如果您必须在运行时检查,请使用instanceof ImmutableMap
orImmutableCollection
或任何合适的。
对于特定的 Guava,您可以检查实例是否为 com.google.common.collect.ImmutableCollection。
if (list instanceof com.google.common.collect.ImmutableCollection) {
// is immutable
}
对于不可变地图,您需要检查实例是否为com.google.common.collect.ImmutableMap
检查列表是否是 ImmutableCollection 子类型之一很容易:
if (list instanceof ImmutableCollection) {
// do whatever you want to do if the list is a Guava immutable collection/set/list/multiset
}
但是,这并没有为您提供确定列表是否不可变的通用解决方案(可能存在用户实现的不可变列表或从 Collections.unmodifiableList() 获得的不可修改列表)。
所以如果你想要一个通用的解决方案,你仍然必须捕获异常 list.add() 方法可能会抛出。
' instanceof
' 绝对没问题。
But if possible I would recommend use ImmutableList
in method signature instead of List
. Because ImmutableList
is-a List
in syntax, but actually ImmutableList
throws UnsupportedOperationException
when addXXX()
, removeXXX()
, clear()
is called.