枚举

来源:互联网 发布:啤酒游戏优化软件 编辑:程序博客网 时间:2024/05/16 03:39
枚举
            右键直接新建enum,枚举类也是一种特殊形式的java类;
            ***枚举类中声明的每一个枚举值代表枚举类的一个实例对象;
            在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的;
            枚举类也可以实现接口,或继承抽象类;
            JDK5中扩展了switch语句,它除了可以接收int,byte,char,short外,还可以接收一个枚举类型;
            若枚举类只有一个枚举值,则可以当作单态设计模式使用;
            Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。
            常用方法:
                    name(): 返回此枚举类型对应常量的字符串,在其枚举声明中对其进行声明;                                     
                    ordinal(): 返回枚举常量的序数,其中初始量从0开始;
                    valueof(String name): 根据该枚举类型对应常量的字符串返回其对应的枚举类型值;
                    values(): 返回所有的枚举值;
              注意: 枚举类中的枚举值要放到代码的首行;


            技巧: 使用匿名内部类来完成枚举值与字符串之间的转换
            
            ***************************************************************************************************************
            例1:  定义枚举及其原理
            public class Student {
                    private String name;
                    private Grade grade;
                    public String getName() {
                            return name;
                    }
                    public void setName(String name) {
                            this.name = name;
                    }
                    public Grade getGrade() {
                            return grade;
                    }
                    public void setGrade(Grade grade) {
                            this.grade = grade;
                    }
            }
                     
            /*             
            public class Grade {
                    private Grade(){}
                    public static Grade A = new Grade();  
                    public static Grade B = new Grade();
                    public static Grade C = new Grade();
                    public static Grade D = new Grade();
                    public static Grade E = new Grade();
             }
             */
            //  定义枚举:   原理如上   A,B,C,D,E代表着自身的一个个的实例对象(如上)  
           enum Grade{
                A,B,C,D,E;
           }
           
           public class Demo {
                  @Test
                  public void test(){
                          Student s = new Student();
                          s.setName("冠希哥 ");
                          s.setGrade(Grade.A);
                  }
           }
                    
            ***************************************************************************************************************
            
            例2:  定义枚举的构造方法      A 100~90  B 80~90  C 70~80  D 60~70 E 0~59           
            public class Student {
                    private String name;
                    private Grade grade;
                    public String getName() {
                            return name;
                    }
                    public void setName(String name) {
                            this.name = name;
                    }
                    public Grade getGrade() {
                            return grade;
                    }
                    public void setGrade(Grade grade) {
                            this.grade = grade;
                    }
            }
            
          
            /*
             // 定义枚举的构造方法
             public class Grade {             
                    private String value;
                    private Grade(String value){
                            this.value = value;
                    }
                    public static Grade A = new Grade("100~90");
                    public static Grade B = new Grade("89~80");
                    public static Grade C = new Grade("79~70");
                    public static Grade D = new Grade("69~50");
                    public static Grade E = new Grade("59~0");
             }
             */
            // 使用枚举方式:  原理如上  注意: 枚举类中的枚举值要放到代码的首行;
             enum Grade{
                     A("100~90"),B("89~80"),C("79~70"),D("69~50"),E("59~0");
                     private String value;
                     private Grade(String value){
                            this.value = value;
                     }
                     public String getValue(){
                            return value;
                     }
             }


            public class Demo {
                    @Test
                    public void test(){                      
                            Student s = new Student();
                            s.setName("冠希哥 ");             
                            s.setGrade(Grade.A);                      
                            Grade g = s.getGrade();
                            String v = g.getValue();
                            Assert.assertEquals("100~90", v);                     
                    }
            }
            ***************************************************************************************************************
           例3:  定义枚举的抽象方法      A 100~90 优秀  B 89~80 良好  C 79~70 一般   D 69~60 及格   E 0~59 不及格
           public class Student {
                    private String name;
                    private Grade grade;
                    public String getName() {
                            return name;
                    }
                    public void setName(String name) {
                            this.name = name;
                    }
                    public Grade getGrade() {
                            return grade;
                    }
                    public void setGrade(Grade grade) {
                            this.grade = grade;
                    }
           }
           
           // 定义枚举的抽象方法
           /*
           public class Grade {
            public abstract String toLocaleString();           
            private Grade(){}
            // 匿名内部类方式实现中文转换的toLocaleString方法
            public static Grade A = new Grade("100~90"){
                    public String toLocalString(){
                            return "优秀";
            }};
            // B.C.D.E均为如上方式,略
           }
           */
          // 使用枚举定义枚举的抽象方法:  与上面的代码完全相同     
          // A 100~90  B 80~90  C 70~80  D 60~70 E 0~59
          enum Grade {           
                    A("100~90") {
                            public String toLocaleString() {
                                    return "优秀";
                            }},
                    B("80~90") {
                            public String toLocaleString() {
                                    return "良好";
                            }},
                    C("70~80") {
                            public String toLocaleString() {
                                    return "一般";
                            }},
                    D("60~70") {
                            public String toLocaleString() {
                                    return "及格";
                            }},
                    E("0~59") {
                            public String toLocaleString() {
                                    return "不及格";
                            }};
                    private String value;
                    private Grade(String value) {
                            this.value = value;
                    }
                    public String getValue() {
                            return value;
                    }         
                    public abstract String toLocaleString();
        }


        public class Demo {
                    @Test
                    public void test(){                      
                            Student s = new Student();
                            s.setName("冠希哥 ");
                            s.setGrade(Grade.A);                      
                            Grade g = s.getGrade();
                            String v = g.getValue();
                            Assert.assertEquals("100~90", v);
                            String localeValue = g.toLocaleString();
                            Assert.assertEquals("优秀", localeValue);
        }
        ***************************************************************************************************************
        例4:  定义星期天的枚举
        public enum WeekDay {
                MON {
                      public String toLocalString() {
                                return "星期一";
                 }},
                TUE {
                      public String toLocalString() {
                                return "星期二";
                }},
                WED {
                      public String toLocalString() {
                                return "星期三";
                  }},
                THU {
                      public String toLocalString() {
                                return "星期四";
                  }},
                FRI {
                      public String toLocalString() {
                                return "星期五";
                  }},
                SAT {
                      public String toLocalString() {
                                return "星期六";
                  }},
                SUN {
                      public String toLocalString() {
                                return "星期日";
                  }};
                public abstract String toLocalString();
      }
      
      public class Demo {
              @Test
              public void test(){
                      WeekDay wd = WeekDay.MON;
                      Assert.assertEquals("星期一", wd.toLocalString());
              }
        }
        
        ***************************************************************************************************************
        // 枚举中常用的方法
        //枚举中的常用方法:自定义的枚举类的爸爸是java.lang.Enum
        @Test
        public void test2(){
                WeekDay wd = WeekDay.FRI;
                String name = wd.name();//枚举类型对应的字符串名称
                System.out.println(name);
          
                String str = "MON";
                WeekDay wd1 = WeekDay.valueOf(str);
                System.out.println(wd1.toLocaleString());
                
                WeekDay wd2 = WeekDay.SUN;
                System.out.println(wd2.ordinal());
        }
        @Test
        //特殊的属性values:返回所有的枚举值。API中看不到的
        public void test3(){
                WeekDay [] wds = WeekDay.values();
                for(WeekDay wd:wds){
                        System.out.println(wd.name());
                }
        }
        
      ***************************************************************************************************************
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           
           


            
0 0