JCF之Enum

JCF之Enum

【摘要】JCF之Enum[枚举]~

前言

hi~

枚举 [enum]

JDK5.0开始有了枚举类型,它也是一种数据类型,是一种值类型。
它的目的是为了提供 “类型安全的常量”。
没有枚举之前,表达学员类型的性别:

1
2
3
4
5
6
7
8
public class Student {
private Integer id;
private String name;
private Gender gender; //性别 [男,女]
private StuStatus status; //学员的状态[未入学,学习中,退学,休学,毕业]
}
//创建一个学员对象,并赋给属性值
Student s1 = new Student(1,"ZhangYao",Gender.MALE,StuStatus的实例);

我们如何才能做到让Student的gender属性和status属性的值只能从固定好的几个值中进行选择?
答案:利用枚举。
如:

1
2
3
4
5
6
public enum Gender {
MALE,
//public static final Gender MALE = new Gender();
FEMALE;
//public static final Gender FEMALE = new Gender();
}

它的特点:

1.构造方法是私有的
2.每一个枚举常量值都是一个公开、静态、类本身的常量实例
3.自动继承于java.lang.Enum

语法:

1
2
3
4
5
6
7
public enum 枚举名 {
枚举常量1,
[枚举常量2,]
[枚举常量3,]
....
[枚举常量N];
}

如:

1
2
3
4
5
6
7
public enum Season {
SPRING,
//public static final Season SPRING = new Season();
SUMMER,
AUTUMN,
WINTER;
}

枚举类中也可以有抽象方法

但是要注意:
因为有抽象方法,则这个枚举从语法上来看,它属于抽象类。
它就不能被实例化,这样一来,它的所有枚举常量就是非法的。
所以,只能通过匿名内部类来实例化每一个枚举常量,并实现抽象方法。
如:

1
2
3
4
5
6
7
8
9
10
11
12
public enum Hehe {
A{
@Override
public void ma() {
//...
}
},
//相当于:public static final Hehe A = new Hehe();
B;
//抽象方法
public abstract void ma();
}

有关枚举的集合

java.util.EnumMap
java.util.EnumSet

作业

编写一个模拟扑克牌中的洗牌、发牌的业务,包含如下类型

  1. 开发两个枚举类型
    1
    2
    3
    4
    5
    6
    public enum 花色 {
    //黑、红、梅、方
    }
    public enum 点数 {
    //...从A至K
    }
    如果要考虑大小王,则再提供一个枚举
    1
    2
    3
    public enum Joker {
    //大、小
    }
  2. 开发一个卡片类 [Card], 由 花色、点数
    1
    2
    3
    4
    5
    public class Card {
    private 花色 花色;
    private 点数 点数;
    private 王牌 王牌;
    }
  3. 开发一个扑克牌类 [Poker], 它由 52/54张卡片组成
    1
    2
    3
    4
    5
    6
    public class Poker {
    //属性
    private String vendor; //
    private List<Card> cards; //这个属性很关键
    //...
    }
  4. 再写一个类,针对Poker的业务类
    1
    2
    3
    4
    5
    public class PokerService {  //有强大需求的可以定义接口
    //洗牌方法...
    //发牌方法... [玩家数,每人发几张]
    此方法把每个玩家的牌给打印出来..
    }

    结束语

    bye~

评论