为什么我的两个变量的比较 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)) {,并确保覆盖 DietBehaviourequals() 方法。

请注意,当您覆盖 equals() 时,您也应该覆盖 hashCode() 并且实现应该是一致的。可在 here.

中找到有关此的更多信息