Как избежать проверки на ноль - ООП

1

Я делаю игру, и у меня есть класс Tile, который содержит Item.

public clas Tile{
    Item item;
    ....
    public void setItem(Item item){
         this.item = item;
    }

}

Когда у меня есть ссылка на Tile, я хочу вызвать метод interact() для элемента. Как я могу это сделать, не проверяя, является ли объект null. Я не думаю, что шаблон Null Object будет работать в этом сценарии, потому что будет смешанное объединение экземпляров - подкласс элемента, который будет представлять пустой элемент, будет иметь метод empty interact().

  • 1
    Я не понимаю вашу причину не использовать шаблон нулевого объекта. Нулевой объект должен быть не реактивным, или , по крайней мере , разумно, через его интерфейс. В любом случае, если у вас нет флажка, который указывает, есть ли у элемента элемент (в основном дублирующий нулевой элемент), я не вижу других вариантов. Думаю, я не понимаю, что не так с элементом NoItem .
  • 0
    Потому что это сплоченность смешанного экземпляра
Показать ещё 5 комментариев
Теги:
oop
design

2 ответа

1

Вы пытаетесь найти способ не проверить, является ли объект нулевым, когда null является опцией.

В этом случае, чтобы проверить, если item != null item.interact(), перед выполнением item.interact() не является анти-шаблоном или хакерским решением.

0

Стереотипическое решение проблемы объединения смешанных экземпляров заключается в создании подклассов (и убедитесь, что суперкласс не предоставляет специфические для подкласса функции).

Таким образом, вы создаете подкласс ItemTile и NonItemTile для Tile.

public abstract class Tile {
    public abstract void interact();
}

public class ItemTile extends Tile {
    private final Item item;
    ....
    public ItemTile(Item item) {
        // Null-check to enforce contract - could be omitted if you make this
        // the responsibility of the caller.
        if (item == null)
           throw new NullPointerException("item");
        this.item = item;
    }

    public void interact() {
        item.interact();
    }
}
  • 0
    Я не думаю, что это сработает, потому что предмет может быть поднят, и это нарушит контракт для ItemTile
  • 0
    Это звучит актуально. Вы должны указать это в вопросе, чтобы люди могли принять это во внимание при ответе на вопрос

Ещё вопросы

Сообщество Overcoder
Наверх
Меню