当&构造函数应该如何对实例变量实施限制?

时间:2014-08-07 23:43:44

标签: java oop methods contracts

我是编程新手,并且正在学习Java作为我的第一个oo语言,通过David J. Eck编写的Java编程简介和卡住的论坛帖子。

我的问题可以被视为Java Class Constructor Parameters with range limits的后续行动,它涉及将一个Hour类的构造函数的int参数限制为0到23。

上述问题的答案提到抛出Instantiation Exception或IllegalArgumentException,但不清楚哪种风格更好。

此外,如果有的话,与验证代码相关的开销是否合理?

3 个答案:

答案 0 :(得分:4)

仅投掷IllegalArgumentException是正确的。

  

抛出以表明方法已被传递为非法或不恰当的参数。

InstantiationException用于其他目的。

  

当应用程序尝试使用类Class中的newInstance方法创建类的实例时抛出,但无法实例化指定的类对象。实例化可能由于各种原因而失败,包括但不限于:

     
      
  • 类对象表示抽象类,接口,数组类,基元类型或void

  •   
  • 该类没有无效的构造函数

  •   

InstantiationException与无法调用构造函数的反射调用有关,但IllegalArgumentException表示构造函数(或方法)被成功调用,但代码块确定了参数不合适。

最好有一点开销来验证进入构造函数(和方法)的参数。一个没有正常工作的程序或类比一个正常工作的程序更糟糕,而且速度可能会慢得多。

答案 1 :(得分:0)

关于开销

我认为没有规则,但我认为,一般来说,如果你的对象需要一个外部参数才有意义,那么在构造函数中执行这样的东西是有意义的,就像java.awt.Color对象一样@TNT在评论中说。

如果你有一些只能使用构造函数提供的参数创建的有状态对象,而没有其他setter用于相同的参数,那么这也是有意义的。

关于例外

我不能比@rgettman做得更好;-)他的回答对我来说是完全合理的

答案 2 :(得分:0)

通常,我喜欢确定传递给我的代码的对象是有效的。如果班级本身已经强制执行,我可以确定无需再次检查。基于此,我认为最好仔细验证构造函数参数并强制执行不变量,至少如果您的类和构造函数是公共的,或者可以通过大量代码访问。

如果你有一个小包和一个只在有限的上下文中使用的类,或者甚至是一个私有的内部类,那么可以更加轻松地进行验证。

我会使用IllegalArgumentException或从中派生的东西进行验证,因为该类型可以更清楚地发生了什么,并且错误与调用者有关。