2

我正在使用java 不可变库

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

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

  • 如果我遇到具有不同值的同一个键,我想用新值覆盖旧值。
  • 如果我遇到具有相同值的相同键,我想忽略它。
4

1 回答 1

2

生成的构建器故意这样做是为了防止(实际上是及早检测到)意外的错误输入和复制粘贴错误。在这方面,它实际上模仿了 Guava 的行为ImmutableMap.Builder(实际上在内部使用并导致此错误)。

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

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

于 2017-01-09T09:20:11.503 回答