Java中如何将变量值作为变量名使用而非纯文本?
在Java中实现字符串到变量的映射(避免大量if语句)
嘿,这个需求太常见了!Java作为静态类型语言,没法直接把字符串当作变量名来直接引用(毕竟变量名在编译阶段就固定死了),但我们可以用Map(映射表)来完美解决这个问题,彻底告别一堆嵌套的if/else语句。
解决方案步骤:
1. 先定义你的转子规则
假设你原本的Rotor_I、Rotor_II是存储字符映射的字符串(比如恩尼格玛机的转子布线),先把它们定义好:
// 示例:恩尼格玛机转子的布线规则 String Rotor_I = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"; String Rotor_II = "AJDKSIRUXBLHWTMCQGZNPYFVOE"; String Rotor_III = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; // 你可以继续定义更多转子...
如果你的转子有更复杂的逻辑(比如偏移量、反转映射、步进机制),更推荐把转子封装成自定义类,扩展性更强:
class Rotor { private String wiring; // 可以添加其他属性,比如当前偏移量、反转布线等 public Rotor(String wiring) { this.wiring = wiring; } // 提供获取对应位置字符的方法 public char getMappedChar(int position) { // 这里可以加入偏移量等逻辑,示例先简化 return wiring.charAt(position); } }
2. 用Map建立名称到转子的映射
把转子名称(比如"Rotor_I")和对应的转子实例/字符串绑定到Map中:
// 如果是用字符串存储转子: Map<String, String> rotorMap = new HashMap<>(); rotorMap.put("Rotor_I", Rotor_I); rotorMap.put("Rotor_II", Rotor_II); rotorMap.put("Rotor_III", Rotor_III); // 如果是用自定义Rotor类: Map<String, Rotor> rotorMap = new HashMap<>(); rotorMap.put("Rotor_I", new Rotor("EKMFLGDQVZNTOWYHXUSPAIBRCJ")); rotorMap.put("Rotor_II", new Rotor("AJDKSIRUXBLHWTMCQGZNPYFVOE"));
3. 直接通过字符串获取对应的转子
现在你拿到slowRotor的字符串后,直接从Map里取出对应的转子即可,完全不用if语句:
String slowRotor = GUI.getRotorInPosition("slow"); int position = alphabet.indexOf(result); String resultAfterRotor = ""; // 用字符串从Map中获取转子(字符串版本) String targetRotor = rotorMap.get(slowRotor); resultAfterRotor = Character.toString(targetRotor.charAt(position)); // 如果是自定义Rotor类版本: Rotor targetRotor = rotorMap.get(slowRotor); resultAfterRotor = Character.toString(targetRotor.getMappedChar(position));
为什么不用eval或者反射?
虽然Java里可以用反射来通过字符串获取变量,但这种方式非常不推荐:
- 反射会让代码变得难以维护、可读性差
- 存在安全风险(如果字符串来源不可信)
- 性能比Map差很多
而Map的方式既安全、高效,又易于扩展——以后要加新转子,只需要往Map里多put一个键值对就行,完全不用修改业务逻辑代码。
内容的提问来源于stack exchange,提问作者D74
相关产品推荐
相关产品推荐

