java中减少IF语句
我正在尝试使用javafx制作一个单元转换器——我已经搜索了两天关于如何减少这些if语句的内容。不知怎的,我发现了一些类似的问题,但这对我没有帮助,因为我是Java新手——我不知道在我的情况下正确的方法 希望你们能帮我- 谢谢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")) {
/**
* 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()){