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