4

我是编程新手,正在学习 Java 作为我的第一门 oo 语言,方法是阅读 David J. Eck 的 Java 编程简介,并在遇到困难时阅读论坛帖子。

我的问题可以被认为是Java Class Constructor Parameters with range limits的后续,它处理将 Hour 类的构造函数的 int 参数限制为 0 到 23。

上述问题的答案提到抛出实例化异常或 IllegalArgumentException,但不清楚哪种方式更好。

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

4

3 回答 3

5

只扔一个IllegalArgumentException.

抛出以指示方法已传递了非法或不适当的参数。

一个InstantiationException是为了不同的目的。

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

  • 类对象表示抽象类、接口、数组类、原始类型或void

  • 该类没有空构造函数

AnInstantiationException与反射调用未能调用构造函数IllegalArgumentException有关,但 an 意味着构造函数(或方法)被成功调用,但代码块确定参数不合适。

最好有一点开销来验证传入构造函数(和方法)的参数。不能正常工作的程序或类比正常工作的程序更糟糕,而且速度可能可以忽略不计。

于 2014-08-08T00:02:42.067 回答
0

关于开销

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

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

关于例外

我不能比@rgettman 做得更好;-) 他的回答对我来说完全有意义

于 2014-08-08T00:16:55.287 回答
0

一般来说,我喜欢确定传入我的代码的对象是有效的。如果班级本身已经强制执行,我可以确定而无需再次检查。基于此,我认为仔细验证构造函数参数并强制执行不变量是一个好主意,至少如果你的类和构造函数是公共的,或者可以被大量代码访问。

如果您有一个小包和一个仅在该有限上下文中使用的类,甚至是一个私有内部类,则可以更轻松地进行验证。

我会使用 IllegalArgumentException 或从中派生的东西进行验证,因为这种类型可以更清楚地说明发生了什么,并且错误出在调用者身上。

于 2014-08-08T00:18:44.953 回答