Java 处理对无效对象的方法调用

Java 处理对无效对象的方法调用,java,exception,Java,Exception,我有一个容器和一个项目类,它们是由一个世界作用的。我希望某个项目在容器的库存集合中。大多数物品是可移动的,可以从一个容器交换到另一个容器;其他项目是可移动的。每个项都定义了一个方法isMovable,如果项是可移动的,则返回true,否则返回false。当我在容器中编写将一个项交换到另一个容器的方法时,当对一个不可移动的项调用这个swapItem方法时,处理这种情况的最佳方法是什么 以下是我目前的代码: ** * Used by the World class to swap the an {

我有一个容器和一个项目类,它们是由一个世界作用的。我希望某个项目在容器的库存集合中。大多数物品是可移动的,可以从一个容器交换到另一个容器;其他项目是可移动的。每个项都定义了一个方法isMovable,如果项是可移动的,则返回true,否则返回false。当我在容器中编写将一个项交换到另一个容器的方法时,当对一个不可移动的项调用这个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();
    }
}

如您所见,我选择抛出一个异常,如果世界级调用不可移动项上的swap,我可以捕获该异常。在这种情况下,IllegalStateexception是要抛出的正确异常吗?在调用swapItem方法之前,简单地检查世界级方法中的isTakeable是否更好

这不是一个错误的方法,但在我看来也不是一个干净的方法

我通常只抛出IllegalStateExceptions/IllegalArgumentExceptions/等,如果我认为某个状态的执行出现了严重错误

我认为想要移动一个项目并将其移动到一个不可移动的项目是不合理的,尽管调用者应该首先调用isMoveable

我认为您可能有两个子类Item:

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
  }
}

其中MoveableItem包含移动方法,而NonMoveableItem不包含


或者,您可以将swapItem更改为返回布尔或int,如果失败,则返回false或-1或其他注意:如果我没有弄错的话,boolean在Java中仍然占用32位,因此我经常利用int更明确地表示函数如何失败,我认为这是一个设计决策,在这种情况下,我已经看到了几种方法。 如果您清楚地为API记录了异常,则抛出异常是完全合法的。 您还可以通过返回布尔值来指示操作成功

例如,考虑Java集合框架,比方说队列接口。 对于图元插入,有两种方法:

若队列已满,则返回布尔值以指示成功或错误 这将抛出一个异常
谢谢你的反馈!
public class NonMoveableItem extends Item { ... }