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是不可改变的。
如果要创建自定义的不可变类,需遵循如下规则:
- 使用private和final修饰符来修饰该类的Field。
- 提供带参数的构造函数,用于根据传入参数来初始化类里的Field。
- 仅为该类的Field提供getter方法,不要为该类的Field提供setter方法。
- 如果有必要,重写Object类的hashCode和equals方法。
3.Enum类(枚举)
- Field、方法,可以实现一个或多个接口,也可以有自己的构造器。
- 默认继承了java.lang.Enum类,而不是继承Object类。
- 非抽象的枚举类默认会使用final修饰,因此枚举类不能派送子类。(并不是所有的枚举类都使用final修饰,如抽象枚举类)
- 实例必须在枚举类的第一行显示列出,否则这个枚举类永远不能产生实例。
- 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 }