使用什么异常来防止一个方法被多次调用?

14j*_*lla 2 java assert exception

我有一个在对象的生命周期内只应调用一次的方法。为了确保是这种情况,该方法在 Object 中设置了一个布尔标志,true以便稍后检查该方法是否已经运行。IllegalArgumentException如果在单个对象的生命周期内第二次调用此方法,我目前正在抛出(带有描述性消息),但这对我来说感觉不太正确,因为问题实际上不在于参数本身。有没有比 an 更好的例外IllegalArgumentException

assert在这种情况下我选择不使用语句,因为类和方法都是在包外可见的,所以问题可能是由我的包外的代码引起的。这是正确的想法吗?

mik*_*ike 5

扔一个IllegalStateException

但是由于异常不应该是普通控制流的一部分,您应该添加一个伴随方法,它返回一个布尔值,指示对该方法的下一次调用是否会成功。

这种伴随方法的一个例子是Iterator#hasNext()

设计良好的 API 不得强迫其客户端对普通控制流使用异常。具有只能在某些不可预测的条件下调用的“状态相关”方法的类通常应该有一个单独的“状态测试”方法,指示是否适合调用状态相关方法。例如,Iterator 接口有状态依赖方法 next 和对应的状态测试方法 hasNext。1

1:来自 Effective Java,第 9 章:异常