我有一个具有以下模式的Java代码:
enum Foo
{
ORANGE, APPLE, BANANA
}
Foo bar()
{
switch(calcValue())
{
case "orange": return ORANGE;
case "apple": return APPLE;
case "banana": return BANANA;
}
}
calcValue
方法的设计确保除switch语句检查的三个字符串外,它绝不会返回任何其他内容。如果它将无法返回三个字符串中的任何一个,则将引发异常。这意味着缺少default
关键字可能是不必要的,并且永远不会触发默认的切换行为,因此可以省略default
。但是,Java自然地(通常是正确的)抱怨bar
必须(总是)返回一个值。我当时在考虑将异常作为默认值抛出,但是如上所述,calcValue
已经抛出了一个异常。我主要是经过简单有效的设计(涉及最少的运行时检查和代码)来解决这个小问题-我不想抛出两个异常,并且calcValue
不在我的控制之下,因此我无法对其进行任何处理。我希望我在这里已经很好地说明了自己,如果没有,我将尽力尝试澄清。从本质上讲,这是关于设计具有值的方法,其中已知开关默认值不适用。这也可能适用于
if-then-else-if-then-else-...-then-else
语句模式。 最佳答案
你写了
calcValue方法的设计确保除switch语句检查的三个字符串外,它绝不会返回任何其他内容。
但是,此合同未由calcValue
的签名表示;它只是返回一个字符串,Java的类型检查器无法知道只有某些字符串是可能的。我认为这是calcValue
函数的API中的缺陷。
最重要的是Java是正确的-您确实没有default
的情况,因为关于calcValue
内部工作的假设不是由类型系统强制执行的,因此它可能在任何时候改变而不会引起编译器的注意。
关于java - 如何在函数体中使用if和switch语句返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12637116/