当我使用交换机时(在这种情况下是Java)我通常会在需要时使用默认情况。我的一位老师告诉我,当他以前在Pascal编程时,那个案例并不存在。他说,如果它不存在于Pascal中,它应该不是一件好事。
我的问题是:
提前致谢。
答案 0 :(得分:17)
我认为不使用它是一个坏习惯。
编辑:
这是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)
这取决于。如果没有默认值,则不需要它。