我有一个具有以下模式的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/

10-10 02:45