例如,像这样的构造函数:
public class Car extends Vehicle {
public Car(Car a){
super(a.getName()); //what if 'a' is null
}
}
在调用super()之前,我无法检查参数的条件。
答案 0 :(得分:2)
在这种情况下,我建议使用工厂方法:
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());
}
}
答案 1 :(得分:0)
您可以做简单
super(a != null ? a.getName() : resolveNullA())
,但是更好的解决方案是通过使用Factory的某些实现来创建Car
实例
public class VehicleFactory {
...
public Car getCar(Car anotherCar) {
if(anotherCar != null) {
return new Car(anotherCar.getName());
} else {
resolveNullAnotherCar();
}
}
...
答案 2 :(得分:0)
将检查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;
}
}
}
答案 3 :(得分:0)
我会按照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");
}