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

时间:2010-08-13 23:13:48

标签: java inheritance parameters 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");
}

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

2 个答案:

答案 0 :(得分:8)

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

private static String[] validate(String[] param) {
    // do validation here
    return param;
}

首次使用param

时调用它
super("Rectangle", Double.parseDouble(validate(param).parameters[0]),

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

答案 1 :(得分:5)

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

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