java org.immutables 图书馆:地图中的所有重复插入
java org.immutables library: all duplicate insertion in map
我正在使用 java immutables library。
@Value.Immutable
public interface Foo {
Map<Integer, String> getBar();
}
ImmutableFoo.builder().putBar(1, "asdf").putBar(1, "ghjk").build()
导致重复键错误。有什么办法可以避免这种情况吗?
- 如果我碰巧遇到具有不同值的同一个键,我想
用新值覆盖旧值。
- 如果我遇到同样的情况
具有相同值的密钥,我想忽略它。
生成的生成器有意这样做是为了防止(实际上及早发现)意外的错误输入和复制粘贴错误。在这方面,它实际上模仿了 Guava 的 ImmutableMap.Builder
的行为(实际上是在内部使用,并为这个错误负责)。
要解决您的问题,处理此问题的最佳方法是创建您自己的哈希映射,以任意顺序和任意数量的 duplicated/overriding 条目填充它,然后使用 builder.putAllBar(hashMap)
在值对象创建期间应用它并将其转换为不可变映射。
另一种选择是选择不使用 Guava,然后生成的代码将使用常规 HashMap
并为不可变对象创建包裹在 Collection.unmodifiableMap
中的防御副本。使用 @Value.Style(jdkOnly = true)
仅使用 JDK 提供的集合(在此处阅读有关样式的更多信息:http://immutables.github.io/style.html)。通过在构建器中使用常规哈希映射,您将避免重复键错误。
我正在使用 java immutables library。
@Value.Immutable
public interface Foo {
Map<Integer, String> getBar();
}
ImmutableFoo.builder().putBar(1, "asdf").putBar(1, "ghjk").build()
导致重复键错误。有什么办法可以避免这种情况吗?
- 如果我碰巧遇到具有不同值的同一个键,我想 用新值覆盖旧值。
- 如果我遇到同样的情况 具有相同值的密钥,我想忽略它。
生成的生成器有意这样做是为了防止(实际上及早发现)意外的错误输入和复制粘贴错误。在这方面,它实际上模仿了 Guava 的 ImmutableMap.Builder
的行为(实际上是在内部使用,并为这个错误负责)。
要解决您的问题,处理此问题的最佳方法是创建您自己的哈希映射,以任意顺序和任意数量的 duplicated/overriding 条目填充它,然后使用 builder.putAllBar(hashMap)
在值对象创建期间应用它并将其转换为不可变映射。
另一种选择是选择不使用 Guava,然后生成的代码将使用常规 HashMap
并为不可变对象创建包裹在 Collection.unmodifiableMap
中的防御副本。使用 @Value.Style(jdkOnly = true)
仅使用 JDK 提供的集合(在此处阅读有关样式的更多信息:http://immutables.github.io/style.html)。通过在构建器中使用常规哈希映射,您将避免重复键错误。