与String和Enum交换大小写



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开始,枚举可以在方法中本地定义。这来自于记录功能的工作。

最新更新