2
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()

4

2 回答 2

8

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

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

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

super("Rectangle", Double.parseDouble(validate(param).parameters[0]),

这个技巧可以快速解决问题,但是,正如另一位发帖人所指出的,有时最好重构您的 API(例如创建工厂方法)。

于 2010-08-13T23:17:09.220 回答
5

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

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

于 2010-08-13T23:16:29.297 回答