假设有一个名为 的 Java 类Car
,其对象通过静态工厂进行初始化:
public class Car {
private String name;
private Car(String name){//...}
public static Car createCar(String name){
//mechanism to validate the car attributes
return new Car(name);
}
}
当然,我想将验证过程提取到一个名为CarValidator
.
有两种方法可以将此验证器提供给工厂:
不可存根/可模拟验证器:
public static Car createCar(String name){
new CarValidator(name); // throw exception for instance if invalid cases
return new Car(name);
}
可存根/可模拟验证器:
public static Car createCar(CarValidator carValidator, String name){ //ideally being an interface instead
carValidator.validate();
return new Car(name);
}
它在这里看起来像一个冗余: CarValidator
已经包含name
值,因为它将Car
参数存储为自己的字段(先验最干净的方式),因此我们可以绕过第二个参数,如下所示:
public static Car createCar(CarValidator carValidator){
carValidator.validate();
return new Car(carValidator.getName());
}
但是,这看起来还不清楚……为什么 a 会从 a =>Car
中找到它的值没有意义。Validator
所以,我们可以这样重构:
public static Car createCar(CarValidator carValidator, String name){
carValidator.validate(name); // throwing exception for instance if invalid cases
return new Car(carValidator.name());
}
听起来不那么奇怪,但CarValidator
失去了创建字段而不是将参数传递给每个必要的私有方法的好处,例如:
private checkForCarName(String name);
我应该选择哪种方法?