5

例如,这样的构造函数:

public class Car extends Vehicle {
     public Car(Car a){
         super(a.getName()); //what if 'a' is null 
     }
}

在调用 super() 之前我无法检查参数的条件。

4

4 回答 4

4

在这种情况下,我建议使用工厂方法:

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());
    }
}
于 2018-11-30T21:44:11.883 回答
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");
}
于 2018-11-30T22:01:54.140 回答
0

你可以做简单的

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();
        }
    }

    ...
于 2018-11-30T21:38:04.727 回答
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;
        }
    }
}
于 2018-11-30T21:38:29.890 回答