Java 何时?;构造函数应该如何对实例变量实施限制?

Java 何时?;构造函数应该如何对实例变量实施限制?,java,oop,methods,contracts,Java,Oop,Methods,Contracts,我是编程新手,正在学习Java作为我的第一种oo语言,通过学习David J.Eck的《使用Java编程的介绍》和阅读论坛帖子 我的问题可以被看作是一个后续问题,它涉及将int参数限制在一个小时类的构造函数中,从0到23 上述问题的答案提到抛出实例化异常或IllegalArgumentException,但不清楚哪种样式更好 此外,与验证代码相关的开销何时(如果有的话)是合理的?只抛出一个错误是正确的 抛出以指示已向方法传递非法或不适当的参数 一个是为了一个不同的目的 当应用程序试图使用clas

我是编程新手,正在学习Java作为我的第一种oo语言,通过学习David J.Eck的《使用Java编程的介绍》和阅读论坛帖子

我的问题可以被看作是一个后续问题,它涉及将int参数限制在一个小时类的构造函数中,从0到23

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


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

只抛出一个错误是正确的

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

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

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

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

  • 该类没有空构造函数

InstantiationException
与未能调用构造函数的反射调用有关,但
IllegalArgumentException
表示已成功调用构造函数(或方法),但代码块确定某个参数不合适


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

关于开销

我认为没有规则,但我认为,一般来说,如果您的对象需要一个外部参数来解释,那么在构造函数中强制这样做是有意义的,就像@TNT在注释中告诉您的java.awt.Color对象一样

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

关于例外情况


我的工作再好不过了;-)他的回答对我来说完全有意义

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

如果您有一个小的包和一个只在有限的上下文中使用过的类,或者甚至有一个私有的内部类,那么对验证更加放松是可以的


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

对于记录,如果值超出某个范围,一些
java.awt.Color
类构造函数会抛出
IllegalArgumentException
(0-255或0.0-1.0,取决于使用的构造函数)。