Java 这两种不同价值观的原因是什么?

Java 这两种不同价值观的原因是什么?,java,state,transition,state-machine,Java,State,Transition,State Machine,我正在尝试制作一个自治状态机。下面是我的代码。它所做的是将状态转换为ROBBINGBANK,然后检查值的更改以及是否需要更改状态。在每个州,它都会增加或减少价值。但当我测试它时,它不会给出错误。但它复制了财富价值;我的意思是,changeState中的值与RobbleStats中的值不同。这就是为什么它总是保持在相同的状态。现在我知道问题,但不知道解决办法。有人能帮忙吗 State st = State.ROBBINGBANK; public enum State {

我正在尝试制作一个自治状态机。下面是我的代码。它所做的是将状态转换为ROBBINGBANK,然后检查值的更改以及是否需要更改状态。在每个州,它都会增加或减少价值。但当我测试它时,它不会给出错误。但它复制了财富价值;我的意思是,changeState中的值与RobbleStats中的值不同。这就是为什么它总是保持在相同的状态。现在我知道问题,但不知道解决办法。有人能帮忙吗

State st = State.ROBBINGBANK;
    public enum State {

        ROBBINGBANK,
        HAVINGGOODTIME,
        FLEEING,
        LAYINGLOW,
        CAUGHT
    }

    public void changeState() throws InterruptedException {
        BankRobber br = new BankRobber();
        while (st != State.CAUGHT) {
            if (st == State.ROBBINGBANK) {
                // got rich
                if (wealth >= 5000 && strength > 0) {
                    st = State.HAVINGGOODTIME;
                } // got tired
                else if (strength <= 0) {
                    st = State.LAYINGLOW;
                } // spotted cop
                else if (distanceToCop <= 20 && strength > 0) {
                    st = State.FLEEING;
                }
            } else if (st == State.HAVINGGOODTIME) {
                // got poor
                if (wealth <= 500 && strength > 0) {
                    st = State.ROBBINGBANK;
                } // spotted cop
                else if (distanceToCop <= 20 && strength > 0) {
                    st = State.FLEEING;
                } // got tired
                else if (strength <= 0) {
                    st = State.LAYINGLOW;
                }
            } else if (st == State.FLEEING) {
                // feel safe
                if (distanceToCop >= 50 && strength > 0) {
                    st = State.ROBBINGBANK;
                } // got tired
                if (strength <= 0) {
                    st = State.LAYINGLOW;
                }
            } else if (st == State.LAYINGLOW) {
                // feel safe
                if (distanceToCop >= 50 && strength > 0) {
                    st = State.ROBBINGBANK;
                }
            }
            else if(distanceToCop <= 0){
                st = State.CAUGHT;
            }
            br.robberStats();
            Thread.sleep(2000);
        }
    }

    public void robberStats() {
        if (st == State.ROBBINGBANK) {
            if (distanceToCop >= 20 && strength >= 8) {
                distanceToCop -= 20;
                strength -= 8;
            } else if (distanceToCop >= 20) {
                distanceToCop -= 20;
            } else if (strength >= 8) {
                strength -= 8;
            }
            wealth += 1000;
        } else if (st == State.HAVINGGOODTIME) {
            if (distanceToCop >= 10 && strength >= 2) {
                distanceToCop -= 10;
                strength -= 2;
            } else if (distanceToCop >= 10) {
                distanceToCop -= 10;
            } else if (strength >= 2) {
                strength -= 2;
            }
            wealth -= 150;
        } else if (st == State.FLEEING) {
            if (strength >= 4) {
                strength -= 4;
            }
            wealth -= 100;
            distanceToCop += 10;
        } else if (st == State.LAYINGLOW) {
            strength += 10;
        }

        System.out.println("wealth: " + wealth);
        System.out.println("strength: " + strength);
        System.out.println("distanceToCop: " + distanceToCop + "\n");
    }
State st=State.ROBBINGBANK;
公共枚举状态{
ROBBINGBANK,
过得很愉快,
逃跑,,
放低,
抓住了
}
public void changeState()引发InterruptedException{
银行劫匪br=新银行劫匪();
while(st!=State.catch){
if(st==州ROBBINGBANK){
//发财
如果(财富>=5000和强度>0){
st=州。拥有美好时光;
}//累了
否则如果(强度0){
st=州立银行ROBBINGBANK;
}//累了
如果(强度=50&&强度>0){
st=州立银行ROBBINGBANK;
}
}
否则如果(距离toop=20和强度>=8){
距离toop-=20;
强度-=8;
}else if(距离toop>=20){
距离toop-=20;
}否则,如果(强度>=8){
强度-=8;
}
财富+=1000;
}else if(st==State.HAVINGGOODTIME){
如果(距离上限>=10和强度>=2){
距离toop-=10;
强度-=2;
}else if(距离toop>=10){
距离toop-=10;
}否则,如果(强度>=2){
强度-=2;
}
财富-=150;
}else if(st==州逃跑){
如果(强度>=4){
强度-=4;
}
财富-=100;
距离toop+=10;
}else if(st==State.LAYINGLOW){
强度+=10;
}
System.out.println(“财富:+wealth”);
System.out.println(“强度:+强度”);
System.out.println(“distanceToCop:+distanceToCop+”\n);
}

这并没有回答你的主要问题,但你说你很欣赏建设性的批评…:)

我建议您对每个状态使用一个对象,而不是使用一个改变状态的对象。这将把你的逻辑分成容易阅读的小部分

我建议不要对状态使用枚举,因为这会使您以后更难可靠地更改/添加状态,并降低代码的灵活性。但是,如果为状态转换定义接口,则可以使状态实现该接口,然后将逻辑移到状态枚举上。这样就可以了,因为您可以打开它来添加接口的新实现,而不必强制将它们添加到枚举中

我还建议在编写代码使其通过之前,一个接一个地编写自动化测试。这样,您就不会达到代码无法工作的程度。它将在每一步工作,如果您进行设计更改,测试将保护您


更新:

@脆番茄

使用枚举并不排除划分状态转换逻辑。恰恰相反。它可以为该逻辑提供一个合理的位置,即将依赖于状态的逻辑放在状态对象本身(状态模式)中。Enum的问题是,它们往往与

在很多情况下,这并不重要;状态集非常稳定,可以轻松添加额外的枚举。在OP的案例中,在我看来,各州(抢劫银行、逃跑、低保等)很可能会发生变化(例如,被审讯、保释、面对陪审团、跳过保释)。通过使用一个接口,我们可以两全其美——为了方便和可读性,使用枚举,还允许任意扩展

@用户3047395


很难给出准确的建议,因为这不是我的代码。我个人倾向于避免这种类型的枚举,因为我更喜欢用它们的依赖关系构造对象,而不是通过方法传递它们。但是,为了方便地转换到状态模式,您可以从一个接口开始,该接口带有一个通过Bankrobter的方法,因此,它可以查询属性并返回新状态或返回自身。

我会在调试器中逐步检查您的代码,以了解为什么它没有达到预期效果。为什么要使用if ladders在RobbersStats()中打开枚举?初始状态是什么(财富、实力和距离)?将状态减少到2,并使状态转换尽可能简单,使其正常工作,然后在此基础上逐步增加,一次增加一点复杂性。简单的代码更容易调试。如果每次添加的代码量很小,问题代码将更容易识别。@这是因为它首先使用字符串输入来更改状态。我是用开关做的。但为了做到这一点,我去了if else。初始状态为:0、100、200如果我将每个状态设置为一个对象,我将在哪里检查我现在正在做的事情?界面是如何工作的。我不知道枚举的使用如何阻止划分状态转换逻辑。想详细说明一下吗?2.您假设目标是不惜一切代价保持灵活性,但情况并非总是如此(事实上,这种想法通常会导致系统对系统的影响)。在这种情况下,枚举也提供了好处,例如,易于识别状态。我在帖子中给出了回应。