为什么我的两个变量的比较 if 语句不起作用?
Why won't my comparative if statement of two variables work?
在下面的一段代码中,一旦执行,它将根据随机数生成器更改对象 hek
的状态 diet
。我还有一个 undo()
函数,它在 运行 时间内工作得很好。
我想做的是:当对象的状态发生变化时,之前的状态 prevDiet
等于改变后的状态 currentDiet
,我希望程序调用 undo()
.
import java.util.Random;
import javax.swing.JOptionPane;
public class changeDietCom implements Command {
Hek hek;
Random rand = new Random();
int x;
DietBehaviour prevDiet;
DietBehaviour currentDiet;
public changeDietCom(Hek hek) {
this.hek = hek;
}
public void execute() {
x = rand.nextInt(3) + 1;
prevDiet = hek.getDietBehaviour();
if (x == 1) {
hek.setDietBehaviour(new Enemies());
JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);
currentDiet = hek.getDietBehaviour();
hek.performDiet();
if (prevDiet == currentDiet) {
JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
undo();
}
}
else if (x == 2) {
hek.setDietBehaviour(new ArmouredKnights());
JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);
currentDiet = hek.getDietBehaviour();
hek.performDiet();
if (prevDiet == currentDiet) {
JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
undo();
}
}
else if (x == 3) {
hek.setDietBehaviour(new BigMac());
JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);
currentDiet = hek.getDietBehaviour();
hek.performDiet();
if (prevDiet == currentDiet) {
JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
undo();
}
}
}
public void undo() {
JOptionPane.showMessageDialog(null, "Undoing diet change...", "Undoing Diet Change", JOptionPane.INFORMATION_MESSAGE);
hek.setDietBehaviour(prevDiet);
hek.performDiet();
}
}
但是只要前一个状态 prevDiet
和当前状态 currentDiet
在 运行 期间彼此相等,if
语句就不会 return 是的,我不明白为什么不呢?有人可以解释一下为什么以及如何解决这个问题吗?
需要说明的是,我在这部分程序的设计中使用了命令模式。
DietBehavior
对象是对象类型,不能用==
来比较。您要使用的是.equals()
。如果 DietBehavior
是您自己的 class 那么您将必须实施该方法,但它非常简单。
public boolean equals(Object other) {
// compare them here based on instance variables
}
使用 if (prevDiet == currentDiet) {
,您比较对象引用而不是实际值。请改用 if (prevDiet.equals(currentDiet)) {
,并确保覆盖 DietBehaviour
的 equals()
方法。
请注意,当您覆盖 equals()
时,您也应该覆盖 hashCode()
并且实现应该是一致的。可在 here.
中找到有关此的更多信息
在下面的一段代码中,一旦执行,它将根据随机数生成器更改对象 hek
的状态 diet
。我还有一个 undo()
函数,它在 运行 时间内工作得很好。
我想做的是:当对象的状态发生变化时,之前的状态 prevDiet
等于改变后的状态 currentDiet
,我希望程序调用 undo()
.
import java.util.Random;
import javax.swing.JOptionPane;
public class changeDietCom implements Command {
Hek hek;
Random rand = new Random();
int x;
DietBehaviour prevDiet;
DietBehaviour currentDiet;
public changeDietCom(Hek hek) {
this.hek = hek;
}
public void execute() {
x = rand.nextInt(3) + 1;
prevDiet = hek.getDietBehaviour();
if (x == 1) {
hek.setDietBehaviour(new Enemies());
JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);
currentDiet = hek.getDietBehaviour();
hek.performDiet();
if (prevDiet == currentDiet) {
JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
undo();
}
}
else if (x == 2) {
hek.setDietBehaviour(new ArmouredKnights());
JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);
currentDiet = hek.getDietBehaviour();
hek.performDiet();
if (prevDiet == currentDiet) {
JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
undo();
}
}
else if (x == 3) {
hek.setDietBehaviour(new BigMac());
JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);
currentDiet = hek.getDietBehaviour();
hek.performDiet();
if (prevDiet == currentDiet) {
JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
undo();
}
}
}
public void undo() {
JOptionPane.showMessageDialog(null, "Undoing diet change...", "Undoing Diet Change", JOptionPane.INFORMATION_MESSAGE);
hek.setDietBehaviour(prevDiet);
hek.performDiet();
}
}
但是只要前一个状态 prevDiet
和当前状态 currentDiet
在 运行 期间彼此相等,if
语句就不会 return 是的,我不明白为什么不呢?有人可以解释一下为什么以及如何解决这个问题吗?
需要说明的是,我在这部分程序的设计中使用了命令模式。
DietBehavior
对象是对象类型,不能用==
来比较。您要使用的是.equals()
。如果 DietBehavior
是您自己的 class 那么您将必须实施该方法,但它非常简单。
public boolean equals(Object other) {
// compare them here based on instance variables
}
使用 if (prevDiet == currentDiet) {
,您比较对象引用而不是实际值。请改用 if (prevDiet.equals(currentDiet)) {
,并确保覆盖 DietBehaviour
的 equals()
方法。
请注意,当您覆盖 equals()
时,您也应该覆盖 hashCode()
并且实现应该是一致的。可在 here.