如何为Java record中的BigDecimal类型属性设置精度?
Java Record中为BigDecimal属性设置精度的优雅方案
方案1:重写Record的紧凑构造器
这是最直接的实现方式,紧凑构造器不需要重复所有参数,写法简洁:
import java.math.BigDecimal; import java.math.RoundingMode; record WorldRecordDto(BigDecimal price) { // 紧凑构造器,仅处理需要调整精度的属性 WorldRecordDto { // 按业务需求设置精度,示例为保留4位小数,采用HALF_UP舍入模式 price = price.setScale(4, RoundingMode.HALF_UP); } }
这种方式直接在Record内部完成精度修正,无需额外类,但如果有多个BigDecimal属性,需要逐个在构造器中处理。
方案2:使用静态工厂方法(推荐大型DTO)
把精度处理逻辑封装到静态工厂方法中,Record的构造器保持默认,对外通过工厂方法创建实例,能让Record定义更简洁,维护更方便:
import java.math.BigDecimal; import java.math.RoundingMode; record WorldRecordDto(BigDecimal price) { // 静态工厂方法,封装精度处理逻辑 public static WorldRecordDto of(BigDecimal price) { BigDecimal processedPrice = price.setScale(4, RoundingMode.HALF_UP); return new WorldRecordDto(processedPrice); } } // 使用示例 WorldRecordDto dto = WorldRecordDto.of(new BigDecimal("0.000004"));
如果是大型DTO,可以把所有需要处理精度的属性逻辑集中在工厂方法里,甚至抽成工具类复用处理逻辑,避免重复代码。
方案3:自定义注解+编译时处理器(进阶复用)
如果多个Record都需要处理BigDecimal精度,可以自行实现编译时注解处理器:
- 定义自定义注解,比如
@FixedScale(scale = 4, roundingMode = RoundingMode.HALF_UP) - 编写注解处理器,在编译阶段为带有该注解的BigDecimal属性自动生成精度处理的构造器或工厂方法
这种方式一劳永逸,但需要额外开发注解处理器代码,适合多项目复用的场景。
内容的提问来源于stack exchange,提问作者user9808476
相关产品推荐
相关产品推荐

