Java 为一个变量指定另一个变量的标识

Java 为一个变量指定另一个变量的标识,java,pass-by-reference,identity,Java,Pass By Reference,Identity,我有一个项目类。每个Item对象都保存在ItemNode类的一个实例中。ItemNode是我的CustomList类中的一个内部类 我的Item类有一个名为amount的属性。这是指用户拥有该类型项目的数量 我的ItemNode类还有一个名为amount的属性。我希望ItemNode的amount属性始终等于它所持有的Item对象的amount属性 换句话说,(ItemNode.amount==ItemNode.item.amount)应该始终为true,即使稍后我更改了ItemNode.amo

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

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

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

换句话说,
(ItemNode.amount==ItemNode.item.amount)
应该始终为true,即使稍后我更改了
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;
   }
}

不要给ItemNode类一个amount字段,因为这样做是在创建“并行字段”,并且必须尽力确保它们保持同步,而事实上它们很容易失去同步。相反,更简单的是,为ItemNode类提供一个public
getAmount()
方法,该方法只调用并返回其项的
getAmount()
方法。如果需要setter方法,则相同。记住要尽可能使你的代码不致于白痴。同时也要研究一下装饰设计模式,因为这个问题似乎已经部分解决了

public interface Amountable {

    int getAmount();

    void setAmount(int amount);

}

public类ItemNode实现了Amountable{
私人物品;
公共项节点(T项){
this.item=项目;
}
@凌驾
公共整数getAmount(){
return item.getAmount();
}
@凌驾
公共无效设置金额(整数金额){
项目.设定金额(金额);
}    
公共T getItem(){
退货项目;
}
}

不要为ItemNode类提供金额字段,因为这样做是在创建“平行字段”,必须尽力确保它们保持同步,而事实上它们很容易失去同步。相反,更简单的是,为ItemNode类提供一个public
getAmount()
方法,该方法只调用并返回其项的
getAmount()
方法。如果需要setter方法,则相同。记住要尽可能使你的代码不致于白痴。同时也要研究一下装饰设计模式,因为这个问题似乎已经部分解决了

public interface Amountable {

    int getAmount();

    void setAmount(int amount);

}

public类ItemNode实现了Amountable{
私人物品;
公共项节点(T项){
this.item=项目;
}
@凌驾
公共整数getAmount(){
return item.getAmount();
}
@凌驾
公共无效设置金额(整数金额){
项目.设定金额(金额);
}    
公共T getItem(){
退货项目;
}
}

1)不要为ItemNode提供金额字段。相反,只需让ItemNode中的
getAmount()
方法返回它所持有的项的值。不多不少。装饰设计模式可能正是您想要的。但这不允许我同时更改
ItemNode.amount
Item.amount
。这是因为您不应该同时更改这两种模式,也不应该同时更改这两种模式。1)不要给ItemNode一个amount字段。相反,只需让ItemNode中的
getAmount()
方法返回它所持有的项的值。不多不少。装饰设计模式可能正是您所寻找的。但这不允许我同时更改
ItemNode.amount
Item.amount
。这是因为您不应该同时更改这两种模式,也不应该同时更改这两种模式。GM Eels先生。无关问题:我看到你的活动档案显示61K张“投票”。只是想知道:我的理解是,这个数字显示了所有的投票。。。在未删除的内容上。现在我很好奇你是怎么得到这个数字的?前几周,我做了很多近距离的评论(从队列中),但似乎这些项目中有很多都是迟来的。。。关闭,然后删除。因此,计数器的增长非常缓慢。换句话说:你有什么特定的“模式”吗?通用汽车公司的鳗鱼先生。无关问题:我看到你的活动档案显示61K张“投票”。只是想知道:我的理解是,这个数字显示了所有的投票。。。在未删除的内容上。现在我很好奇你是怎么得到这个数字的?前几周,我做了很多近距离的评论(从队列中),但似乎这些项目中有很多都是迟来的。。。关闭,然后删除。因此,计数器的增长非常缓慢。换言之:你有什么特定的“模式”吗?
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;
    }
}