java中只读属性通过private final字段+public getter实现,只写属性通过private字段+public setter(无getter)实现,核心是访问控制与方法暴露组合而非关键字声明。

Java 中设计只读或只写属性,核心思路是控制访问权限和方法暴露——不是靠“关键字声明属性为只读”,而是通过字段修饰符 + 方法定义组合实现语义上的只读/只写效果。下面分几种常见、实用的场景说明。
只读属性:字段 final + 仅提供 getter
这是最常用、最安全的只读方式,确保值初始化后不可变,且外部无法修改:
- 字段用 private final 声明
- 在构造器中完成初始化(必须)
- 只提供 public getter 方法,不提供 setter
- 若配合 Lombok,直接在字段上加 @Getter 即可,Lombok 自动跳过 final 字段的 setter 生成
示例:
public class User {
private final String id;
private final String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() { return id; }
public String getName() { return name; }
// 没有 setId() / setName()
}
逻辑只读:字段非 final + 无 setter + 不暴露修改入口
适用于值可能在内部被修改(如缓存、状态更新),但对外保持只读语义:
- 字段用 private(不加 final)
- 不提供任何 public setter 方法
- 如有必要,可用 package-private 或 protected setter 供内部子类/同包类使用
- Lombok 中只需标注 @Getter,不加 @Setter
示例(Lombok 风格):
@Getter
public class Order {
private String orderNo; // 外部只能 get,不能 set
private BigDecimal total; // 同上
private String status; // 同上
// 内部可通过其他业务方法更新,比如:
void updateStatus(String newStatus) {
this.status = newStatus;
}
}
只写属性(少见但有场景)
指允许外部设置值,但禁止读取(例如密码、密钥、临时 token):
- 字段用 private 声明
- 提供 public setter,但不提供 getter
- Lombok 中只加 @Setter,不加 @Getter
- 若需限制 setter 可见性(如仅内部可设),可用 @Setter(AccessLevel.PROTECTED) 或 @Setter(AccessLevel.PRIVATE)
示例:
public class User {
private String username;
@Setter(AccessLevel.PRIVATE) // 外部调用不了 setPassword()
private String password;
// 构造时或内部服务设密码,外部完全不可读不可写
}
文件级只读(补充:不是对象属性,但常被混淆)
File.setReadOnly() 是操作系统层面的文件权限标记,和 Java 对象属性无关:
- 它只是移除文件的写权限(Linux chmod -w / Windows “只读”属性)
- 不能阻止有权限的用户或进程绕过(如管理员可取消只读)
- 不提供线程安全或运行时锁定,仅作轻量防护
- 适合保护配置文件免于误删/误改,但不是设计对象只读属性的方法
正确姿势仍是:对象字段控制 + 方法封装,而非依赖文件系统。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











