Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重构详细的switch case语句_Java_If Statement_Switch Statement - Fatal编程技术网

Java 重构详细的switch case语句

Java 重构详细的switch case语句,java,if-statement,switch-statement,Java,If Statement,Switch Statement,我有一个为单个工厂保存天气测量的对象 public class FactoryWeather { // each measurement consists of min, max and average observations. private Measurement temperature; private Measurement humidity; private Measurement ... public constructor,sette

我有一个为单个工厂保存天气测量的对象

public class FactoryWeather { 

    // each measurement consists of min, max and average observations.
    private Measurement temperature;
    private Measurement humidity;
    private Measurement ...

    public constructor,setters/getters...

}
度量类型定义为枚举,如下所示:

public enum WeatherMeasurementEnum {
    // min and max range of single measurement
    TEMPERATURE(-50,50),
    HUMIDITY(0,100),
    ...

    // validity check for measurements
    public boolean isValid(int average) {
        return average >= minimum && average <= maximum;
    }
}

尽管switch语句看起来不错,但将来测量类型可能会增加。考虑到这一点,并且为了最佳实践,是否可以消除这种长开关或if/else语句?

而不是在FactoryWeather中为每个度量设置单独的字段,您可以使用一个
映射来存储每个枚举实例的度量值

那你就不得不这么做了

public void updateWeatherMeasurement(String type, Measurement measurement, FactoryWeather factory) {
    WeatherMeasurementEnum m = WeatherMeasurementEnum(type.toUpperCase());
    if (!m.isValid(measurement.getAverage()) {
        throw new AppException("Invalid measurement!");
    }

    factory.setMeasurement(m, measurement);
}
事实上,这种方法可以完全消除,因为FactoryWeather的
setMeasurement()
方法可以直接验证测量的有效性

另一个选项是将字段设置委托给枚举本身:

public enum WeatherMeasurementEnum {
    // min and max range of single measurement
    TEMPERATURE(-50,50) {
        @Override
        setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw) {
            fw.setTemperature(m);
        }
    },
    HUMIDITY(0,100) {
        @Override
        setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw) {
            fw.setHumidity(m);
        }
    },
    ...

    // validity check for measurements
    public boolean isValid(int average) {
        return average >= minimum && average <= maximum;
    }

    public abstract setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw);
}
public enum weathermeasurementum{
//单个测量的最小和最大范围
温度(-50,50){
@凌驾
setMeasurementInFactoryWeather(测量m,FactoryWeather fw){
fw.设定温度(m);
}
},
湿度(0100){
@凌驾
setMeasurementInFactoryWeather(测量m,FactoryWeather fw){
fw.设定湿度(m);
}
},
...
//测量的有效性检查
公共布尔值有效(整数平均值){

return average>=minimum&&average不是在FactoryWeather中为每个度量设置单独的字段,而是可以使用一个
映射来存储每个枚举实例的度量值

那你就不得不这么做了

public void updateWeatherMeasurement(String type, Measurement measurement, FactoryWeather factory) {
    WeatherMeasurementEnum m = WeatherMeasurementEnum(type.toUpperCase());
    if (!m.isValid(measurement.getAverage()) {
        throw new AppException("Invalid measurement!");
    }

    factory.setMeasurement(m, measurement);
}
事实上,这种方法可以完全消除,因为FactoryWeather的
setMeasurement()
方法可以直接验证测量的有效性

另一个选项是将字段设置委托给枚举本身:

public enum WeatherMeasurementEnum {
    // min and max range of single measurement
    TEMPERATURE(-50,50) {
        @Override
        setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw) {
            fw.setTemperature(m);
        }
    },
    HUMIDITY(0,100) {
        @Override
        setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw) {
            fw.setHumidity(m);
        }
    },
    ...

    // validity check for measurements
    public boolean isValid(int average) {
        return average >= minimum && average <= maximum;
    }

    public abstract setMeasurementInFactoryWeather(Measurement m, FactoryWeather fw);
}
public enum weathermeasurementum{
//单个测量的最小和最大范围
温度(-50,50){
@凌驾
setMeasurementInFactoryWeather(测量m,FactoryWeather fw){
fw.设定温度(m);
}
},
湿度(0100){
@凌驾
setMeasurementInFactoryWeather(测量m,FactoryWeather fw){
fw.设定湿度(m);
}
},
...
//测量的有效性检查
公共布尔值有效(整数平均值){

return average>=minimum&&average您了解了Stategy模式吗?我想您告诉我的还不够多,我不能说这是否有效,但我会提出一个想法:在
weathermeasurementum
中添加一个方法
setMeasuremet(FactoryWeather)
这反过来会在工厂中调用正确的方法。这需要在枚举中使用一个抽象方法,并在每个枚举实例中使用一个实现。您了解了策略模式吗?我认为您告诉我的还不够多,我无法说这是否可行,但我会提出以下想法:在
WeatherMeasurementEnum
中添加一个方法od
setMeasuremet(FactoryWeather)
调用工厂中的正确方法。它需要在枚举中使用抽象方法,并在每个枚举实例中使用实现。