黑马程序员技术交流社区

标题: 用普通类模拟枚举原理——求代码优化 [打印本页]

作者: dicegame    时间: 2013-7-25 23:44
标题: 用普通类模拟枚举原理——求代码优化
package qbb;

public class WeekDay {
        public final static WeekDay SUN = new WeekDay();
        public final static WeekDay MON = new WeekDay();
        public final static WeekDay TUE = new WeekDay();
        public final static WeekDay WES = new WeekDay();
        public final static WeekDay THU = new WeekDay();
        public final static WeekDay FRI = new WeekDay();
        public final static WeekDay SAT = new WeekDay();
        private WeekDay(){

        }
        public WeekDay nextDay(){
                if(this == SUN){
                        return MON;
                }else if(this == MON){
                        return TUE;
                }else if(this == TUE){
                        return WES;
                }else if(this == WES){
                        return THU;
                }else if(this == THU){
                        return FRI;
                }else if(this == FRI){
                        return SAT;
                }else{
                        return SUN;
                }
        }
        public String toString(){
                if(this == SUN){
                        return "SUN";
                }else if(this == MON){
                        return "MON";
                }else if(this == TUE){
                        return "TUE";
                }else if(this == WES){
                        return "WES";
                }else if(this == THU){
                        return "THU";
                }else if(this == FRI){
                        return "FRI";
                }else{
                        return "SAT";
                }
        }
}
if-else太多了
除了匿名内部类,能不能用别的方法替换nextDay()和toString()中的if-else呢?
作者: 草貌路飞    时间: 2013-7-25 23:55
switch呀果断的,switch比if else效率高
作者: dicegame    时间: 2013-7-26 00:02
草貌路飞 发表于 2013-7-25 23:55
switch呀果断的,switch比if else效率高

尝试过,会报错,swith一般用于数值型,字符型,字符串型,枚举不大会用。
求代码,求运行结果
作者: toShareBeauty    时间: 2013-7-26 01:07
jdk 换 1.6 就不会报错啦,jdk 1.6 switch 支持枚举类型,1.7 支持 String 类型
作者: toShareBeauty    时间: 2013-7-26 01:08
草貌路飞 发表于 2013-7-25 23:55
switch呀果断的,switch比if else效率高

路飞你小子打酱油呢,什么时候报名!23期你还来不来
作者: 草貌路飞    时间: 2013-7-26 01:23
toShareBeauty 发表于 2013-7-26 01:08
路飞你小子打酱油呢,什么时候报名!23期你还来不来

找了套题测试了下 60分..悲剧呀 还是在学下基础吧..等24了
作者: toShareBeauty    时间: 2013-7-26 01:24
草貌路飞 发表于 2013-7-26 01:23
找了套题测试了下 60分..悲剧呀 还是在学下基础吧..等24了

不会吧,那么难,传给我一个我试试,你加我qq
作者: 草貌路飞    时间: 2013-7-26 01:39
dicegame 发表于 2013-7-26 00:02
尝试过,会报错,swith一般用于数值型,字符型,字符串型,枚举不大会用。
求代码,求运行结果 ...
  1. WeekDay2 weekDay = WeekDay2.MON;
  2.                 switch(weekDay)
  3.                 {
  4.                 case MON:
  5.                         System.out.println(WeekDay2.TUE);
  6.                         break;
  7.                 case TUE:
  8.                         break;
  9.                 }
复制代码
以前也没用过 试了下 没工夫全写了..还是可以用的嘛 这个枚举和老师的一样,没什么区别
作者: 杜光    时间: 2013-7-26 08:17
草貌路飞 发表于 2013-7-26 01:23
找了套题测试了下 60分..悲剧呀 还是在学下基础吧..等24了

给我也传一份吧。。。加我QQ
作者: toShareBeauty    时间: 2013-7-26 11:04
草貌路飞 发表于 2013-7-26 01:39
以前也没用过 试了下 没工夫全写了..还是可以用的嘛 这个枚举和老师的一样,没什么区别 ...

路飞,路飞,把题给我一个呗,我试试水:P
作者: dicegame    时间: 2013-7-27 00:23
我说的再详细一点吧
  1. package qbb;

  2. public class WeekDay {
  3.         public final static WeekDay SUN = new WeekDay();
  4.         public final static WeekDay MON = new WeekDay();
  5.         public final static WeekDay TUE = new WeekDay();
  6.         public final static WeekDay WES = new WeekDay();
  7.         public final static WeekDay THU = new WeekDay();
  8.         public final static WeekDay FRI = new WeekDay();
  9.         public final static WeekDay SAT = new WeekDay();
  10.         private WeekDay(){

  11.         }
  12.         public WeekDay nextDay(){
  13.                 if(this == SUN){
  14.                         return MON;
  15.                 }else if(this == MON){
  16.                         return TUE;
  17.                 }else if(this == TUE){
  18.                         return WES;
  19.                 }else if(this == WES){
  20.                         return THU;
  21.                 }else if(this == THU){
  22.                         return FRI;
  23.                 }else if(this == FRI){
  24.                         return SAT;
  25.                 }else{
  26.                         return SUN;
  27.                 }
  28.         }
  29.         public String toString(){
  30.                 if(this == SUN){
  31.                         return "SUN";
  32.                 }else if(this == MON){
  33.                         return "MON";
  34.                 }else if(this == TUE){
  35.                         return "TUE";
  36.                 }else if(this == WES){
  37.                         return "WES";
  38.                 }else if(this == THU){
  39.                         return "THU";
  40.                 }else if(this == FRI){
  41.                         return "FRI";
  42.                 }else{
  43.                         return "SAT";
  44.                 }
  45.         }
  46. }
复制代码
  1. package qbb;

  2. public class Test{
  3.         public static void main(String[] args){
  4.                 WeekDay weekday = WeekDay.FRI;
  5.                 WeekDay weekday2 = weekday.nextDay();
  6.                 System.out.println(weekday);
  7.                 System.out.println(weekday2);
  8.         }
  9. }
复制代码
运行Test.java,结果是:
FRI
SAT

现在想把下面这段代码
  1. public WeekDay nextDay(){
  2.                 if(this == SUN){
  3.                         return MON;
  4.                 }else if(this == MON){
  5.                         return TUE;
  6.                 }else if(this == TUE){
  7.                         return WES;
  8.                 }else if(this == WES){
  9.                         return THU;
  10.                 }else if(this == THU){
  11.                         return FRI;
  12.                 }else if(this == FRI){
  13.                         return SAT;
  14.                 }else{
  15.                         return SUN;
  16.                 }
  17.         }
复制代码
替换为
  1. public WeekDay nextDay(){
  2.                 switch(this){
  3.                 case SUN:
  4.                         return MON;
  5.                 case MON:
  6.                         return TUE;
  7.                 case TUE:
  8.                         return WES;
  9.                 case WES:
  10.                         return THU;
  11.                 case THU:
  12.                         return SAT;
  13.                 default:
  14.                         return SUN;
  15.                         }
  16.         }
复制代码
但会报错, 不知道该怎么处理?
作者: denghui1010    时间: 2013-7-27 00:41
dicegame 发表于 2013-7-27 00:23
我说的再详细一点吧运行Test.java,结果是:
FRI
SAT

这里不能用this,你这个只是用普通类实现枚举,但不是enum,所以这个this不是enum类型,就报错啦,非要用switch就用笨办法吧...
public class WeekDay {
    public final static WeekDay SUN = new WeekDay(1);
    public final static WeekDay MON = new WeekDay(2);
    public final static WeekDay TUE = new WeekDay(3);
    public final static WeekDay WES = new WeekDay(4);
    public final static WeekDay THU = new WeekDay(5);
    public final static WeekDay FRI = new WeekDay(6);
    public final static WeekDay SAT = new WeekDay(7);
    private int weekday;
    private WeekDay(int weekday){
            this.weekday = weekday;
    }
    public WeekDay nextDay(){
        switch(weekday){
        case 1:
                return MON;
        case 2:
                return TUE;
        case 3:
                return WES;
        case 4:
                return THU;
        case 5:
                return SAT;
        default:
                return SUN;
                }
作者: dicegame    时间: 2013-7-27 00:54
谢谢,目前这是最好的答案了:victory:




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2