- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些计件工作是由不同的自定义(源代码不可用)框架完成的,这些框架返回 Map 实例。不幸的是,这些框架在返回用 Collections.unmodifiableMap 包装的 Map 实例时并不一致。为了确保我的代码具有更高程度的不变性(以便更轻松地使用多线程),我刚刚对这些框架返回的任何内容统一调用了 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 实例是否需要包装,我找不到任何方法来检测(不包括使用反射,在这种情况下这不是一个选项 - 太慢了)。
问题:
最佳答案
据我所知:
Guava的 Immutable*
集合没有这个问题。如果使用本身就是 ImmutableList
的 list
调用 ImmutableList.copyOf(list)
,则返回参数本身。此外,您可以将它们称为(并使用 instanceof
检查)Immutable*
类型而不是接口(interface),从而很容易知道您是否拥有不可变实例或不是。因此,一种选择是将框架的结果复制到这些不可变集合中,并在您自己的代码中使用它们。 (它们还具有真正不可变的优势......不可修改的包装器允许它们包装的原始可变实例在某些东西引用它时自行发生变异。)
总而言之,我不会太担心通过 1 或 2 个不可修改的包装层传递方法调用可能产生的开销,只要您不打算以某种方式一次又一次地包装它们。正如其他人指出的那样,您不太可能会因此注意到性能问题。
关于java - 传递 Collections.unmodifiable* 一个已经用 Collections.unmodifiable* 包装的实例是多么低效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4127921/
我有一些计件工作是由不同的自定义(源代码不可用)框架完成的,这些框架返回 Map 实例。不幸的是,这些框架在返回用 Collections.unmodifiableMap 包装的 Map 实例时并不一
假设我们有一个 List>并想让它完全不可修改。只需将其传递给 Collection.unmodifiableList这还不够,因为内部列表仍然可以修改。 我会采用以下方法: List> someLi
在考虑效率、代码可读性和其他标准时,公开集合的只读 View 的更好方法是什么?从效率的角度来看,使用 methodA 而不是 methodB 真的有什么区别吗?请考虑可能经常访问 list 的情况
我正在使用一个 IDE,它在一些已生成但强烈需要的库文件中生成一个版本。因此,如果我想将库与多个版本一起使用,或者我看到大量实际上毫无意义的更改,就会出现问题。 总结:我想忽略一个或多个文件的单行,我
我从https://git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F读到有关gitt中的三种状态 它在这里说Git具有文件可以驻留在其中的三个
我在使用来自 json 的 Jackson 序列化时遇到问题,如何从 Collections.unmodifiableMap 序列化? 我得到的错误是: com.fasterxml.jackson.d
这是导致问题的Streambuilder的builder方法内的代码: List users = snapshot.data; users.sort((user1, user2) => (user1.
private final Map q; public Info() { this(Collections.EMPTY_MAP); } public Info(final Map q) {
我找不到关于 Readline 选项 show-all-if-ambiguous 和 show-all-if-unmodified 之间区别的明确解释,以及是否它们影响不同的事物或相互排斥。关于这个主
我有一个不可修改的 map ( Map )。这包含一个键值对,其中值应该是一个列表,但对于特定键,值是一个空列表。 如何从 map 中删除该空列表并返回? 我已经使用谓词完成了它,它检查值是否是集合的
HTTP Spec (RFC-2616)在第 14.28 节中指出,If-Unmodified-Since header 必须由 HTTP 服务器识别,并且它只有一秒的精度。 如果资源更改频率超过每秒
您知道 If-Unmodified-Since 在野外的任何实际用途吗?来自description , 看起来这个 header 是为了帮助避免脏写。即仅当自客户端可用的最后修改时间以来未修改此资源时
我正在尝试创建一个不可变项目的不可变列表。我已经看到并尝试了 built_collection 中的 BuiltList,现在我看到了 List.unmodifiable。 它们是否等同,即使用它们我
是否有可能以文本形式获取当前 HTML 文档的源代码,与加载时完全一样? (即不是解析和 DOM 操作后的“生成的源代码”。) 注意:发出额外的 AJAX 请求以再次检索 HTML 页面在这种情况下不
我在 StatelessWidget 中有一个 ListView。它有项目,每个项目都包含一个复选框。当有人检查一个项目时,我希望 ListView 将其作为参数发送到另一个页面。但是当我这样做时,它
在 TFS 中,我正在执行以下操作。 UnShelve Pending Changes-->右键单击ShelveSet中的文件-->选择Compare-->共有三种选择: 未修改版本 带工作区版本 最
我经常运行一种验证模式,在这种模式中,某些变量必须包含前缀数量的值之一才能有效。 PSEUDO CODE: IF x == CONSTANT_1 || X == CONSTANT_2 || .
我最近将我的 Android Studio 更新到 1.0.1 并且不喜欢它表示项目结构的新方式: 如何恢复到项目 View 中显示未修改的文件系统目录布局的前一种安排? 最佳答案 查看您的第一个屏幕
在 Dart 中,如果要创建不可修改的列表,可以使用 List.unmodifiable() 或 UnmodifiableListView List list = [1, 2, 3]; List un
在 Dart 中,执行 List.unmodifiable(someList)和 Map.unmodifiable(someMap)创建一个不可修改的 查看 ,还是一个全新的独立列表/ map ?我猜
我是一名优秀的程序员,十分优秀!