You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Immutables生成的Builder中指定自定义集合MyMap?

使用Immutables库指定Builder中的自定义集合类型

方案一:通过@Style全局指定集合实现类

这种方式可以全局配置所有Map类型属性的底层实现为你的MyMap,同时保持POJO对外暴露Map接口:

  1. 先定义你的自定义Map实现:
public class MyMap<K, V> extends LinkedHashMap<K, V> {
    // 提供无参构造,供Builder初始化空集合
    public MyMap() {
        super();
    }

    // 提供接收Map的构造,供Builder复制已有集合
    public MyMap(Map<? extends K, ? extends V> map) {
        super(map);
    }
}
  1. 在Immutables接口上添加@Style注解,指定Map类型的实现类:
import org.immutables.value.Value;
import java.util.Map;

@Value.Immutable
@Style(
    collectionImplementation = {
        @Style.Implementation(type = MyMap.class, of = Map.class)
    }
)
public interface MyPojo {
    Map<String, String> data();
}

生成的Builder会自动使用MyMap来构建data属性,而对外暴露的仍然是Map接口,完全不影响上层代码的使用。

方案二:通过@Value.Default针对单个属性指定

如果只需要为特定属性指定自定义集合类型,可以用@Value.Default初始化一个空的MyMap,Builder会直接复用这个集合类型:

import org.immutables.value.Value;
import java.util.Map;

@Value.Immutable
public interface MyPojo {
    @Value.Default
    default Map<String, String> data() {
        // 初始化空的MyMap,Builder会基于这个实例添加元素
        return new MyMap<>();
    }
}

这种方式下,当你调用MyPojo.builder()时,data的默认集合就是MyMap,后续调用put()或putAll()都会直接操作这个MyMap实例。

注意事项

  • 确保MyMap提供无参构造和接收Map的构造方法,Immutables需要这些构造来创建新集合或复制已有集合。
  • 两种方案都不需要使用复杂的自定义类型编码,完全满足你的需求:POJO以Map接口定义,仅Builder层使用MyMap。

内容的提问来源于stack exchange,提问作者theINtoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:35:05