在调用超类构造函数之前验证构造函数的参数

时间:2018-11-30 21:33:03

标签: java constructor

例如,像这样的构造函数:

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

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

4 个答案:

答案 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");
}