java中必须用getter/setter而非public字段,因封装能校验输入、触发监听、支持懒加载等;直接暴露字段会导致npe难查、业务逻辑分散、数据校验缺失。

在类中定义 getter 和 setter,本质是把对属性的直接读写,转为受控的方法调用。这不是为了多写几行代码,而是为封装、校验、扩展和框架兼容留出空间。
为什么要用 getter 和 setter 而不是 public 字段
直接把字段设为 public 看似简单,但会带来风险:
- 外部代码可随意赋值,比如给年龄传入 -5 或 200,类自身无法干预
- 后续想加日志、触发通知、做数据转换时,必须修改所有调用点
- Spring、Jackson、Hibernate 等主流框架依赖标准 getter/setter 进行反射操作,public 字段不被识别
- 无法实现只读(只有 getter)、只写(只有 setter)或计算属性(getter 内部算值)
标准写法与命名规范
JavaBean 规范要求严格遵循命名,否则工具可能失效:
一款AI工具,主要用于Codex 通用编排:利用 `update_plan` 与后台 PTY 终端并行运行 `codex exec` 工作进程,适合需要提升相关任务效率的用户。
- 普通属性:getter 命名为 getXxx()(如
getName()),setter 为 setXxx(类型 p)(如setName(String n)) - boolean 类型推荐用 isXxx()(如
isMarried()),也可用getMarried(),但 is 更通用 - 参数名与字段名相同时,用 this.name = name 区分作用域
- 方法必须是 public,返回类型/参数类型须与字段一致
在 setter 中加入业务逻辑
setter 是校验和预处理的核心入口:
- 检查边界:如
if (age 150) throw new IllegalArgumentException("年龄无效") - 标准化输入:如自动 trim 字符串、转小写、格式化手机号
- 联动更新:设置邮箱时同步生成用户名,或修改状态时触发缓存刷新
- 避免副作用:不要在 setter 里做耗时操作(如查库、发 HTTP 请求),它应保持轻量
getter 的常见增强用法
getter 不只是“return field”,它可以更灵活:
- 返回计算结果:如
getAge()根据出生年份动态算,不存实际 age 字段 - 延迟加载:首次调用才初始化对象,如数据库连接或大列表
if (data == null) data = loadFromDB() - 返回不可变视图:如
return Collections.unmodifiableList(items),防止外部修改内部集合 - 加简单日志或监控埋点(慎用,避免影响性能)










