应根据实际需求选择是否使用getter/setter:需逻辑干预、稳定契约、接口实现时必须用;纯数据容器、不可变对象、临时dto等可省略;javascript中推荐用访问器语法提升封装性与语义清晰度。

直接暴露字段看似简单,但容易让对象失去控制力;而盲目加一堆 getter/setter,又等于把私有字段“套个壳”再公开。关键不在“用不用”,而在“为什么用”和“用在哪儿”。
需要逻辑干预时必须用
当属性读写不能只是原样赋值或返回,就得靠 getter/setter 插入校验、转换、触发事件等行为。
- setter 中做数据约束:比如年龄不能为负、邮箱格式需校验、库存不能超上限
- getter 中做懒加载:首次访问才初始化耗资源的对象,后续直接返回缓存值
- 值变更时通知监听者:如 UI 绑定场景中,修改 name 后自动刷新视图
- 读写涉及单位换算或格式化:例如内部存毫秒,getter 返回带单位的字符串“2.5s”
对外提供稳定契约时推荐用
一旦类被其他模块依赖,字段直连就锁死了实现细节。用 accessor 方法,等于留了一条“升级通道”。
- 未来想把 String name 改成 Name 对象?只需改 getter/setter 内部逻辑,调用方完全无感
- 想把字段从内存计算改为远程 API 获取?替换 getter 即可,接口签名不变
- 实现接口(如 JavaBean 或自定义 Contract)时,getter/setter 是标准约定,便于框架识别和反射操作
纯数据容器且无演进预期时可省略
不是所有类都需要长期维护或扩展。某些临时对象、DTO、配置载体,字段就是拿来读写的,加 accessor 反而增加冗余。
- JSON 映射用的 POJO(如 Spring Boot 的 @RequestBody 接收类),现代框架已支持直接绑定私有字段
- 函数式风格的不可变对象(immutable object),只提供构造器和 getter,不设 setter
- 内部工具类中的静态配置对象,生命周期短、结构固定、无外部依赖
JavaScript 中可善用访问器语法替代方法调用
JS 的 get/set 不是传统方法,而是属性级语法糖,能让逻辑封装更自然。
- fullName 这种派生属性:用 getter 计算拼接,用 setter 拆分赋值,调用端仍像普通属性一样使用
- 避免暴露下划线字段:_value 存实际值,value 属性通过 getter/setter 控制访问,语义清晰
- 配合 Object.defineProperty 定义只读、不可枚举等特性,比普通字段更精细











