我是编程新手,并且正在学习Java作为我的第一个oo语言,通过David J. Eck编写的Java编程简介和卡住的论坛帖子。
我的问题可以被视为Java Class Constructor Parameters with range limits的后续行动,它涉及将一个Hour类的构造函数的int参数限制为0到23。
上述问题的答案提到抛出Instantiation Exception或IllegalArgumentException,但不清楚哪种风格更好。
此外,如果有的话,与验证代码相关的开销是否合理?
答案 0 :(得分:4)
仅投掷IllegalArgumentException
是正确的。
抛出以表明方法已被传递为非法或不恰当的参数。
InstantiationException
用于其他目的。
当应用程序尝试使用类
Class
中的newInstance方法创建类的实例时抛出,但无法实例化指定的类对象。实例化可能由于各种原因而失败,包括但不限于:
类对象表示抽象类,接口,数组类,基元类型或
void
该类没有无效的构造函数
InstantiationException
与无法调用构造函数的反射调用有关,但IllegalArgumentException
表示构造函数(或方法)被成功调用,但代码块确定了参数不合适。
最好有一点开销来验证进入构造函数(和方法)的参数。一个没有正常工作的程序或类比一个正常工作的程序更糟糕,而且速度可能会慢得多。
答案 1 :(得分:0)
关于开销
我认为没有规则,但我认为,一般来说,如果你的对象需要一个外部参数才有意义,那么在构造函数中执行这样的东西是有意义的,就像java.awt.Color对象一样@TNT在评论中说。
如果你有一些只能使用构造函数提供的参数创建的有状态对象,而没有其他setter用于相同的参数,那么这也是有意义的。
关于例外
我不能比@rgettman做得更好;-)他的回答对我来说是完全合理的
答案 2 :(得分:0)
通常,我喜欢确定传递给我的代码的对象是有效的。如果班级本身已经强制执行,我可以确定无需再次检查。基于此,我认为最好仔细验证构造函数参数并强制执行不变量,至少如果您的类和构造函数是公共的,或者可以通过大量代码访问。
如果你有一个小包和一个只在有限的上下文中使用的类,或者甚至是一个私有的内部类,那么可以更加轻松地进行验证。
我会使用IllegalArgumentException或从中派生的东西进行验证,因为该类型可以更清楚地发生了什么,并且错误与调用者有关。