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
中添加一个方法odsetMeasuremet(FactoryWeather)
调用工厂中的正确方法。它需要在枚举中使用抽象方法,并在每个枚举实例中使用实现。