簡體   English   中英

用 toBuilder() 替換 AutoValue 中的 ImmutableMap 鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM