
本文介绍了在 Java 中如何使用本地化资源文件中的字符串来动态控制 `switch` 语句的行为。由于 `switch` 语句的 `case` 标签必须是常量表达式,因此直接使用 `resourceBundle.getString()` 获取的值是不允许的。本文提供了两种替代方案:使用 `if-else if` 语句以及使用 `Map` 进行查找,并提供了相应的代码示例。
在 Java 中,switch 语句是一种常用的控制流结构,它允许根据表达式的值执行不同的代码块。然而,switch 语句的 case 标签必须是常量表达式,这意味着它们的值在编译时就必须确定。这在某些情况下会带来限制,例如,当我们需要根据本地化资源文件中的字符串来动态控制 switch 语句的行为时。
假设我们需要根据用户选择的语言来设置 Locale。语言名称从本地化资源文件中获取,并在下拉框中显示。直接在 switch 语句中使用 resourceBundle.getString() 获取的字符串作为 case 标签是不允许的,因为它们不是常量表达式。
以下是两种解决此问题的方案:
立即学习“Java免费学习笔记(深入)”;
最直接的替代方案是使用一系列 if-else if 语句来代替 switch 语句。这种方法简单易懂,并且可以处理任何类型的条件。
final String selected = Objects.requireNonNull(comboBox.getSelectedItem()).toString();
ResourceBundle resourceBundle = ResourceBundle.getBundle("messages"); // 假设messages.properties包含本地化字符串
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"));
}优点:
缺点:
另一种方法是使用 Map 来存储字符串和相应的操作。这种方法更加灵活,并且可以提高代码的可读性。
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.ResourceBundle;
public class LocaleSwitcher {
public static void main(String[] args) {
// 模拟下拉框选择
String selectedLanguage = "Deutsch";
// 获取本地化资源文件
ResourceBundle resourceBundle = ResourceBundle.getBundle("messages"); // 假设messages.properties包含本地化字符串
// 创建一个 Map,将本地化字符串映射到相应的 Locale 设置操作
final Map<String, Runnable> 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"))
)
);
// 从 Map 中获取相应的操作,如果找不到则执行默认操作(这里是空操作)
final Runnable action = localeActions.getOrDefault(
Objects.requireNonNull(selectedLanguage), // 替换成 comboBox.getSelectedItem().toString()
() -> {});
// 执行操作
action.run();
// 打印当前 Locale,验证是否设置成功
System.out.println("Current Locale: " + Locale.getDefault());
}
}messages.properties 示例:
menu.settings.language.german=Deutsch menu.settings.language.english_uk=Englisch (UK) menu.settings.language.english_us=Englisch (US) menu.settings.language.french=Französisch
优点:
缺点:
注意事项:
总结:
虽然 switch 语句不能直接使用本地化资源文件中的字符串作为 case 标签,但我们可以使用 if-else if 语句或 Map 来实现类似的功能。选择哪种方案取决于具体的需求和场景。if-else if 语句简单易懂,适用于条件数量较少的情况。Map 则更加灵活,适用于条件数量较多且需要频繁修改的情况。
以上就是在 Java 中使用本地化字符串动态控制 Switch 语句的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号