私有核心属性需用private修饰并遵循小驼峰命名规范;字段类型优先选用不可变或防御性包装类型;getter须无副作用、可空安全、命名精准;setter必须校验入参、防御性拷贝、禁止副作用;只读字段应声明为private final并在构造器中初始化。

用 private 修饰核心属性,本质是守住封装的第一道门;提供标准访问契约,不是简单加 get/set,而是按大厂通用规范设计可维护、可校验、可演进的接口。
核心属性必须私有且命名规范
所有业务关键字段(如用户 ID、订单状态、余额)一律用 private 修饰,并采用小驼峰命名,不带下划线、前缀或全大写:
- ✅ 正确:
private String orderNo;、private BigDecimal actualAmount;、private boolean isVerified; - ❌ 避免:
private String ORDER_NO;、private String mOrderNo;、public long id;
字段类型优先选不可变或防御性包装类型(如 LocalDateTime 而非 Date,Set<string></string> 用 ImmutableSet 或返回副本)。
Getter 必须无副作用、可空安全、命名精准
读取方法要纯粹、轻量、语义明确:
- 布尔字段统一用
isXxx()(如isActive()),禁用getActive() - 引用类型若可能为
null,getter 中不抛 NPE,而是返回默认值或空集合(如return Collections.unmodifiableList(roles);) - 不执行耗时操作(如 DB 查询、远程调用)、不修改内部状态、不触发事件
- 对敏感字段(如手机号、身份证号)可在 getter 中自动脱敏:
return StringUtils.hideMiddle(idCard, 3, 4);
Setter 必须校验入参、拒绝非法状态、支持幂等
写入入口是数据合规的关键闸口:
- 每个 setter 必须做边界/格式/业务规则校验(如年龄 ∈ [0,150]、邮箱符合 RFC 标准、状态迁移合法)
- 对集合类参数做防御性拷贝:
this.tags = new LinkedHashSet(Objects.requireNonNull(tags)); - 禁止在 setter 中修改其他字段、发消息、记录日志——这些应由业务方法统一处理
- 支持“设空”场景:若字段允许为
null,setter 应显式接受null并赋值,而非跳过
只读属性与 final 字段需明确契约
一旦初始化就不可变更的字段(如创建时间、唯一 ID),应声明为 private final:
- 仅提供 public getter,不生成 setter
- final 字段必须在构造器中完成赋值(推荐全参构造 + Builder 模式)
- 避免 Lombok 的
@Data或 IDE 自动生成 setter,防止误改破坏不变性 - 若需逻辑派生值(如“是否过期”),单独提供
isExpired()方法,不暴露计算过程











