Java对外暴露只读属性需满足:①字段private且final;②仅提供public规范getter,不写setter;③对可变对象返回防御性拷贝;④推荐用Lombok的@Getter配合final字段简化实现。

Java 中对外暴露只读属性,核心是“有 getter、无 setter”,同时确保字段不可被外部直接修改。这不是单纯删掉 set 方法就完事,而是一套配合访问控制、初始化约束和语义明确的设计组合。
只提供 public getter,不写 setter
这是最基础也最关键的一步。只要不声明 setXxx() 方法,外部就无法通过标准 Bean 方式修改该属性:
- 字段本身必须是
private(不能是public或包级默认) - getter 命名需规范:如字段叫
id,方法应为public Long getId() - 布尔类型可选
isXxx()(如isActive()),效果等同于getXxx()
用 final + 构造器确保不可变性
仅靠不写 setter 不足以防止内部误改或反射绕过。更稳妥的做法是把字段声明为 final,并在构造器中一次性赋值:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
private final String orderId;- 所有构造路径都必须初始化它(否则编译报错)
- 这样即使类内部其他方法也无法再修改,真正实现“只读”语义
避免 getter 返回可变对象引用
如果只读属性是集合、数组或 Date 等可变类型,直接返回原引用会导致外部偷偷修改内容。这时要防御性拷贝:
立即学习“Java免费学习笔记(深入)”;
- 返回
new ArrayList(this.items)而不是this.items - 对
Date类型,返回new Date(this.createTime.getTime()) - 使用不可变包装:如
Collections.unmodifiableList(list)
必要时配合 Lombok 简化写法
若项目已引入 Lombok,可用 @Getter 注解自动生成 getter,同时手动省略 setter,并保持字段 final:
private final BigDecimal amount;- 加上
@Getter,Lombok 就只生成getAmount() - 不加
@Setter,就不会生成任何 setter - 注意:Lombok 的
@Value默认生成全部final字段 + 只读 getter,适合纯值对象

















