Java 为什么库存中物品的堆叠大小在使用时不会改变?

Java 为什么库存中物品的堆叠大小在使用时不会改变?,java,Java,问题: 我的程序有一个问题,当我想将库存中某个项目的堆栈大小减少1时,当按下某个按钮(例如“空格”)时,它不会改变 预期结果: 当按下“空格”时,当前项的堆栈大小应该改变 代码: 使用项目: inventory.useItem: slot.useItem: getCurrentItem: getCurrentSelection: 如果没有更多的测试,很难回答。 在以下代码中: public void useItem(Item item, int slotIndex) { if (slotsLis

问题:

我的程序有一个问题,当我想将库存中某个项目的堆栈大小减少1时,当按下某个按钮(例如“空格”)时,它不会改变

预期结果:

当按下“空格”时,当前项的堆栈大小应该改变

代码:

使用项目:

inventory.useItem:

slot.useItem:

getCurrentItem:

getCurrentSelection:


如果没有更多的测试,很难回答。 在以下代码中:

public void useItem(Item item, int slotIndex) {
if (slotsList.get(slotIndex).getItem() == item) {
    System.out.println("reach here ?");
    slotsList.get(slotIndex).useItem(item); 
}}
如果它没有在控制台上打印某些内容,肯定是因为slotsList.getslotIndex.getItem==item 这意味着您正在比较两个相同类型但引用不同的对象,而不是同一个类实例

编辑:答案

这是正确的答案。有两个步骤。首先,转到Item类并创建如下方法:

public boolean equals(Item itemToCompare)
。在该方法中,您需要做的是比较所有与它们不同的Item对象的common属性的值。例如,如果一个项目有名称,则必须执行以下操作:

public boolean equals(Item itemToCompare) {
 if (this.name.equals(itemToCompare.name))
    return true;
 else
    return false;
  }

我相信问题就在这里

public void useItem(Item item) {
    currentStack = item.getStackSize();
    currentStack--;
}
试试这个

public void useItem(Item item) {
    currentStack = item.getStackSize();
    item.setStackSize(currentStack - 1);
}
整数是不可变的,这意味着一旦生成它们就不能被改变。当你这样做的时候,它会生成一个新的对象或int值,而不是修改原来的对象或int值。因此,item中的stackSize值仍然指向旧值

不可变对象与可变对象的快速示例

class MutableFoo {

    private Object bar;

    public void setBar(Object bar) {
        this.bar = bar;
    }

    public Object getBar() {
        return bar;
    }
}
在上面的代码中,您可以使用setBar修改MutableFoo

然而,在这里无法修改ImmutableFoo,我们只能使用构造函数来设置bar的值,因此如果我们想要修改ImmutableFoo,我们需要创建一个新的

这是两者的区别

Object bar = ...
MutableFoo mFoo = new MutableFoo();
mFoo.setBar(bar);
Object newBar = ...
mFoo.setBar(newBar);


我对这一行不太清楚。。。Item/currentStack是什么类型的?某种数字?currentStack是一个int值,包含当前项的堆栈大小@hamena314@Nick查看我关于currentStack的回答,这样递减不会改变项中的值。@船长是的,我查看了你的回答,这有助于我的理解,但是,堆栈大小不会随着你的实现而改变。我不知道为什么,除非它与inventory.java中的useItem方法有关。谢谢你解释清楚的答案!!但是,在将代码更改为您所说的内容后,item.setStackSizecurrentStack-1;堆栈大小没有改变。你认为它可能与inventory.java中的我的useItem方法有关吗?@Nick我实际上认为这也是关于使用==的另一个答案检查它们是否指向内存中的同一对象。字符串s=hey,字符串s2=hey,执行s1==s2`将为false,但s1.equals2将起作用。您应该实现一种方法来检查这些项是否相等,或者再次检查它们是否实际上是相同的东西,而不是彼此的副本。当我在程序的该点使用SOPL时,不会打印任何内容。这意味着你的假设是正确的,我可能在比较两个相同的对象,但引用不同。既然是这样,我该如何正确地比较这两个对象呢?我再次回答说,方法是相等的。如果有效,请投票支持我的答案+1@Normal,你能编辑这篇文章而不是发布一篇新文章吗?它使答案不那么混乱:
public boolean equals(Item itemToCompare) {
 if (this.name.equals(itemToCompare.name))
    return true;
 else
    return false;
  }
public void useItem(Item item) {
    currentStack = item.getStackSize();
    currentStack--;
}
public void useItem(Item item) {
    currentStack = item.getStackSize();
    item.setStackSize(currentStack - 1);
}
class MutableFoo {

    private Object bar;

    public void setBar(Object bar) {
        this.bar = bar;
    }

    public Object getBar() {
        return bar;
    }
}
class ImmutableFoo {

    private Object bar;

    ImmutableFoo(Object bar) {
        this.bar = bar;
    }

    public Object getBar() {
        return bar;
    }
}
Object bar = ...
MutableFoo mFoo = new MutableFoo();
mFoo.setBar(bar);
Object newBar = ...
mFoo.setBar(newBar);
Object bar = ...
ImmutableFoo iFoo = new ImmutableFoo(bar);
Object newBar = ...
iFoo = new ImmutableFoo(newBar); // Have to make a new ImmutableFoo.