java中减少IF语句

java中减少IF语句,java,if-statement,scenebuilder,reducing,Java,If Statement,Scenebuilder,Reducing,我正在尝试使用javafx制作一个单元转换器——我已经搜索了两天关于如何减少这些if语句的内容。不知怎的,我发现了一些类似的问题,但这对我没有帮助,因为我是Java新手——我不知道在我的情况下正确的方法 希望你们能帮我- 谢谢 /** * CELSIUS TO */ Celsius celsius = new Celsius(parseInput); if(cbOne.getValue().equals("Celsius")) {

我正在尝试使用javafx制作一个单元转换器——我已经搜索了两天关于如何减少这些if语句的内容。不知怎的,我发现了一些类似的问题,但这对我没有帮助,因为我是Java新手——我不知道在我的情况下正确的方法

希望你们能帮我-

谢谢

/**
     * CELSIUS TO
     */
    Celsius celsius = new Celsius(parseInput);
        if(cbOne.getValue().equals("Celsius")) {
            if(cbTwo.getValue().equals("Celsius") ) {
                showAnswer.setText(celsius.celsiusToCelsius());
            }
            if(cbTwo.getValue().equals("Fahrenheit")) {
                showAnswer.setText(celsius.celsiusToFahrenheit());
            }
            if(cbTwo.getValue().equals("Kelvin")) {
                showAnswer.setText(celsius.celsiusToKelvin());
            }
        }
    /**
     * FAHRENHEIT TO
     */
    Fahrenheit fahr = new Fahrenheit(parseInput);
        if(cbOne.getValue().equals("Fahrenheit") ) {
            if(cbTwo.getValue().equals("Celsius") ) {
                showAnswer.setText(fahr.fahrenheitToCelsius());
            }
            if(cbTwo.getValue().equals("Fahrenheit")) {
                showAnswer.setText(fahr.fahrenheitToFahrenheit());
            }
            if(cbTwo.getValue().equals("Kelvin")) {
                showAnswer.setText(fahr.fahrenheitToKelvin());
            }
        }
    /**
     * KELVIN TO
     */
    Kelvin kelvin = new Kelvin(parseInput);
        if(cbOne.getValue().equals("Kelvin")) {
            if(cbTwo.getValue().equals("Celsius") ) {
                showAnswer.setText(kelvin.kelvinToCelsius());
            }
            if(cbTwo.getValue().equals("Fahrenheit")) {
                showAnswer.setText(kelvin.kelvinToFahrenheit());
            }
            if(cbTwo.getValue().equals("Kelvin")) {
                showAnswer.setText(kelvin.kelvinToKelvin());
            }
        }
    }

由于以后不必使用更多单位修改此代码,我建议您使用三元运算符:

String s = cbTwo.getValue();
showAnswer.setText(s.equals("Celsius") ? fahr.fahrenheitToCelsius() :
    s.equals("Farenheit") ? fahr.fahrenheitToFahrenheit() : kelvin.kelvinToKelvin()); 

请注意,它不是完全等效的,如果
s
if
语句中的任何字符串都不匹配。

由于以后不需要用更多的单位修改此代码,我建议您使用三元运算符:

String s = cbTwo.getValue();
showAnswer.setText(s.equals("Celsius") ? fahr.fahrenheitToCelsius() :
    s.equals("Farenheit") ? fahr.fahrenheitToFahrenheit() : kelvin.kelvinToKelvin()); 

请注意,如果
s
if
语句中的任何字符串都不匹配,则它不是完全等效的。

实际上,对于小程序来说,if语句是合适的。它们非常清楚。但是,您可以通过检查
cbOne.getValue().equals(cbTwo.getValue())
来减少冗余。这将用你的
if
语句中的3个换1个

如果你有很多这样的东西,你会从地图和界面方案中受益

interface Converter {
    double convert(double from);
}

static final Map<String, Map<String, Converter>> converters = (
    new HashMap<String, Map<String, Converter>>()
);
static {
    Map<String, Converter> fromCelsius = new HashMap<String, Converter>();

    fromCelsius.put(   "Celsius", new NoConversionConverter()       );
    fromCelsius.put("Fahrenheit", new CelsiusToFahrenheitConverter());
    fromCelsius.put(    "Kelvin", new CelsiusToKelvinConverter()    );

    converters.put("Celsius", fromCelsius);

    ...
}

static Converter getConverter(String from, String to) {
    Map<String, Converter> fromMap = converters.get(from);
    return fromMap == null ? null : fromMap.get(to);
}
也非常可读:

Scale      source = Scale.valueOf("CELSIUS");
Scale destination = Scale.valueOf("FAHRENHEIT");
double     result = source.to(destination).applyAsDouble(0.0);

实际上,对于一个小程序来说,if语句很好。它们非常清楚。但是,您可以通过检查
cbOne.getValue().equals(cbTwo.getValue())
来减少冗余。这将用你的
if
语句中的3个换1个

如果你有很多这样的东西,你会从地图和界面方案中受益

interface Converter {
    double convert(double from);
}

static final Map<String, Map<String, Converter>> converters = (
    new HashMap<String, Map<String, Converter>>()
);
static {
    Map<String, Converter> fromCelsius = new HashMap<String, Converter>();

    fromCelsius.put(   "Celsius", new NoConversionConverter()       );
    fromCelsius.put("Fahrenheit", new CelsiusToFahrenheitConverter());
    fromCelsius.put(    "Kelvin", new CelsiusToKelvinConverter()    );

    converters.put("Celsius", fromCelsius);

    ...
}

static Converter getConverter(String from, String to) {
    Map<String, Converter> fromMap = converters.get(from);
    return fromMap == null ? null : fromMap.get(to);
}
也非常可读:

Scale      source = Scale.valueOf("CELSIUS");
Scale destination = Scale.valueOf("FAHRENHEIT");
double     result = source.to(destination).applyAsDouble(0.0);

虽然三元运算符可以工作,但很难读取和维护

更好的方法是在第一个if语句中使用switch语句。但是,您编写的代码完全可以理解,不需要从这个角度进行更改

然而,为了使这段代码变得更好,需要对其进行重新分析

编写的代码有两个麻烦的特性。首先,当只使用一个温度对象时,实例化所有温度对象


其次,UI和业务逻辑的耦合过于紧密。如果更改UI元素的名称,则必须更改业务逻辑。此外,如果为应用程序添加其他转换温度的方法,则无法重复使用此代码。

虽然三元运算符可以工作,但很难读取和维护

更好的方法是在第一个if语句中使用switch语句。但是,您编写的代码完全可以理解,不需要从这个角度进行更改

然而,为了使这段代码变得更好,需要对其进行重新分析

编写的代码有两个麻烦的特性。首先,当只使用一个温度对象时,实例化所有温度对象


其次,UI和业务逻辑的耦合过于紧密。如果更改UI元素的名称,则必须更改业务逻辑。此外,如果您为应用程序添加了其他转换温度的方法,您将无法重复使用此代码。

您不需要3个类来表示不同比例的温度。创建一个类,该类在内部始终以开尔文为单位保持温度,并可以将其转换为任何其他刻度进行输出。有这样一门课:

public final class Temperature {
  public enum Scale {
    Celsius, Fahrenheit, Kelvin
  }

  private final double temperature;

  private Temperature(double temperature) {
    this.temperature = temperature;
  }

  public static Temperature create(double temperature, Scale scale) {
    switch (scale) {
      case Celsius:
        return new Temperature(temperature + 273.15);
      case Fahrenheit:
        return new Temperature((temperature + 459.67) * 5.0 / 9.0);
      case Kelvin:
        return new Temperature(temperature);
      default:
        throw new IllegalArgumentException("Unknown scale");
    }
  }

  public double convertTo(Scale scale) {
    switch (scale) {
      case Celsius:
        return temperature - 273.15;
      case Fahrenheit:
        return temperature * 9.0 / 5.0 - 459.67;
      case Kelvin:
        return temperature;
      default:
        throw new IllegalArgumentException("Unknown scale");
    }
  }
}
 final int CELSIUS = 1,FARANHITE = 2,KELVIN = 3;
您的代码变成:

Temperature temp = Temperature.create(parseInput, Scale.valueOf(cbOne.getValue()));
showAnswer.setText(temp.convertTo(Scale.valueOf(cbTwo.getValue())));

不需要3个类来表示不同比例的温度。创建一个类,该类在内部始终以开尔文为单位保持温度,并可以将其转换为任何其他刻度进行输出。有这样一门课:

public final class Temperature {
  public enum Scale {
    Celsius, Fahrenheit, Kelvin
  }

  private final double temperature;

  private Temperature(double temperature) {
    this.temperature = temperature;
  }

  public static Temperature create(double temperature, Scale scale) {
    switch (scale) {
      case Celsius:
        return new Temperature(temperature + 273.15);
      case Fahrenheit:
        return new Temperature((temperature + 459.67) * 5.0 / 9.0);
      case Kelvin:
        return new Temperature(temperature);
      default:
        throw new IllegalArgumentException("Unknown scale");
    }
  }

  public double convertTo(Scale scale) {
    switch (scale) {
      case Celsius:
        return temperature - 273.15;
      case Fahrenheit:
        return temperature * 9.0 / 5.0 - 459.67;
      case Kelvin:
        return temperature;
      default:
        throw new IllegalArgumentException("Unknown scale");
    }
  }
}
 final int CELSIUS = 1,FARANHITE = 2,KELVIN = 3;
您的代码变成:

Temperature temp = Temperature.create(parseInput, Scale.valueOf(cbOne.getValue()));
showAnswer.setText(temp.convertTo(Scale.valueOf(cbTwo.getValue())));

您可以将任何输入值转换为开尔文,然后从开尔文转换为所需结果:

String unit = cbOne.getValue();
double inputInKelvin;
String outUnit = cbTwo.getValue();

// parse
if ( unit.equals("Celsius") ) inputInKelvin = new Celsius(parseInput).celsiusToKelvin();
else if ( unit.equals("Fahrenheit") ) inputInKelvin = new Fahrenheit(parseInput).fahrenheitToKelvin();
else inputInKelvin = new Kelvin(parseInput).kelvinToKelvin();

// output
Kelvin kelvin = new Kelvin(inputInKelvin);
if ( unit.equals("Celsius") ) showAnswer.setText(kelvin.kelvinToCelsius());
else if ( unit.equals("Fahrenheit") ) showAnswer.setText(kelvin.kelvinToFahrenheit());
else showAnswer.setText( kelvin.kelvinToKelvin() );

如果您先将字符串解析为双精度,然后只使用一个转换器类,它的可读性会更高。

您可以将任何输入值转换为开尔文,然后从开尔文转换为所需的结果:

String unit = cbOne.getValue();
double inputInKelvin;
String outUnit = cbTwo.getValue();

// parse
if ( unit.equals("Celsius") ) inputInKelvin = new Celsius(parseInput).celsiusToKelvin();
else if ( unit.equals("Fahrenheit") ) inputInKelvin = new Fahrenheit(parseInput).fahrenheitToKelvin();
else inputInKelvin = new Kelvin(parseInput).kelvinToKelvin();

// output
Kelvin kelvin = new Kelvin(inputInKelvin);
if ( unit.equals("Celsius") ) showAnswer.setText(kelvin.kelvinToCelsius());
else if ( unit.equals("Fahrenheit") ) showAnswer.setText(kelvin.kelvinToFahrenheit());
else showAnswer.setText( kelvin.kelvinToKelvin() );

如果您先将字符串解析为double,然后只使用一个转换器类,那么它的可读性会更高。

您还可以执行以下操作:

public final class Temperature {
  public enum Scale {
    Celsius, Fahrenheit, Kelvin
  }

  private final double temperature;

  private Temperature(double temperature) {
    this.temperature = temperature;
  }

  public static Temperature create(double temperature, Scale scale) {
    switch (scale) {
      case Celsius:
        return new Temperature(temperature + 273.15);
      case Fahrenheit:
        return new Temperature((temperature + 459.67) * 5.0 / 9.0);
      case Kelvin:
        return new Temperature(temperature);
      default:
        throw new IllegalArgumentException("Unknown scale");
    }
  }

  public double convertTo(Scale scale) {
    switch (scale) {
      case Celsius:
        return temperature - 273.15;
      case Fahrenheit:
        return temperature * 9.0 / 5.0 - 459.67;
      case Kelvin:
        return temperature;
      default:
        throw new IllegalArgumentException("Unknown scale");
    }
  }
}
 final int CELSIUS = 1,FARANHITE = 2,KELVIN = 3;
然后像这样使用开关站

 int key = StringToInt(firstValue)*10 + StringTOInt(secondValue);
 //This will give you 9 unique codes 11 12 13 21 22 23 ....
 switch(key)
 {
       default: case 11: case 22: case 33: break;
       //do nothing since no conversion required

       case 12://Celsius to faranhite
       case 13://celsius to kelvin
       .
       .
       //and so on     

 }

您也可以这样做:

public final class Temperature {
  public enum Scale {
    Celsius, Fahrenheit, Kelvin
  }

  private final double temperature;

  private Temperature(double temperature) {
    this.temperature = temperature;
  }

  public static Temperature create(double temperature, Scale scale) {
    switch (scale) {
      case Celsius:
        return new Temperature(temperature + 273.15);
      case Fahrenheit:
        return new Temperature((temperature + 459.67) * 5.0 / 9.0);
      case Kelvin:
        return new Temperature(temperature);
      default:
        throw new IllegalArgumentException("Unknown scale");
    }
  }

  public double convertTo(Scale scale) {
    switch (scale) {
      case Celsius:
        return temperature - 273.15;
      case Fahrenheit:
        return temperature * 9.0 / 5.0 - 459.67;
      case Kelvin:
        return temperature;
      default:
        throw new IllegalArgumentException("Unknown scale");
    }
  }
}
 final int CELSIUS = 1,FARANHITE = 2,KELVIN = 3;
然后像这样使用开关站

 int key = StringToInt(firstValue)*10 + StringTOInt(secondValue);
 //This will give you 9 unique codes 11 12 13 21 22 23 ....
 switch(key)
 {
       default: case 11: case 22: case 33: break;
       //do nothing since no conversion required

       case 12://Celsius to faranhite
       case 13://celsius to kelvin
       .
       .
       //and so on     

 }
你喜欢这样吗

 int key = StringToInt(firstValue)*10 + StringTOInt(secondValue);
 //This will give you 9 unique codes 11 12 13 21 22 23 ....
 switch(key)
 {
       default: case 11: case 22: case 33: break;
       //do nothing since no conversion required

       case 12://Celsius to faranhite
       case 13://celsius to kelvin
       .
       .
       //and so on     

 }
创建接口ForConvertorTypes

public interface Convertor {
    public String convert(int parseInt);
    public boolean accept(String from, String to);
}
然后实现转换器类型并在Registry集合中注册它们。 如果你能达到你想要的,那就用一个

List<Convertor> convertors = new ArrayList<Convertor>();

    Convertor CelsiusToCelsius = new Convertor() {

        @Override
        public String convert(int parseInt) {
            Celsius celsius = new Celsius(parseInt);
            return celsius.celsiusToCelsius();
        }

        @Override
        public boolean accept(String from, String to) {
            return from.equals("Celsius") && to.equals("Celsius");
        }
    };


    Convertor CelsiusToFah = new Convertor() {

        @Override
        public String convert(int parseInt) {
            Celsius celsius = new Celsius(parseInt);
            return celsius.celsiusToFahrenheit();
        }

        @Override
        public boolean accept(String from, String to) {
            return from.equals("Celsius") && to.equals("Fahrenheit");
        }
    };

    Convertor CelsiusToKelvin = new Convertor() {

        @Override
        public String convert(int parseInt) {
            Celsius celsius = new Celsius(parseInt);
            return celsius.celsiusToFahrenheit();
        }

        @Override
        public boolean accept(String from, String to) {
            return from.equals("Celsius") && to.equals("Kelvin");
        }
    };

   // create Rest of Convertor like above

    convertors.add(CelsiusToFah);
    convertors.add(CelsiusToCelsius);
    convertors.add(CelsiusToKelvin);
    // register rest of convertor


    //Thats it!
    for(Convertor convertor:convertors) {
        if(convertor.accept(cbOne.getValue(), cbTwo.getValue())) {
            showAnswer.setText(convertor.convert(parseInput));
        }
    }
List convertors=new ArrayList();
转换器Celsius=新转换器(){
@凌驾
公共字符串转换(int-parseInt){
摄氏度=新的摄氏度(parseInt);
返回摄氏度。celsiusToCelsius();
}
@凌驾
公共布尔接受(字符串从,字符串到){
从.equals(“摄氏度”)和&to.equals(“摄氏度”);
}
};
转换器CelsiusToFah=新转换器(){
@凌驾
公共字符串转换(int-parseInt){
摄氏度=新的摄氏度(parseInt);
返回摄氏度。celsiusToFahrenheit();
}
@凌驾
公共布尔接受(字符串从,字符串到){
从.equals(“摄氏”)和&to.equals(“华氏”)返回;
}
};
转换器CelsiusToKelvin=新转换器(){
@凌驾
公共字符串转换(int-parseInt){
摄氏度=新的摄氏度(parseInt);
返回摄氏度。celsiusToFahrenheit();
}
@凌驾
公共布尔接受(字符串从,字符串到){
从.equals(“摄氏度”)和&to.equals(“开尔文”);
}
};
//像上面一样创建转换器的其余部分
转换器。添加(CelsiusToFah);
转换器。添加(CelsiusToCelsius);
转换器。添加(CelsiusToKelvin);
//寄存器转换器的剩余部分
//就这样!
用于(转换器转换器:转换器){
if(convertor.accept(cbOne.getValue(),cbTwo.getValue()){