在一个字段的setter内调用另一字段setter是否可取及最优实现方案
合理性判断
你当前的写法是基本可行的,但存在两个隐藏风险:
- 类上标注的
@Setter注解会自动为shortName生成public类型的setter方法,外部调用者可以直接绕过setFullName的关联逻辑手动修改shortName,最终导致两个字段值不一致。 - 现有逻辑缺少空值、边界校验:如果传入的
fullName为null、空字符串或长度不足1,调用substring时会直接抛出空指针或索引越界异常。
最佳实现方案
根据业务需求可以分为两种场景选择方案:
场景1:允许业务侧主动覆盖shortName的值
- 保留Lombok生成的public
setShortName方法,在方法上添加@Deprecated注解并标注注释,说明该方法仅为序列化框架使用,不建议业务代码主动调用,降低误用概率。 - 在
setShortName或setFullName中补充边界校验逻辑,比如fullName为null时shortName设为null,长度不足1时设为空串。
场景2:不允许外部修改shortName,只能通过fullName计算得到
这是更推荐的方案,能从根源避免字段不一致问题:
- 给
shortName字段单独添加@Setter(AccessLevel.NONE)注解,禁止Lombok生成公共的setShortName方法,仅保留你自己实现的privatesetShortName即可。 - 补充空值和边界校验逻辑,保证代码健壮性。
额外优化建议
你提到“改用getter返回计算值的方案不可行”的原因是JSON序列化需要返回shortName字段,实际上绝大多数主流JSON序列化框架(比如Jackson、Fastjson)默认会序列化public getter方法的返回值,你完全可以删掉shortName成员字段,仅保留如下getter方法:
public String getShortName() { if (this.fullName == null || this.fullName.isEmpty()) { return null; } return this.fullName.substring(0, 1); }
序列化时框架会自动生成shortName字段,既不需要额外存储冗余字段,也彻底避免了两个字段不同步的问题,只有当你的序列化框架配置为仅序列化成员字段时才需要放弃该方案。
内容的提问来源于stack exchange,提问作者Hleb Shypula
相关产品推荐
相关产品推荐

