Присвоение переменной идентичности другого - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть класс предметов.Каждый объект Item содержится в экземпляре класса ItemNode.ItemNode - это внутренний класс в моем классе CustomList.

Мой класс Item имеет атрибут с именем amount.Это относится к тому, сколько из этого типа Item принадлежит пользователю

Мой класс ItemNode также имеет атрибут с именем amount.Я хочу, чтобы атрибут количества элемента ItemNode всегда равнялся атрибуту количества объекта Item, который он содержит.

Другими словами, (ItemNode.amount == ItemNode.item.amount) всегда должно быть истинным, даже если позже я изменю значение itemNode.amount.

Как сделать так, чтобы Java имела одинаковые идентификаторы для ItemNode.amount и Item.amount?

Мой класс ItemNode:

/**
 * Creates nodes to hold Item objects.
 */
private class ItemNode {
   // the object being held by the node
   private Item item;
   // The type of the object
   private String typeName;
   // How many are owned by the player
   private int amount;
   // What the item-subclass's name is
   private String itemName;
   // the node after this
   private ItemNode next;

   ItemNode(Item item) {

      this.data = item;
      this.typeName = typeName;
      this.itemName = item.getItemName();
      this.amount = item.getAmount();
      this.next = null;
   }
}

1 Ответ

0 голосов
/ 26 ноября 2018

Не давайте вашему классу ItemNode поле количества, поскольку при этом вы создаете «параллельные поля» и должны приложить все усилия, чтобы убедиться, что они остаются синхронизированными, хотя на самом деле они могут легко потерять синхронизацию.Вместо этого и намного проще просто предоставьте классу ItemNode открытый getAmount() метод, который просто вызывает и возвращает метод getAmount() своего элемента.То же самое, если вам нужны методы установки.Не забудьте сделать свой код максимально идиотским.Также обратите внимание на шаблон проектирования Decorator, поскольку эта проблема, кажется, частично решается этим.

public interface Amountable {

    int getAmount();

    void setAmount(int amount);

}

public class Item implements Amountable {
    private int amount;

    public Item(int amount) {
        this.amount = amount;
    }

    @Override
    public int getAmount() {
        return amount;
    }

    @Override
    public void setAmount(int amount) {
        this.amount = amount;
    }

}

public class ItemNode<T extends Amountable> implements Amountable {
    private T item;

    public ItemNode(T item) {
        this.item = item;
    }

    @Override
    public int getAmount() {
        return item.getAmount();
    }

    @Override
    public void setAmount(int amount) {
        item.setAmount(amount);
    }    

    public T getItem() {
        return item;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...