2014-10-28 3 views
0

У меня есть класс контейнера и предмета, на который действует мир. Я намереваюсь, чтобы Предмет был в инвентаре Контейнера (Сбор). Большинство предметов являются подвижными (их можно поменять местами от одного контейнера к другому); другие предметы являются заметными. Каждый элемент определяет метод, 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(); 
    } 
} 

Как вы можете видеть, что я решил бросить исключение, которое я могу поймать, если класс World называет обмен на неподвижный предмет. Исключено ли исключение IllegalStateException в этом случае? Было бы лучше просто проверить isTakeable() в методе класса World перед вызовом метода swapItem()?

ответ

0

Я бы сказал, что это дизайнерское решение, и я видел несколько подходов, принятых в таких ситуациях.
Это совершенно законный случай, чтобы выбросить исключение, если вы четко документируете его для своего API.
Вы также можете указать успешность операции, возвращая значение boolean.

Рассмотрим, например, структуру Java Collections, скажем, интерфейс очереди.
Для вставки элемента есть спаренные методы:

  • offer, которая возвращает логическое значение, чтобы указать успешное выполнение (или ложь, если очередь уже была полна)
  • add, что будет сгенерировано исключение вместо
+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 содержит метод перемещения, и NonMoveableItem не делает.

Или вы можете изменить swapItem, чтобы возвращать логическое значение или int, и возвращать false или -1 или что-то, если это не сработает (Примечание: если я не ошибаюсь, boolean все равно занимает 32 бита в Java, под капотом - поэтому я часто использую int для обозначения того, как функция выходит из строя более явно, а не просто для любой ошибки).