假设我是一个彻底的懒虫,不想花费几十次按键来创建自己的异常类(实际上使用哪个并不是非常重要)。 然而,为了假装我在遵循良好的实践,我想要一个最适合我的情况的预先存在的类。
问题:当我的类的构造函数接收到一个参数对象时,如果该对象不在我在其他地方构建的给定列表中,则需要抛出异常。
哪个异常类适合用于此目的?
问题:当我的类的构造函数接收到一个参数对象时,如果该对象不在我在其他地方构建的给定列表中,则需要抛出异常。
哪个异常类适合用于此目的?
非法参数异常
在这里,IllegalArgumentException确实是答案,但是我认为您的设计存在问题。 实质上,您的类不变式依赖于某些外部对象的状态,这违反了封装原则。 没有办法确定调用构造函数是否成功,而不需要了解一些其他对象,这会导致混乱和容易被误用的API。
如果您所引用的列表是static final
不可修改的列表(请参见java.util.Collections.unmodifiableList()
),并且包含在相关类中,则可以在一定程度上缓解此问题,但我仍然不太喜欢它。 更好的方法是将可接受的参数值封装在enum
中,这将完全消除异常的需要。 我通常不喜欢从构造函数抛出异常。 如果必须抛出异常,请改用工厂方法。
如果没有任何选项可以消除外部列表的需求,那么您可能需要重新考虑您的设计。
如果您不担心类数量的爆炸,您可以为此情况扩展IllegalArgumentException
。
public class InvalidInstance extends IllegalArgumentException{
private String[] parameter;
public InvalidInstance (String[] param){
this.parameter = param;
}
public String getMessage()
String msg = "YOUR_MESSAGE";
/* I think a string as "The currente object is
invalid for parameter "+cycle for over parameter;*/
msg += super.geTMessage();
return msg;
}
public Constructor(parameter1,...){
String[] param = new String[number_parameters]
if...
throws new InvalidInstance(param);
}
如果你还没有明白,IllegalArgumentException :)