如何为Immutables构建器同时生成公共默认构造函数与静态工厂方法?
实现Immutables构建器同时支持公共默认构造函数和静态工厂方法
完全可以通过Immutables的@Style注解属性组合来实现你的需求!下面是具体的配置方案和代码示例:
关键配置要点
你需要在自定义的@Style注解中设置以下几个核心属性:
defaultBuilder = true:这是让Builder类生成公共无参构造器的关键,正好满足DynamoDbEnhanced客户端的要求。builder = "builder":指定生成的静态工厂方法名为builder,这样你可以通过Customer.builder()的方式初始化构建器。visibility = Style.ImplementationVisibility.PUBLIC:确保生成的Builder类是公共可见的,保证外部代码(包括DynamoDb客户端)能访问到它的默认构造器。buildMethodName = "build":保持默认的构建方法名称,无需额外调整。
代码示例
首先定义你的自定义Style注解:
import org.immutables.value.Value.Style; @Style( builder = "builder", defaultBuilder = true, visibility = Style.ImplementationVisibility.PUBLIC, buildMethodName = "build" ) public @interface CustomerStyle {}
然后在你的Immutable接口上使用这个Style:
import org.immutables.value.Value; @CustomerStyle @Value.Immutable public interface Customer { String name(); int age(); // Immutables会自动生成这个静态builder方法,无需手动实现 static ImmutableCustomer.Builder builder() { return ImmutableCustomer.builder(); } }
验证两种构建方式
现在你可以同时使用两种方式创建Customer实例:
- 公共默认构造器方式(满足DynamoDbEnhanced需求):
Customer customer = new ImmutableCustomer.Builder() .name("Joe") .age(21) .build();
- 静态工厂方法方式(符合你的使用偏好):
Customer customer = Customer.builder() .name("Joe") .age(21) .build();
为什么这样配置有效
defaultBuilder = true会让Immutables为生成的Builder类添加一个公共的无参构造函数,这正是DynamoDbEnhanced客户端所要求的。builder = "builder"配置会让Immutables在你的Customer接口的实现类上生成一个静态的builder()方法,方便你以更简洁的方式初始化构建器。- 公共可见性配置确保了无论是直接new Builder还是调用静态方法,外部代码都能正常访问到所需的类和方法。
内容的提问来源于stack exchange,提问作者Zack U
相关产品推荐
相关产品推荐

