[英]Convert SortedSet to a TreeMap or ImmutableMap with keys as iterator position
[英]Replacing ImmutableMap keys in AutoValue with toBuilder()
將 AutoValue 與生成的 Builder 和帶有 Guava ImmutableMap 的字段一起使用時,我遇到了一個問題。
假設我們有這個 Container 值 class:
public abstract class Container {
public abstract ImmutableMap<String, String> metadata();
public abstract Builder toBuilder();
public static Builder builder() {
return new AutoValue_Container.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract ImmutableMap.Builder<String, String> metadataBuilder();
public final Builder addMetadata(String key, String value) {
metadataBuilder().put(key, value);
return this;
}
}
}
當我想要執行以下操作時,ImmutableMap 構建器會拋出java.lang.IllegalArgumentException: Multiple entries with same key
aContainer.toBuilder().addMetadata("existingKey", "someNewValue");
是否有熟悉 AutoValue 的人知道如何哄騙實現按要求執行?
builders-howto 文檔中有一個記錄在案的解決方法。 引用:
@AutoValue
public abstract class Foo {
public abstract ImmutableMap<Integer, String> map();
...
@AutoValue.Builder
public abstract static class Builder {
private final ImmutableMap.Builder<Integer, String> mapBuilder = ImmutableMap.builder();
public ImmutableMap.Builder<Integer, String> mapBuilder() {
return mapBuilder;
}
abstract Builder setMap(ImmutableMap<Integer, String> map); // not public
abstract Foo autoBuild(); // not public
public Foo build() {
setMap(mapBuilder.buildKeepingLast());
return autoBuild();
}
...
// #start
// Needed only if your class has toBuilder() method
public Builder toBuilder() {
Builder builder = autoToBuilder();
builder.mapBuilder().putAll(map());
return builder;
}
abstract Builder autoToBuilder(); // not public
// #end
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.