Java中getter/setter规范的核心是安全读写:非布尔字段用get/set+驼峰(如getUserName),布尔字段优先用isEnabled();setter须校验与防御性拷贝,getter须防泄露(如返回不可修改集合);字段必须private,命名严格遵循JavaBeans规范以保障框架兼容。

Java 中 getter 和 setter 方法的规范编写,核心目标是实现安全读写:既保障封装性,又防止状态泄露、非法赋值和并发隐患。不能只满足“能编译”,而要让每个方法都成为数据边界的守门人。
命名必须严格遵循 JavaBeans 规范
框架(如 Spring、Jackson)和反射工具依赖这套约定识别属性。错一个字母就可能静默失败。
- 非布尔字段(如
private String userName)→ getter 写getUserName(),setter 写setUserName(String userName);不能是getusername()或GetUserName() - 布尔原始类型字段(如
private boolean enabled)→ 优先用isEnabled(),setter 仍为setEnabled(boolean enabled);若用getEnabled(),部分工具可能无法识别 - 字段含连续大写字母(如
private String XMLData)→ getter/setter 保持原大小写:getXMLData(),不是getXmlData() - 字段名含下划线或数字(如
max_retry_count)不属于规范命名,应先重命名为maxRetryCount,再生成getMaxRetryCount()
setter 要做校验与防御性拷贝
setter 是外部修改内部状态的唯一入口,必须在这里拦截非法输入,并切断可变对象的引用链。
- 对基本类型和不可变类(
String、LocalDateTime、BigDecimal)可直接赋值,但需校验业务规则(如年龄 ≥ 0 且 ≤ 150) - 对集合、数组、Map 等可变对象,必须深拷贝或包装为不可修改视图:
this.tags = Collections.unmodifiableList(new ArrayList(tags)); - 禁止在 setter 中执行耗时或副作用操作(如发 HTTP 请求、更新数据库),那是业务方法的职责
- 参数为 null 时,根据语义决定抛
IllegalArgumentException还是设默认值,不能默默接受
getter 要防内部状态泄露
看似只读的方法,若返回可变对象引用,调用方就能绕过封装直接改你的私有字段。
立即学习“Java免费学习笔记(深入)”;
- 集合类一律不返回原始引用:
❌return items;→ 外部可items.add(...)破坏封装
✅return Collections.unmodifiableList(items);或return new ArrayList(items); - 对于自定义可变对象(如
private Address address),返回新副本:return new Address(this.address);(需确保其构造支持深拷贝) - getter 内避免复杂计算或远程调用;如需懒加载,应加同步控制或使用
volatile+ 双检锁 - 敏感字段(如密码、token)可考虑不提供 getter,或返回脱敏值(
"***")
其他关键实践细节
这些细节常被忽略,却直接影响代码健壮性和协作效率。
- 字段必须声明为
private,且在类体顶部显式定义;未声明就写 getter/setter 会编译报错 - setter 方法体内必须用
this.name = name明确区分成员变量和参数,避免name = name这类无效赋值 - 根据语义可省略 getter 或 setter:只读字段(如创建时间)只写 getter;只写字段(如验证码)只写 setter
- 推荐用 IDE 自动生成(IntelliJ → Generate → Getter and Setter),但生成后务必人工检查校验逻辑与防御拷贝是否到位
- 如追求简洁,可用 Lombok 的
@Getter/@Setter或@Data,它在编译期注入符合规范的方法,框架完全兼容


















