Java org.immutables 库:Map 中的所有重复插入



我正在使用java不可变库。

@Value.Immutable 
public interface Foo {
    Map<Integer, String> getBar(); 
}

ImmutableFoo.builder().putBar(1, "asdf").putBar(1, "ghjk").build()会导致重复键错误。有什么办法可以避免这种情况吗?

  • 如果我碰巧遇到具有不同值的相同键,我想用新值覆盖旧值。
  • 如果我碰巧遇到同样的情况具有相同值的键,我想忽略它。

生成的构建器有意这样做是为了防止(实际上及早检测到)意外的错误键入和复制粘贴错误。在这种情况下,它实际上模仿了 Guava ImmutableMap.Builder的行为(它实际上是内部使用的,并且是造成此错误的原因)。

为了解决您的问题,处理此问题的最佳方法是创建您自己的哈希映射,以任何顺序和任意数量的重复/覆盖条目填充值,然后使用 builder.putAllBar(hashMap) 应用它并在创建值对象期间将其转换为不可变映射。

另一种选择是选择不使用 Guava,然后生成的代码将使用常规HashMap,并为不可变对象创建包装在 Collection.unmodifiableMap 中的防御性副本。使用 @Value.Style(jdkOnly = true) 仅使用 JDK 提供的集合(在此处阅读有关样式的更多信息:http://immutables.github.io/style.html)。通过在构建器中使用常规哈希映射,可以避免出现重复键错误。

最新更新