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()
)的无痛方法是什么?
答案 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()
方法 - 该方法可以在返回之前进行所需的任何验证你是一个新的实例。