在switch语句中使用“默认”情况是个好习惯吗?

时间:2011-03-06 15:50:20

标签: java coding-style switch-statement pascal


当我使用交换机时(在这种情况下是Java)我通常会在需要时使用默认情况。我的一位老师告诉我,当他以前在Pascal编程时,那个案例并不存在。他说,如果它不存在于Pascal中,它应该不是一件好事。

我的问题是:

  • 使用默认情况是错误的吗?
  • 内部如何运作?

提前致谢。

7 个答案:

答案 0 :(得分:17)

我认为不使用它是一个坏习惯。

  • 如果您认为默认情况永远不会发生,请抛出异常以确定
    • 如果您切换枚举,可能会有人添加其他值
    • 如果切换整数,则始终可能会发现意外值
  • 因为默认情况总是发生在你期望它最少的时候
  • 据我所知,Pascal中有类似的内容

编辑:

这是Pascal,只是为了证明你的老师错了

 case place of
   1: writeln('Champion');
   2: writeln('First runner-up');
   3: writeln('Second runner-up'); 
   else writeln('Work hard next time!'); 
 end;

答案 1 :(得分:5)

使用默认情况总是一个好习惯。我甚至在打开枚举时使用它。如果枚举有3个值,我有3个case语句和一个抛出AssertionError的case语句。

这很好,因为如果扩展枚举,则可以确保很快就会检测到与错过switch语句中的新值相关的错误。

答案 2 :(得分:2)

默认情况没有任何问题。事实上,我认为它应该几乎总是用于抛出错误来指示交换机中的错误值。

我能想到的唯一可能导致你教授做出这样的声明,是他或她相信你的数据应该在达到案例陈述之前得到验证。即如果您编程良好,您的案例将反映每一个意外情况。

那么,如果是这种情况,那么我们就不需要例外,期间。异常的整个想法是处理意外情况。如果它是合理的预期,你会处理它。

因此,一定要在交换机默认语句中抛出异常。

关于他们如何在内部工作?我确信有很多可能的实现,但从逻辑上讲,默认情况只是if..then..if..then..else的长链中的最后一个else子句。

答案 3 :(得分:1)

我担心你的老师错了。拥有默认案例是一种很好的做法。

答案 4 :(得分:1)

是的,使用默认情况是一种好习惯,因为如果以后更改在switch语句中使用的条件或枚举,则应用程序的行为“不正确”,如果新值不是完全覆盖。 很抱歉,但IMO你的老师有点想要了解更新的编程方法。

在内部,它以这种方式工作,如果使用默认分支,则该条件与任何其他列出的条件都不匹配。

答案 5 :(得分:0)

对此问题的另一种看法:

基本上,其他答案主要是:“当您在X上切换/设置大小写,并且X的类型允许X为1、2、3等(整数),或者是Red,Blue,Fucsia等(枚举) ,请务必处理等等!”。很明显,不是吗?

另一方面,当您认为X会由于程序流而成为变量时,则永远不会采用值“ etc” ...否则考虑一下,因为最终它将。这是一般建议。

与Java / Pascal不同的是:X如果X的类型允许“ etc”怎么办? (例如,“非常严格”的枚举或范围(对于整数))。也就是说,编译器确保可能的值永远不会是“ etc”。并将未处理的案例标记为错误。会好的。 :-)函数式语言具有模式匹配和代数类型,这种方式是这样的,但是我在那儿没有相关经验。 :(

回到Java(和类似语言),因为您可以实现类型(类),所以可以实现严格的检查,例如通过将“ case”作为方法调用来获取lambda / functions / function对象...

答案 6 :(得分:-1)

这取决于。如果没有默认值,则不需要它。