Java-枚举类

1.枚举类

   一个类的实例是有限且固定的,则这个类称为枚举类。比如季节类,只有四个对象(春、夏、秋、冬)。

 1 //创建一个枚举类的
 2 /*
 3 (1)通过private将构造器隐藏起来
 4 (2)把这个类的所有可能实例都使用private static final修饰的类变量来保存。
 5 (3)如果有必要,可以提供一些静态方法。
 6 */
 7 public class Demo
 8 {
 9     public static void main (String []args)
10     {
11        System.out.println("spring:"+Season.SPRING.getName());
12     }
13 }
14 class Season 
15 {   
16     private   String name;
17     private   Season (String name)
18     {
19         this.name=name;
20     }
21     public static final Season SPRING=new Season ("春天") ;
22     public static final Season SUMMER=new Season("夏天");
23     public static final Season AUTUMN=new Season ("秋天");
24     public static final Season WINTER=new Season ("冬天");
25     public   String getName()
26     {
27        return this.name;
28     }
29 
30 }

2.不可变类
   不可变类:创建该类的实例后,该实例的Field是不可改变的。
   如果要创建自定义的不可变类,需遵循如下规则:

  1.  使用private和final修饰符来修饰该类的Field。
  2.  提供带参数的构造函数,用于根据传入参数来初始化类里的Field。
  3.  仅为该类的Field提供getter方法,不要为该类的Field提供setter方法。
  4.  如果有必要,重写Object类的hashCode和equals方法。

3.Enum类(枚举)

  1.  使用enum关键字定义枚举类。枚举类一样可以有自己的Field方法,可以实现一个或多个接口,也可以有自己的构造器
  2.  使用eunm定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类。
  3.  使用enum定义、非抽象枚举类默认会使用final修饰,因此枚举类不能派送子类。(并不是所有的枚举类都使用final修饰,如抽象枚举类)
  4.  枚举类所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远不能产生实例。
  5.  所有枚举类都提供一个values方法,该方法可以方便地遍历所有枚举值。

      enum的常用静态方法:

          枚举类名.values() ;//以数组的形式返回该枚举的所有实例

          Enum.valueOf(枚举类名.class,枚举实例名); //返回该枚举类下指定的枚举实例。

 1 //访问枚举类的实例,或方法,以“枚举类名.实例”,“枚举类名.方法名”访问
 2 //使用enum定义一个简单的枚举类
 3 //使用enum的values()方法,遍历所有的枚举
 4 public class Demo1
 5 {
 6     public static void main(String []args) throws Exception
 7     {
 8         method(SeasonEnum.SUMMER);
 9         method2();
10     }
11     public static void method2()
12     { 
13         for ( SeasonEnum se: SeasonEnum.values() )
14         {
15             System.out.println("SeasonEnum:"+se);
16         }
17     }
18     public static void method(SeasonEnum s)
19     {
20         switch (s)
21         {
22         default: System.out.println("null"); break;
23         case SPRING: System.out.println("spring"); break;
24         case SUMMER: System.out.println("summer"); break;
25         case AUTUMN: System.out.println("autumn"); break;
26         case WINTER: System.out.println("winter"); break;
27         
28         }
29 
30     }
31 }
32  enum SeasonEnum
33 {
34     SPRING ,SUMMER, AUTUMN ,WINTER ;
35 
36 }

3.1一个规范化的枚举类(拥有自己不可变的Field)

 1 /*
 2   枚举类可以定义自己的Field和方法。 
 3   枚举类通常应该设计不可变类。其Field值不应该允许改变,这样会更安全。
 4   所以枚举类的Field都应该使用private final修饰。
 5   枚举实例名称一般都是大写字母
 6   Enum.valueOf()方法演示
 7 */
 8 enum Gender
 9 {
10     MALE("男"),FEMALE("女");
11     private Gender(String sex)
12     {
13         this.sex=sex;
14     }
15     private final String sex;
16     public String getSex()
17     {
18       return sex;
19     }
20 }
21 public class Demo2
22 {
23     public static void main (String []args)
24     {
25         Gender g=Gender.MALE;
26         System.out.println("Gender.MALE:"+g.getSex());
27         //使用Enum.valueOf()方法访问枚举类下的某个实例
28         Gender g2=Enum.valueOf(Gender.class,"FEMALE");
29         System.out.println("Enum.valueOf(Gender.class,\"FEMALE\"):"+g2.getSex());
30     }
31 }

3.2枚举类实现一个或多个接口(且不同枚举实例有各自的接口实现方法)

1 //枚举类实现一个或多个接口(且不同枚举实例有各自的接口实现方法)
2 public class Demo3
3 {
4     public static void main (String []args)
5     {
6        Gender.MALE.info();
7     }
8 }
//以下代码需要放在GenderInter.java文件中
public interface GenderInter
{
    public void info();

}
 enum Gender implements GenderInter
{
    MALE("男")
    {
        public void info()
        {
         System.out.println("我是男的");
        }
    },FEMALE("女")
    {
        public void info()
        {
         System.out.println("我是女的");
        }
    };
    private Gender(String sex)
    {
        this.sex=sex;
    }
    private final String sex;
    public String getSex()
    {
      return sex;
    }
}

3.3 包含抽象方法的枚举类

 含有抽象方法的枚举类,它的每一个枚举实例必须覆盖重写该抽象方法

 1 //注意:含有抽象方法的枚举类,它的每一个枚举实例必须覆盖重写该抽象方法
 2 public class EnumAbstractDemo {
 3 
 4     /**
 5      * @param args
 6      */
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9        System.out.println("plus:5+2="+Operation.PLUS.eval(5, 2));
10        System.out.println("minus:5-2="+Operation.MINUS.eval(5, 2));
11        System.out.println("times:5*2="+Operation.TIMES.eval(5, 2));
12        System.out.println("divide:5/2="+Operation.DIVIDE.eval(5, 2));
13     }
14 
15 }
16 enum Operation
17 {
18     //定义四种加减乘除的枚举值
19     PLUS {
20         @Override
21         public double eval(double x, double y) {
22             // TODO Auto-generated method stub
23             return x+y;
24         }
25     },MINUS {
26         @Override
27         public double eval(double x, double y) {
28             // TODO Auto-generated method stub
29             return x-y;
30         }
31     },TIMES {
32         @Override
33         public double eval(double x, double y) {
34             // TODO Auto-generated method stub
35             return x*y;
36         }
37     },DIVIDE() {
38         @Override
39         public double eval(double x, double y) {
40             // TODO Auto-generated method stub
41             return x/y;
42         }
43     };
44     public abstract double eval(double x,double y);
45 }

 

posted @ 2015-02-05 16:50  beyondbycyx  阅读(355)  评论(0编辑  收藏  举报