Java 为一个变量指定另一个变量的标识
我有一个项目类。每个Item对象都保存在ItemNode类的一个实例中。ItemNode是我的CustomList类中的一个内部类 我的Item类有一个名为amount的属性。这是指用户拥有该类型项目的数量 我的ItemNode类还有一个名为amount的属性。我希望ItemNode的amount属性始终等于它所持有的Item对象的amount属性 换句话说,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
(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类提供一个publicgetAmount()
方法,该方法只调用并返回其项的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类提供一个publicgetAmount()
方法,该方法只调用并返回其项的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;
}
}