3

我的代码中有一个错误,我正在尝试修改一个实际上是从客户端程序/程序员传入的 Guava ImmutableList 的列表。

对此进行测试的最佳方法是什么,而不是在 .add() 失败时等待异常?

4

4 回答 4

10

对此进行测试的最佳方法是什么,而不是在 .add() 失败时等待异常?

如果您不知道返回的列表是否可变,则无论如何都应该将其复制到可变集合中。如果返回的列表是另一个列表ArrayList,则复制的成本是最低的——它会以极快的速度减少System.arraycopy

(也就是说,客户端库有时返回可修改列表,有时返回不可修改列表本身就是一种邪恶行为。)

如果您必须在运行时检查,请使用instanceof ImmutableMaporImmutableCollection或任何合适的。

于 2012-06-16T21:54:18.183 回答
4

对于特定的 Guava,您可以检查实例是否为 com.google.common.collect.ImmutableCollection。

if (list instanceof com.google.common.collect.ImmutableCollection) {
   // is immutable
}

对于不可变地图,您需要检查实例是否为com.google.common.collect.ImmutableMap

于 2012-06-16T20:00:04.023 回答
2

检查列表是否是 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() 方法可能会抛出。

于 2012-06-16T19:59:35.320 回答
0

' 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.

于 2012-06-17T10:26:17.247 回答