构造函数何时以及如何对实例变量实施限制?

new*_*der 4 java oop methods contracts

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

我的问题可以被认为是Java 类构造函数参数的后续,其范围限制处理将 Hour 类的构造函数的 int 参数限制为 0 到 23。

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

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

rge*_*man 5

只有抛出一个IllegalArgumentException.

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

AnInstantiationException用于不同的目的。

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

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

  • 该类没有空构造函数

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

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