`
tedeyang
  • 浏览: 318421 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

窃以为switch语句的设计是败笔

    博客分类:
  • JAVA
阅读更多

前天做到一个题,是测试java switch语句的.结果很出我意料.

 

 

public class Test {
    public static void main(String[] args) {
        char c = 'c';
        switch (c) {
        default:
        case 'a':
            System.out.println('a');
            break;
        case 'b':
            System.out.println('b');
            break;
        }
    }
}

     输出'a',这代码带着点邪气.

     再看一段,如果有case 'c'呢?

 

switch (c) {
		default:
		case 'a':
			System.out.println('a');
			break;
		case 'b':
			System.out.println('b');
			break;
		case 'c':
			System.out.println('c');
			break;
		}
   

   输出'c'.

   所有switch有两个原则:1,default语句不管放在那里都是最后才执行. 2,case/default之间是"or"的执行关系,形象点描述的话就像是一只找桃子的贪心猴子从树的分枝上一根根往下跳,不被人打一棍就舍不得放弃下一个可能的桃子,即便它已经捡到了.

 

     个人感觉switch的这种case语法本身就不属于良好设计,违反了"least surprise ",这也是为什么所有教程都淳淳告诫:记得要加break啊!这语法太违反人类直觉了.

 

     统计一下所有用到switch的代码,大概会发现case后会带着break的占绝大多数,所以更好的设计是以break作为默认行为,用"continue"告诉case需要向下连续,而不是把continue作为默认行为.

 

     有时间的话倒是可以研究一下switch语法最早是哪门语言设计出的,一路怎么演化,一定很有意思.呵呵.

     在java中为了性能考虑,switch只能对有限的类型进行判断(int,char,byte,enum和包装类)也极大限制了它的使用,大概在一些算法类的程序中才有用武之地了.

 

@see http://java.sun.com/docs/books/tutorial/java/nutsandbolts/switch.html

 

2
1
分享到:
评论
1 楼 skzr.org 2010-07-21  
我喜欢if多余switch

相关推荐

Global site tag (gtag.js) - Google Analytics