
本文探讨了在 Java 中如何根据不同的区域设置,动态地配置 `switch` 语句。由于 `switch` 语句的 `case` 标签必须是常量表达式,直接使用资源文件中的字符串值是不允许的。本文提供了两种解决方案:使用 `if-else if` 语句替代 `switch`,以及使用 `Map` 进行查找。
在 Java 中,switch 语句提供了一种简洁的方式来根据不同的条件执行不同的代码块。然而,switch 语句的一个关键限制是 case 标签必须是常量表达式。这意味着我们不能直接使用从资源文件中读取的字符串值作为 case 标签,因为这些值在编译时是未知的。本文将介绍两种解决此问题的方法,以便可以根据用户的区域设置动态配置 switch 语句的行为。
解决方案一:使用 if-else if 语句
最直接的解决方案是使用一系列的 if-else if 语句来替代 switch 语句。虽然这种方法可能不如 switch 语句简洁,但它提供了更大的灵活性,允许我们使用任何表达式作为条件。
以下是一个示例,展示了如何使用 if-else if 语句来根据选择的语言设置不同的 Locale:
立即学习“Java免费学习笔记(深入)”;
final String selected = Objects.requireNonNull(comboBox.getSelectedItem()).toString();if (selected.equals(resourceBundle.getString("menu.settings.language.german"))) { Locale.setDefault(new Locale("de", "DE"));} else if (selected.equals(resourceBundle.getString("menu.settings.language.english_uk"))) { Locale.setDefault(new Locale("en", "UK"));} else if (selected.equals(resourceBundle.getString("menu.settings.language.english_us"))) { Locale.setDefault(new Locale("en", "US"));} else if (selected.equals(resourceBundle.getString("menu.settings.language.french"))) { Locale.setDefault(new Locale("fr", "FR"));}
优点:
简单易懂,易于实现。不需要额外的依赖或数据结构。
缺点:
对于大量的 case,代码会变得冗长且难以维护。效率可能不如 switch 语句(尽管在大多数情况下,这种差异可以忽略不计)。
解决方案二:使用 Map 进行查找
另一种更优雅的解决方案是使用 Map 来存储字符串值和对应的操作。我们可以将资源文件中的字符串值作为 Map 的键,并将 Runnable 对象作为值。Runnable 对象封装了需要执行的代码。
以下是一个示例,展示了如何使用 Map 来实现相同的逻辑:
final Map localeActions = Map.ofEntries( Map.entry( resourceBundle.getString("menu.settings.language.german"), () -> Locale.setDefault(new Locale("de", "DE")) ), Map.entry( resourceBundle.getString("menu.settings.language.english_uk"), () -> Locale.setDefault(new Locale("en", "UK")) ), Map.entry( resourceBundle.getString("menu.settings.language.english_us"), () -> Locale.setDefault(new Locale("en", "US")) ), Map.entry( resourceBundle.getString("menu.settings.language.french"), () -> Locale.setDefault(new Locale("fr", "FR")) ));final Runnable action = localeActions.getOrDefault( Objects.requireNonNull(comboBox.getSelectedItem()).toString(), () -> {});action.run();
在这个例子中,Map.ofEntries 方法用于创建一个不可变的 Map。每个 Map.entry 包含一个从资源文件中读取的字符串值和一个 Runnable 对象。getOrDefault 方法用于查找与选定字符串对应的 Runnable 对象。如果找不到匹配的键,则执行默认的 Runnable 对象(在本例中,它是一个空操作)。
优点:
代码更简洁,更易于维护,特别是对于大量的 case。更易于扩展和修改。
缺点:
需要使用 Map 数据结构,可能会增加一些复杂性。可能需要一些时间来理解 Runnable 和 lambda 表达式的概念。
总结
虽然 Java 的 switch 语句不允许使用非常量表达式作为 case 标签,但我们可以使用 if-else if 语句或 Map 数据结构来绕过这个限制。if-else if 语句简单易懂,但对于大量的 case 可能会变得冗长。Map 数据结构提供了一种更优雅和可维护的解决方案,特别是对于需要动态配置 switch 语句行为的情况。选择哪种方法取决于具体的应用场景和个人偏好。
以上就是使用本地化资源动态配置 Java Switch 语句的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/20914.html
微信扫一扫
支付宝扫一扫