有许多文章解释了为什么应该避免异常流控制并被认为是反模式。但是,在以下示例中使用异常流量控制是否有意义?
例如:我有一个包含许多值的枚举类型,需要检查它是否包含给定的字符串。
使用Enum.valueof的解决方案应抛出IllegalArgumentException并可用于返回false。甚至Apache commons lang3 lib也使用相同的。我们在所有后续调用中重用一次延迟初始化的enumConstantDirectory映射。
return EnumUtils.isValidEnum(MyEnum.class, myValue);
其他解决方案是迭代。
return Stream.of(MyEnum.values()).anyMatch(e -> e.name().equals(value));
答案 0 :(得分:6)
编程始终关于“非正式标准”之间的平衡以及偏离有意义的规则。
是的,Java是你“在跳跃之前看”的语言之一(你检查条件);不像你在“请求宽恕”的Python(不是许可)。
换句话说:大多数时候, Java 程序员会发现查看使用控制流异常的代码会令人惊讶。但是:这并不意味着一个永远应该以这种方式工作。
我的个人两分在这里:我认为你应该依赖异常,当案例表明你的程序中存在真正的异常情况时。含义:当你检查的那些字符串应该表示枚举常量时...而异常可能没什么问题。但是当在运行时有一定的机会(甚至可能是“有效”的原因)字符串无效时,我宁愿使用boolean isValid()
的方法而不是抛出异常。