如何在Java中管理状态更改

时间:2013-09-12 13:06:44

标签: java if-statement state

public void manage()
    {
        double speed = getSpeedfromVehicle();

        if(speed >=0 && speed <= 10)
        {
            System.out.println("Low Speed mode");
        }
        else if(speed > 10 && speed < 60)
        {
            System.out.println("Medium Speed Mode");
        }
        else if(speed >= 60)
        {
            System.out.println("High Speed Mode");
        }

    }

当车辆开始移动时,我的管理方法会针对每个速度变化进行调用。 如果速度保持在一个类别(0到10)中,我只需要输出一次输出语句,即使对于速度0到10,manage()被称为无限次,这也适用于其他速度范围。它也应该切换到其他速度范围,并且应该只打印一次速度范围。

7 个答案:

答案 0 :(得分:6)

您需要有一个变量来检查当前速度模式。我会考虑使用带有我的速度状态的枚举类作为值。每次速度范围发生变化时,都会更新本地SpeedState枚举值并在manage()方法中对其进行验证。

在我的头顶,它看起来像以下......

public enum SpeedState {
    LOW, MEDIUM, HIGH
}    


public class Drive{
    private SpeedState state;

    // Supporting code, loops, etc

    public void manage(){
        double speed = getSpeedfromVehicle();

        if((speed >=0 && speed <= 10) && state != SpeedState.LOW)
        {
           state = SpeedState.LOW;
           System.out.println("Low Speed mode");
        }
        else if((speed > 10 && speed < 60) && state != SpeedState.MEDIUM)
        {
           state = SpeedState.MEDIUM;
           System.out.println("Medium Speed Mode");
        }
        else if((speed >= 60) && state != SpeedState.HIGH)
        {
           state = SpeedState.HIGH;
           System.out.println("High Speed Mode");
        }
    }
}

答案 1 :(得分:1)

我会考虑使用State pattern。然后有一个高,低,中的状态。这样您就可以封装每个状态的行为。当您从一种状态转换到另一种状态时,您可以在转换时执行所需的操作。这是一个比循环更优雅的解决方案,并且将更容易维护。

以下是一个示例,说明如何使用状态模式来管理汽车在速度方面的状态。

package test;

public class Car {

    private int speed;
    private Speedo speedo = new LowSpeed();

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getSpeed() {
        return speed;
    }

    public void manage() {
        this.speedo = speedo.manage(speed);
    }

}

abstract class Speedo {
    private int lowRange;
    private int highRange;
    private Speedo lowState;
    private Speedo highState;

    public Speedo getLowState() {
        return lowState;
    }

    public Speedo getHighState() {
        return highState;
    }

    public int getLowRange() {
        return lowRange;
    }

    public void setLowRange(int lowRange) {
        this.lowRange = lowRange;
    }

    public int getHighRange() {
        return highRange;
    }

    public void setHighRange(int highRange) {
        this.highRange = highRange;
    }

    public abstract void onLowTransition();

    public abstract void onHighTransition();

    public Speedo manage(int speed) {
        if (speed < getLowRange()) {
            onLowTransition();
            return getLowState();
        } else if (speed > getHighRange()) {
            onHighTransition();
            return getHighState();
        } else {
            return this;
        }
    }
}

class LowSpeed extends Speedo {

    public Speedo manage(int speed) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onLowTransition() {
        // TODO Auto-generated method stub

    }

    @Override
    public void onHighTransition() {
        // TODO Auto-generated method stub

    }
}

class MidSpeed extends Speedo {

    public Speedo manage(int speed) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onLowTransition() {
        // TODO Auto-generated method stub

    }

    @Override
    public void onHighTransition() {
        // TODO Auto-generated method stub

    }
}

class HighSpeed extends Speedo {

    public Speedo manage(int speed) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onLowTransition() {
        // TODO Auto-generated method stub

    }

    @Override
    public void onHighTransition() {
        // TODO Auto-generated method stub

    }
}

这是不完整的,但它会为你提供一个良好的基础。

答案 2 :(得分:0)

只需boolean isUpdated作为您的实例变量,然后更新boolean中的if condition

在打印语句之前,只需检查布尔值是真还是假。

public class CarSpeed{

    private boolean slow;
    private boolean fast;

    public CarSpeed(){
         slow = false;
         fast = false;
    }

    public static void main(String[] args){
        .....
        .....
    }

    public void manage()
    {
        double speed = getSpeedfromVehicle();

        if(speed >=0 && speed <= 10 && slow == false)
        {
            System.out.println("Low Speed mode");
            slow = true;
        }
        else if(speed > 10 && speed < 60 && slow == false && fast == false)
        {
            System.out.println("Medium Speed Mode");
        }
        else if(speed >= 60 & fast == false)
        {
            System.out.println("High Speed Mode");
            fast = true;
        }

    }


}

答案 3 :(得分:0)

使用State枚举变量有条件地更新状态

enum SpeedMode {
    LOW, MEDIUM, HIGH
};

private SpeedMode speedMode;

public void manage() {
    double speed = getSpeedfromVehicle();

    if (speed >= 0 && speed <= 10 && speedMode!=SpeedMode.LOW) {
        speedMode=SpeedMode.LOW;
        System.out.println("Low Speed mode");
    } else if (speed > 10 && speed < 60 && speedMode!=SpeedMode.MEDIUM) {
        speedMode=SpeedMode.MEDIUM;
        System.out.println("Medium Speed Mode");
    } else if (speed >= 60 && speedMode!=SpeedMode.HIGH) {
        speedMode=SpeedMode.HIGH;
        System.out.println("High Speed Mode");
    }

}

答案 4 :(得分:0)

又一个简单的例子:

公共课CarSpeed {

enum Speed {
    SLOW("Slow"),MEDIUM("Medium"),FAST("Fast");
    String speedString;
    Speed(String speedString) {
        this.speedString = speedString;
    }
    static Speed getCurrentSpeed(double currentSpeed) {
        if (currentSpeed <= 10)
            return SLOW;
        else if (currentSpeed >10 && currentSpeed <= 60)
            return MEDIUM;
        else
            return FAST;
    }
    String getSpeedString() {
        return speedString;
    }
}

private Speed currentSpeed = Speed.SLOW; 


public void manage() {
    Speed newSpeed = Speed.getCurrentSpeed(getSpeedfromVehicle());

    if (currentSpeed != newSpeed) {
        currentSpeed = newSpeed;
        System.out.println("It's now going " + currentSpeed.getSpeedString() + "!");
    }

}

double speed;
public double getSpeedfromVehicle() {
    return speed;
}
public void setSpeedfromVehicle(double speed) {
    this.speed = speed;
}

}

答案 5 :(得分:0)

如果你选择其中一种解决方案:

if((speed >=0 && speed <= 10) && state != SpeedState.LOW)
...
else if((speed > 10 && speed < 60) && state != SpeedState.MEDIUM)
...
else if((speed >= 60) && state != SpeedState.HIGH)
...

那么请不要这个代码进行太多的比较。 例如:如果当前状态为LOW且当前速度为5,则第一个条件((speed >=0 && speed <= 10) && state != SpeedState.LOW)将返回false但是,因为else if它还要检查其他条件,但是为了什么?我们已经知道速度必须是LOW,不需要进行其他检查。

所以这里有一个更好的版本:

public enum SpeedState {
    LOW, MEDIUM, HIGH
}

public class Drive {
    private SpeedState state;

    public void manage() {
        double speed = getSpeedfromVehicle();

        SpeedState newState = null;

        if (speed >= 0 && speed <= 10)
            newState = SpeedState.LOW;
        else if (speed > 10 && speed < 60)
            newState = SpeedState.MEDIUM;
        else if (speed >= 60)
            newState = SpeedState.HIGH;

        if (newState != state) {
            state = newState;
            System.out.println("State changed to" + state);
        }

    }
}

答案 6 :(得分:0)

如果您的速度有整数增量,则在枚举对象中有另一个预定义速度范围的解决方案。如果双重类型的速度变化11到10,61到60并且检查最小值作为专用值。

public enum SpeedMode {
    LOW(0, 10), MEDIUM(11, 60), HIGH(61, 300);

    private final int minSpeed;
    private final int maxSpeed;

    SpeedMode(int minSpeed, int maxSpeed) {
        this.minSpeed = minSpeed;
        this.maxSpeed = maxSpeed;
    }

    public int getMinSpeed() {
        return this.minSpeed;
    }

    public int getMaxSpeed() {
        return this.maxSpeed;
    }

}

public class SpeedSelector {
    private SpeedMode speedMode;
    private boolean speedChanged;

    public SpeedSelector() {
        this.speedMode = SpeedMode.LOW;
        this.speedChanged = true;
    }

    public void change(int speed) {
        boolean validSpeed = false;

        for (SpeedMode speedMode : SpeedMode.values()) {
            if (speedMode.getMinSpeed() <= speed
                    && speed <= speedMode.getMaxSpeed()) {
                            validSpeed = true;
                if (this.speedMode != speedMode) {
                    speedChanged = true;
                    this.speedMode = speedMode;
                    break;
                }
            }
        }

        if (!validSpeed)
            throw new IllegalArgumentException("Invalid speed range");
    }

    public SpeedMode getSpeedMode() {
        return speedMode;
    }

    @Override
    public String toString() {
        if (speedChanged) {
            speedChanged = false;
            return "Speed changed to " + speedMode.name();
        } else
            return "";
    }

}

public class TestClass {
    public static void main(String[] args) {
        SpeedSelector speedSelector = new SpeedSelector();
        System.out.println(speedSelector);
        speedSelector.change(23);
        System.out.println(speedSelector);
        speedSelector.change(25);
        System.out.println(speedSelector);
        speedSelector.change(100);
        System.out.println(speedSelector);
        speedSelector.change(150);
        System.out.println(speedSelector);
        speedSelector.change(10);
        System.out.println(speedSelector);
    }
}