如何在Immutables生成的Builder中指定自定义集合MyMap?
使用Immutables库指定Builder中的自定义集合类型
方案一:通过@Style全局指定集合实现类
这种方式可以全局配置所有Map类型属性的底层实现为你的MyMap,同时保持POJO对外暴露Map接口:
- 先定义你的自定义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); } }
- 在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
相关产品推荐
相关产品推荐

