首页 > 解决方案 > 将另一个变量的身份分配给一个变量

问题描述

我有一个 Item 类。每个 Item 对象都保存在 ItemNode 类的一个实例中。ItemNode 是我的 CustomList 类中的一个内部类。

我的 Item 类有一个名为 amount 的属性。这是指用户拥有多少该类型的项目

我的 ItemNode 类还有一个名为 amount 的属性。我希望 ItemNode 的 amount 属性始终等于它所拥有的 Item 对象的 amount 属性。

换句话说,(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;
   }
}

标签: javapass-by-referenceidentity

解决方案


不要给 ItemNode 类一个数量字段,因为这样做是在创建“并行字段”,并且必须努力确保它们保持同步,而实际上它们很容易不同步。相反,更简单地为您的 ItemNode 类提供一个公共getAmount()方法,该方法简单地调用并返回其项目的getAmount()方法。如果您需要 setter 方法,则相同。请记住使您的代码尽可能地防白痴。还要查看装饰器设计模式,因为这个问题似乎部分解决了。

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

推荐阅读