2010-08-13 142 views
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"); 
} 

我想在调用超级构造函数之前放入这2个if语句。我知道我不能这么做,那么在调用super()之前做这种类型的参数解析(投掷Exception)有什么无痛的方式?在调用超类的构造函数之前解析子类中的参数

+0

哇!多快啊,谢谢你们!我还不熟悉工厂,但... – plesiv 2010-08-13 23:20:55

+0

这些链接将有所帮助 - Builder链接非常易于遵循。在这两种情况下,您都有效地赋予另一个类负责创建所需对象的新实例,而不是直接使用“新”关键字调用构造函数。在另一个类中,你可以做任何你想要的参数和状态验证。 – Brabster 2010-08-13 23:30:11

+0

如果参数为null或长度小于4,那么您的代码已经抛出了ArrayIndexOutofBoundsException的NullPointerException异常。这些异常不是比IllegalArgumentException更具体/详细吗? – 2010-08-14 10:45:16

回答

8

声明验证方法服用String[]并将其返回重构你的API更好(比如创建工厂方法)。

+0

验证应该用“throws”声明吗? Nvm,我会编译并查看:)。谢谢! – plesiv 2010-08-13 23:25:53

+0

@make - 'IllegalArgumentException'未被选中,所以'validate'不需要'throws'列表。 – 2010-08-13 23:46:30

+0

@Stephen C - 非常感谢!忘了那个! – plesiv 2010-08-14 00:56:02

5

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

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

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

这一招很快解决了问题,当

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

,并调用它,但是,作为另一个海报指出,有时:

+0

非常感谢! – plesiv 2010-08-14 00:55:21

+0

静态方法相对于构建器的另一个好处 – DPM 2012-02-05 20:27:43

相关问题