繁体   English   中英

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

[英]Parsing parameters in subclass before calling constructor of the 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语句。 我知道我不能这样做,那么在调用super()之前,那种解析参数(抛出Exception )的无痛方法是什么?

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

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

在第一次使用param时调用它

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM