我有一个由世界采取行动的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()会不会更好?
答案 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)