我有一些由不同的自定义(源代码不可用)框架完成的部分工作,这些框架交还 Map 实例。不幸的是,这些框架在返回的 Map 实例中并不一致,这些实例已经用 Collections.unmodifiableMap 包装。为了确保我的代码具有更高程度的不变性(以便于多线程使用),我刚刚对这些框架返回的任何内容统一调用 Collections.unmodifiableMap。
Map<String, Record> immutableMap = framework.getRecordsByName();
//does this created a nested set of unmodifiableMap wrapper instances?
this.immutableField = Collections.unmodifiableMap(immutableMap);
.
.
.
Map<String, Record> maybeImmutableMap = framework.getRecordsByName();
//is there some means to get instanceof to work?
if (!(maybeImmutableMap instanceof Collections.UnmodifiableMap))
{
this.immutableField = Collections.unmodifiableMap(maybeImmutableMap);
}
我意识到我的这部分设计可能存在性能问题。在某些情况下,我调用 Collections.unmodifiableMap 向它传递一个实例,该实例已经被框架通过同一个调用包装。而且我的重新包装可能会导致整个实例的额外方法调用。
似乎使用“instanceof Collections.UnmodifiableMap”不起作用。如果我当前引用的 Map 实例需要被包装,我找不到任何方法来检测(不包括使用反射,这在这种情况下不是一个选项 - 太慢了)。
问题:
- A) Collections.unmodifiableMap() 方法是否检查它是否传递了 UnmodifiableMap 的实例,如果是,则返回相同的引用(从而避免在调用该方法之前需要检查)?
- B)为了主动避免接收到修改异常,有没有办法查询一个Map实例(除了使用反射)来检测它是否可变(或不可变)?
- C) 如果 A 的答案是否定的,那么 JVM/HotSpot 中是否有一些效率可以消除通过多个方法跃点调用以到达核心实例的开销?