为变量分配另一个的标识

时间:2018-11-26 01:45:49

标签: java pass-by-reference identity

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

我的Item类具有一个名为amount的属性。这是指用户拥有多少种此类物品

我的ItemNode类还具有一个名为amount的属性。我希望ItemNode的数量属性始终等于其持有的Item对象的数量属性。

换句话说,(ItemNode.amount == ItemNode.item.amount)应该始终为true,即使以后我更改itemNode.amount的值。

如何使Java对ItemNode.amountItem.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 :(得分:2)

不要给您的ItemNode类一个数量字段,因为这样做会创建“平行字段”,并且必须尽力确保它们保持同步,而实际上它们很容易不同步。取而代之的是,为ItemNode类提供一个公共的getAmount()方法,该方法只需调用并返回其项目的getAmount()方法即可。如果需要setter方法,则相同。请记住,使您的代码尽可能不受白痴的影响。还要研究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;
    }
}