使用什么例外来防止多次调用方法?

时间:2017-03-07 18:46:21

标签: java exception assert

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

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

2 个答案:

答案 0 :(得分:4)

抛出IllegalStateException

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

此类伴随方法的示例是Iterator#hasNext()

  

设计良好的API不得强制其客户端使用例外   普通控制流程。具有“状态依赖”方法的类   只有在某些不可预测的条件下才能调用   通常有一个单独的“状态测试”方法,表明它是否   适合调用依赖于状态的方法。例如,   Iterator接口接下来是依赖于状态的方法   相应的状态测试方法hasNext。 1

1:来自Effective Java,第9章:例外

答案 1 :(得分:1)

除了特定的异常类型之外,你应该担心的是你在这里创建了一个糟糕的设计。

良好的界面使得做正确的事情变得容易,并且很难做错事。

含义:您当前的实现可以很容易地调用该方法两次;现在,您现在强制客户始终检查是否已调用该方法。

所以,不要把时间花在例外类型上:退一步说明如何将一个类分解为两个类。并找到一个很好的,以便调用该特定方法为您提供一个不同的对象。或者检查是否应该使用状态机来解决此问题。