最佳实践:如何判断集合/ set / let是否是Guava ImmutableSet / Immutable映射?

时间:2012-06-16 19:52:21

标签: java guava

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

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

4 个答案:

答案 0 :(得分:10)

  

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

如果您知道,如果返回的列表是可变的,那么您应该将其复制到可变集合中。如果返回的列表是另一个ArrayList,则副本的成本最低 - 它会降低到快速System.arraycopy

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

如果您必须在运行时检查,请使用instanceof ImmutableMapImmutableCollection或其他任何相应的内容。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分: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()方法可能会抛出。

答案 3 :(得分:0)

'instanceof'绝对没问题。

但如果可能,我建议在方法签名中使用ImmutableList而不是List。由于ImmutableList在语法中是List,但实际上ImmutableList会在UnsupportedOperationException时调出addXXX()removeXXX()clear()会被调用。