TiposDeOperacoes是一个枚举和operacao是一个字符串,我怎么能使用枚举在这种情况下,因为VSCode告诉我这是一个类型不匹配?
public float Calculo(String operacao, float valor1, float valor2){
float resultado = 0;
switch (operacao) {
case TiposDeOperacoes.SOMA:
break;
default:
break;
}
}
TiposDeOperacoes.SOMA.name()也给了我"大小写表达式必须是常量表达式">
br
Mode.valueOf( "ADD" ) // returns `Mode.ADD` object.
……或者:
switch ( modeText )
{
case "adding" -> Mode.ADD;
case "minus" , "subtraction" -> Mode.SUBTRACT;
case "multiplication" , "multiplying" -> Mode.MULTIPLY;
case "division" -> Mode.DIVIDE;
default -> throw new IllegalStateException( "Unexpected mode text: " + modeText );
};
<标题>详细信息理想的解决方案是该方法接受enum对象,而不仅仅是文本。如果要测试枚举,则传递枚举。仅仅使用文本是脆弱的,容易出错的。
public float Calculo( TiposDeOperacoes tiposDeOperacoes , float valor1 , float valor2 ) { … }
但是如果您坚持使用字符串,您可以通过调用Enum#name
来询问enum对象的名称。
switch ( operacao )
case TiposDeOperacoes.SOMA.name() : …
但是您不需要switch
来实现该行为。请给Enum#valueOf
打电话。
TiposDeOperacoes tiposDeOperacoes = TiposDeOperacoes.valueOf( operacao ) ;
关注点分离
了解关于软件设计的关注点分离。
我建议你调用一个方法来计算字符串输入和枚举对象之间的映射,第二个方法使用一个枚举对象来执行你的计算。两个工作:(a)将文本映射到enum, (b)执行计算,应该是两个独立的方法。
例如,定义一个enum:
package work.basil.example.maths;
public enum Mode { ADD, SUBTRACT, MULTIPLY, DIVIDE; }
用我们的核心业务逻辑定义一个Calculator
类。
package work.basil.example.maths;
public class Calculator
{
public float calculate ( final Mode mode , final float x , final float y )
{
float result =
switch ( mode )
{
case ADD -> ( x + y );
case SUBTRACT -> ( x - y );
case MULTIPLY -> ( x * y );
case DIVIDE -> ( x / y );
};
return result;
}
}
和一个应用程序把上面的类付诸行动。
package work.basil.example.maths;
public class CalcApp
{
public static void main ( String[] args )
{
CalcApp calcApp = new CalcApp();
calcApp.demo();
}
private void demo ( )
{
String modeText = "minus";
float inputX = 42.0f;
float inputY = 7.0f;
Mode mode = this.modeForText( modeText );
Calculator calculator = new Calculator();
float result = calculator.calculate( mode , inputX , inputY );
System.out.println( "result = " + result );
}
private Mode modeForText ( String modeText )
{
Mode mode =
switch ( modeText )
{
case "adding" -> Mode.ADD;
case "minus" , "subtraction" -> Mode.SUBTRACT;
case "multiplication" , "multiplying" -> Mode.MULTIPLY;
case "division" -> Mode.DIVIDE;
default -> throw new IllegalStateException( "Unexpected mode text: " + modeText );
};
return mode;
}
}
顺便说一下,从Java 16开始,枚举可以在方法中本地定义。这来自于记录功能的工作。
标题>