处理方法调用无效对象

时间:2014-10-28 22:17:52

标签: java exception

我有一个由世界采取行动的Container和一个Item类。我打算将一个Item放在Container的库存(Collection)中。大多数物品都是可移动的(能够从一个容器换到另一个容器);其他项目是可移动的。每个Item定义一个方法isMovable(),如果Item是可移动的,则返回true,否则返回false。当我在Container中编写方法以将项目交换到另一个Container时,在不可移动的项目上调用此swapItem()方法时处理这种情况的最佳方法是什么?

到目前为止,这是我的代码:

**
 * Used by the World class to swap the an {@link Item} between this 
 * container and another (the destination).
 *  
 * @param item The Item to be swapped to the destination
 * @param dest The destination (i.e. recipient) container
 */
public final void swapItem(Item item, Container dest){
    if (item.isTakeable()){
        this.f_contents.remove(item);
        dest.getContents().add(item);
    } else {
        throw new IllegalStateException();
    }
}

正如你所看到的,我选择抛出一个异常,如果World类调用一个不可移动的项目,我可以捕获它。 IllegalStateexception是否是在这种情况下抛出的正确异常?在调用swapItem()方法之前,简单地在World类的方法中检查isTakeable()会不会更好?

2 个答案:

答案 0 :(得分:0)

这不是一个错误的方法,但它(或许我认为)也不是一个干净的方法。

我通常只会抛出IllegalStateExceptions / IllegalArgumentExceptions / etc,如果我认为执行某些事情严重错误到达某个州的那个点。

我认为想要移动项目并将其移动到不可移动的项目是不合理的(尽管调用者首先调用isMoveable)。

我认为你可能要么有2个子类:

public class MoveableItem extends Item {
  public final void swapItem (Container dest){
    // - remove Item from src (I'm assuming if you did this, you would have a reference to src)
    // - add to dest
  }
}

public class NonMoveableItem extends Item { ... }

其中MoveableItem包含move方法,而NonMoveableItem则不包含。

或者,您可以更改swapItem以返回boolean或int,如果失败则返回false或-1或者其他内容(注意:如果我没有弄错,boolean仍然占用了Java中的32位 - 所以我经常利用int来表示函数如何更明确地失败,而不仅仅是任何失败的假。)

答案 1 :(得分:0)

我想说这是一个设计决定,我已经看到在这种情况下采取了几种方法 如果您为API明确记录异常,则抛出异常是完全合法的 您还可以通过返回布尔值来指示操作成功。

例如,考虑一下Java Collections框架,比如说Queue接口 对于元素插入,有两种方法:

  • offer将返回布尔值以指示成功(如果队列已满,则返回false)
  • add会抛出异常