例如,这样的构造函数:
public class Car extends Vehicle {
public Car(Car a){
super(a.getName()); //what if 'a' is null
}
}
在调用 super() 之前我无法检查参数的条件。
例如,这样的构造函数:
public class Car extends Vehicle {
public Car(Car a){
super(a.getName()); //what if 'a' is null
}
}
在调用 super() 之前我无法检查参数的条件。
在这种情况下,我建议使用工厂方法:
public class Car extends Vehicle {
private Car(String name){
super(name);
}
public static Car of(Car a) {
Objects.requireNonNull(a, "a is required");
return new Car(a.getName());
}
}
我会选择Illya Kysil建议的构建器方法,但是,您也可以将 null 检查委托给静态方法。
public class Car extends Vehicle {
private Car(Car car) {
super(getName(car));
}
private static String getName(Car car) {
Objects.requireNonNull(car, "Input car must be non null");
Objects.requireNonNull(car.getName(), "Input car name must be non null");
return car.getName();
}
}
主要限制是super调用必须作为第一个语句。只要表达式组合起来创建super构造函数语句,就可以运行任意的代码集(零参数的情况除外)。
在调用之后验证参数也可能同样容易super。如果基本构造函数需要很长时间才能执行并且您希望代码快速失败,这可能不是一个很好的解决方案
private Car(Car car) {
super(getName(car));
Objects.requireNonNull(car.getName(), "Input car name must be non null");
}
你可以做简单的
super(a != null ? a.getName() : resolveNullA())
但更好的解决方案是使用FactoryCar的一些实现来创建实例
public class VehicleFactory {
...
public Car getCar(Car anotherCar) {
if(anotherCar != null) {
return new Car(anotherCar.getName());
} else {
resolveNullAnotherCar();
}
}
...
而是将检查的责任委托null给超类。
public class Car extends Vehicle {
public Car (Car a) {
super(a);
}
}
public class Vehicle {
public Vehicle (Vehicle v) {
if(v != null) {
this.name = v.name;
}
}
}