如何使用MessageFormat的choice模式结合枚举输出指定字符串?
用MessageFormat的Choice模式匹配枚举类输出对应字符串
嘿,你这个思路方向是对的,但直接把枚举实例丢给MessageFormat的choice模式会踩坑——因为choice本质是**基于数值(Number类型)**来匹配分支的,枚举实例本身不是数值类型,所以得先把枚举转成能被choice识别的数值才行。下面给你两种可行的实现方式:
方法一:利用枚举的ordinal()值快速匹配
枚举自带的ordinal()方法会返回它在定义中的顺序索引(从0开始),我们可以基于这个数值来编写choice的匹配规则。比如你的Style枚举里,American是第0个,European是第1个,那代码可以这么写:
public enum Style { American, European } public class EnumMessageDemo { public static void main(String[] args) { // choice的语法是:{参数索引,choice,数值范围#输出内容|...} String formatPattern = "{0,choice,0#am|1#eu|2#no}"; // 传入枚举的ordinal()值作为匹配依据 String americanResult = MessageFormat.format(formatPattern, Style.American.ordinal()); String europeanResult = MessageFormat.format(formatPattern, Style.European.ordinal()); String nullResult = MessageFormat.format(formatPattern, 2); // 匹配默认的null分支 System.out.println(americanResult); // 输出: am System.out.println(europeanResult); // 输出: eu System.out.println(nullResult); // 输出: no } }
不过这种方式有个小缺点:如果后续调整了枚举的定义顺序(比如把European移到American前面),ordinal()返回的数值会跟着变,对应的choice规则也得同步修改,维护起来不够灵活。
方法二:给枚举添加自定义编码属性(推荐)
更稳妥的方式是给枚举类添加一个自定义的数值编码属性,用这个固定的编码来匹配choice规则,这样就算枚举顺序变了,也不会影响匹配结果。示例代码如下:
public enum Style { American(0), European(1); // 自定义编码属性 private final int code; // 构造方法初始化编码 Style(int code) { this.code = code; } // 提供获取编码的方法 public int getCode() { return code; } } public class EnumMessageDemo { public static void main(String[] args) { String formatPattern = "{0,choice,0#am|1#eu|2#no}"; String americanResult = MessageFormat.format(formatPattern, Style.American.getCode()); String europeanResult = MessageFormat.format(formatPattern, Style.European.getCode()); System.out.println(americanResult); // 输出: am System.out.println(europeanResult); // 输出: eu } }
另外要纠正你原来示例里的语法问题:choice模式的匹配项必须是数值,你原来写的American#am是无效的——因为American是枚举实例,不是数值,所以MessageFormat根本无法识别这个匹配规则,这也是直接传枚举实例不行的核心原因。
内容的提问来源于stack exchange,提问作者jonas.lima
相关产品推荐
相关产品推荐

