java枚举invalid_在Java枚举中覆盖valueof()和toString()

你可以试试这个代码。 由于您无法覆盖valueOf方法,因此您必须定义一个自定义方法( getEnum的示例代码中的getEnum ),它将返回所需的值,并将您的客户端更改为使用此方法。

public enum RandomEnum { StartHere("Start Here"), StopHere("Stop Here"); private String value; RandomEnum(String value) { this.value = value; } public String getValue() { return value; } @Override public String toString() { return this.getValue(); } public static RandomEnum getEnum(String value) { for(RandomEnum v : values()) if(v.getValue().equalsIgnoreCase(value)) return v; throw new IllegalArgumentException(); } }

试试这个,但我不确定那会工作在每个地方:)

public enum MyEnum { A("Start There"), B("Start Here"); MyEnum(String name) { try { Field fieldName = getClass().getSuperclass().getDeclaredField("name"); fieldName.setAccessible(true); fieldName.set(this, name); fieldName.setAccessible(false); } catch (Exception e) {} } }

你可以在你的枚举中使用一个静态的Map来把Strings映射到枚举常量。 在“getEnum”静态方法中使用它。 这可以避免每次你想要从它的String值中获得一个枚举时迭代枚举的需要。

public enum RandomEnum { StartHere("Start Here"), StopHere("Stop Here"); private final String strVal; private RandomEnum(String strVal) { this.strVal = strVal; } public static RandomEnum getEnum(String strVal) { if(!strValMap.containsKey(strVal)) { throw new IllegalArgumentException("Unknown String Value: " + strVal); } return strValMap.get(strVal); } private static final Map strValMap; static { final Map tmpMap = Maps.newHashMap(); for(final RandomEnum en : RandomEnum.values()) { tmpMap.put(en.strVal, en); } strValMap = ImmutableMap.copyOf(tmpMap); } @Override public String toString() { return strVal; } }

只要确保映射的静态初始化发生在枚举常量的声明之下。

顺便说一句,那'ImmutableMap'types是从谷歌guava API,我绝对推荐它在这种情况下。

编辑 – 根据评论:

此解决scheme假定每个分配的string值都是唯一的且非空的。 鉴于枚举的创build者可以控制这个,并且该string对应于唯一的&非空枚举值,这似乎是一个安全的限制。

我在问题中添加了“toSTring()”方法

Java 8实现如何? (null可以被你的默认枚举replace)

public static RandomEnum getEnum(String value) { List list = Arrays.asList(RandomEnum.values()); return list.stream().filter(m -> m.value.equals(value)).findAny().orElse(null); }

或者你可以使用:

...findAny().orElseThrow(NotFoundException::new);

我不认为你会得到valueOf(“从这里开始”)工作。 但是,至于空间…尝试以下…

static private enum RandomEnum { R("Start There"), G("Start Here"); String value; RandomEnum(String s) { value = s; } } System.out.println(RandomEnum.G.value); System.out.println(RandomEnum.valueOf("G").value); Start Here Start Here

以下是valueOf()的一个很好的通用替代方法

public static RandomEnum getEnum(String value) { for (RandomEnum re : RandomEnum.values()) { if (re.description.compareTo(value) == 0) { return re; } } throw new IllegalArgumentException("Invalid RandomEnum value: " + value); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值