在调用超类的构造函数之前解析子类中的参数

ple*_*siv 2 java parameters inheritance superclass

public Subclass(String[] parameters) throws IllegalArgumentException {
    super("Rectangle",
        Double.parseDouble(parameters[0]),
    Double.parseDouble(parameters[1]),
    90,
    Double.parseDouble(parameters[2]),
    Double.parseDouble(parameters[3]));
            if(parameters.length != 4) throw new IllegalArgumentException("bla, bla");
    if(parameters == null) throw new IllegalArgumentException("bla, bla");
}
Run Code Online (Sandbox Code Playgroud)

我想在调用超级构造函数之前先放这两个if语句.我知道我不能这样做,所以Exception在调用之前做出那种解析参数(抛出)的无痛方法是什么super()

Nik*_*bak 8

声明一个获取String[]并返回它的验证方法:

private static String[] validate(String[] param) {
    // do validation here
    return param;
}
Run Code Online (Sandbox Code Playgroud)

并在param第一次使用时调用它

super("Rectangle", Double.parseDouble(validate(param).parameters[0]),
Run Code Online (Sandbox Code Playgroud)

这个技巧可以快速解决问题,但是,正如另一张海报所指出的,有时最好重构你的API(比如创建一个工厂方法).


bra*_*ter 5

您可以创建工厂模式(例如抽象工厂)来创建从中获取新实例的工厂对象.然后,在调用真实子类的(私有)构造函数之前,获取新实例的工厂类方法可能会抛出错误的参数异常.

您还可以在创建和返回新实例之前使用Builder模式验证参数.您可以创建一个构建器对象(通常是一个内部类,以便它可以访问外部类的私有构造函数等),设置其属性并调用build()方法 - 该方法可以在返回新实例之前执行所需的任何验证.