简介
"删除设置方法"(Remove Setting Method)重构手法用于保护对象的不变性。当某个字段在初始化后不应被修改时,应该移除其公开的赋值方法,强制通过构造函数进行初始化。
典型代码坏味道
- 存在公开的字段设置方法
- 字段在生命周期内不应改变
- 字段仅在构造函数中初始化
- 存在不安全的可变状态
重构步骤
-
识别可变字段
- 找到具有公开setter的字段
- 分析字段修改场景
- 确认字段的不可变需求
-
限制字段修改
- 将setter方法改为private
- 或直接删除setter方法
- 添加final修饰符
-
调整初始化
- 在构造函数中完成赋值
- 使用工厂方法控制创建
- 处理子类初始化需求
-
验证与测试
- 检查所有赋值路径
- 验证序列化/反序列化
- 确保线程安全性
示例
重构前:
class BankAccount {
private String accountNumber;
public void setAccountNumber(String number) {
this.accountNumber = number;
}
}
重构后:
class BankAccount {
private final String accountNumber;
public BankAccount(String number) {
this.accountNumber = number;
}
}
专项练习
基础练习
-
重构用户身份类
class User { private String id; public void setId(String id) { this.id = id; } }
进阶练习
-
处理集合字段
class Catalog { private List<Product> products = new ArrayList<>(); public void setProducts(List<Product> products) { this.products = products; } }
代码审查清单
优势验证
- 对象不变性提升100%
- 消除意外状态变更
- 增强线程安全性
风险提示
- 需要修改对象创建方式
- 可能影响反射操作
- 需要处理继承体系中的final字段