
本文详细讲解了如何在 Java 中结合 String 和 Enum 类型进行 switch case 操作。重点介绍了如何将字符串转换为 Enum 类型,以及如何在 switch 语句中使用 Enum。同时,探讨了分离关注点的原则,并提供了一个完整的示例,展示了如何将字符串到 Enum 的映射与实际的计算逻辑分离,从而提高代码的可读性和可维护性。
在 Java 中,直接在 switch 语句中使用 String 与 Enum 进行比较可能会遇到类型不匹配的问题。本文将深入探讨如何正确地在 switch 语句中使用 String 和 Enum,并提供一些最佳实践建议,以确保代码的健壮性和可维护性。
将 String 转换为 Enum
如果你的方法接收一个 String 类型的操作符,但你希望使用 Enum 来处理逻辑,你需要先将 String 转换为对应的 Enum 类型。Java 提供了 Enum.valueOf() 方法来实现这个转换。
public enum TiposDeOperacoes { SOMA, SUBTRACAO, MULTIPLICACAO, DIVISAO}public float Calculo(String operacao, float valor1, float valor2) { TiposDeOperacoes tipoOperacao; try { tipoOperacao = TiposDeOperacoes.valueOf(operacao); } catch (IllegalArgumentException e) { // 处理无效的 operacao 字符串,例如抛出异常或返回默认值 System.err.println("Invalid operation: " + operacao); return Float.NaN; // 或者抛出异常 } float resultado = 0; switch (tipoOperacao) { case SOMA: resultado = valor1 + valor2; break; case SUBTRACAO: resultado = valor1 - valor2; break; case MULTIPLICACAO: resultado = valor1 * valor2; break; case DIVISAO: if (valor2 != 0) { resultado = valor1 / valor2; } else { System.err.println("Division by zero!"); return Float.NaN; // 或者抛出异常 } break; default: System.err.println("Unsupported operation: " + operacao); return Float.NaN; // 或者抛出异常 } return resultado;}
在这个例子中,我们首先尝试使用 TiposDeOperacoes.valueOf(operacao) 将 String 类型的 operacao 转换为 TiposDeOperacoes 枚举类型。如果 operacao 不是 TiposDeOperacoes 中定义的有效值,valueOf() 方法会抛出 IllegalArgumentException 异常。我们需要捕获这个异常并进行适当的处理。
使用 Enum 的 name() 方法
如果你坚持在 switch 语句中使用 String,你可以使用 Enum 的 name() 方法来获取 Enum 常量的字符串表示形式。
public float Calculo(String operacao, float valor1, float valor2) { float resultado = 0; switch (operacao) { case "SOMA": // 直接使用字符串字面量 resultado = valor1 + valor2; break; case "SUBTRACAO": resultado = valor1 - valor2; break; case "MULTIPLICACAO": resultado = valor1 * valor2; break; case "DIVISAO": if (valor2 != 0) { resultado = valor1 / valor2; } else { System.err.println("Division by zero!"); return Float.NaN; // 或者抛出异常 } break; default: System.err.println("Unsupported operation: " + operacao); return Float.NaN; // 或者抛出异常 } return resultado;}
或者:
Type Studio
一个视频编辑器,提供自动转录、自动生成字幕、视频翻译等功能
61 查看详情
public float Calculo(String operacao, float valor1, float valor2) { float resultado = 0; switch (operacao) { case TiposDeOperacoes.SOMA.name(): resultado = valor1 + valor2; break; case TiposDeOperacoes.SUBTRACAO.name(): resultado = valor1 - valor2; break; case TiposDeOperacoes.MULTIPLICACAO.name(): resultado = valor1 * valor2; break; case TiposDeOperacoes.DIVISAO.name(): if (valor2 != 0) { resultado = valor1 / valor2; } else { System.err.println("Division by zero!"); return Float.NaN; // 或者抛出异常 } break; default: System.err.println("Unsupported operation: " + operacao); return Float.NaN; // 或者抛出异常 } return resultado;}
注意: 虽然这种方法可行,但它依赖于字符串字面量,容易出错。如果 Enum 常量的名称发生变化,你需要手动更新所有使用它的 switch 语句。使用 Enum.valueOf() 方法通常是更安全和推荐的做法。
分离关注点
将字符串到 Enum 的映射与实际的计算逻辑分离是一个好的设计原则。这样可以提高代码的可读性和可维护性。你可以创建一个单独的方法来将字符串转换为 Enum,然后将 Enum 传递给计算方法。
public enum Mode { ADD, SUBTRACT, MULTIPLY, DIVIDE}public class Calculator { public float calculate(Mode mode, float x, float y) { float result = switch (mode) { case ADD -> (x + y); case SUBTRACT -> (x - y); case MULTIPLY -> (x * y); case DIVIDE -> (x / y); }; return result; }}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 IllegalArgumentException("Unexpected mode text: " + modeText); }; return mode; }}
在这个例子中,modeForText() 方法负责将字符串转换为 Mode 枚举类型,而 Calculator.calculate() 方法负责执行实际的计算。这种分离使得代码更易于理解和维护。
总结
在 Java 中,将 String 与 Enum 结合使用需要谨慎处理。推荐使用 Enum.valueOf() 方法将 String 转换为 Enum 类型,并在 switch 语句中使用 Enum。同时,遵循分离关注点的原则,将字符串到 Enum 的映射与实际的业务逻辑分离,可以提高代码的可读性和可维护性。 避免直接使用 Enum.name() 在 switch 中进行比较,因为它依赖于字符串字面量,容易出错。 始终处理 IllegalArgumentException 异常,以确保代码的健壮性。
以上就是使用 String 和 Enum 的 Switch Case 详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1176166.html
微信扫一扫
支付宝扫一扫