2017-03-07 72 views
2

我有一个方法,应该只在对象的生命周期中调用一次。为了确保这种情况,该方法在对象中设置一个布尔型标志为true,以便稍后检查该方法是否已经运行。如果在单个对象的生命周期中第二次调用这个方法,我现在抛出一个IllegalArgumentException(带有描述性消息),但是这对我来说并不完全正确,因为问题实际上并不是与参数本身有关。是否有比IllegalArgumentException更好的例外情况?用什么异常来防止多次调用方法?

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

+7

'IllegalStateException'。您的对象处于非法状态以调用该方法,因为该标志被设置为一个值以指示不应该再次调用该方法。 –

回答

4

抛出一个IllegalStateException

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

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

设计良好的API不得强制其客户端使用普通控制流的异常。只有在某些不可预知的条件下才能调用 的“状态依赖”方法的类应该通常具有单独的“状态测试”方法,指示它是否适合调用状态依赖方法。例如,迭代器接口具有接下来的状态相关方法,并且相应的状态测试方法hasNext。

1:从有效的Java,第9章:异常

1

你应该担心的比特定的异常类型更多的是你在这里创建了一个糟糕的设计。

良好的界面可以很容易做正确的事情,很难做错事。

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

因此,不要将时间浪费在异常类型上:例如,退一步说明如何将您的一个类解析为两个类类。并找到一个很好的,所以调用具体的方法给你一个不同的对象来工作。或者检查你是否应该使用状态机来解决这个问题。

+1

我不同意。参看'hasNext'和'next'方法。 – mike

+0

有些情况下,您的建议有意义。但事实并非如此。 – GhostCat