java中的枚举

来源:互联网 发布:有个搞笑的淘宝真人秀 编辑:程序博客网 时间:2024/04/29 08:53

枚举

        枚举是java1.5版本的新特性,这个特性也是在c语言里面演化过来的,枚举的作用就是用来固定变量值,我们定义一个枚举类,在枚举中把我们需要使用的元素固定下来,这样在其他地方调用这个枚举变量时,如果所赋之值不是我提前定义好的元素,那么编译器就会报错。

一.我们首先通过自定义一个类来模仿枚举的功能。

public class SimulationEnum {public static void main(String[] args) {//为WeekDay类型的变量进行赋值时只能是我们提前定义好的元素WeekDay wd = WeekDay.MONDAY;System.out.println(wd);}}/* * 定义一个类 * 1.私有化其构造函数,外部不能给这个类创建对象 * 2.自定静态变量指向其本类对象,也就是说 * 外部想获得这个类的对象只能通过这些静态字段获得 * 3.将每一个字段中封装不同的对象以便外部使用 * */abstract class WeekDay{//私有化构造函数private WeekDay(){}/*//提供一个方法用于返回下一天,如果定义在本类中的话,需要大量的if...else语句来判断,所有我们//使用内部类的方式来实现,让每一个本类型变量所对应的对象都实现这些方法public WeekDay nextDay(){if(this == SUNDAY)return MONDAY;if(this == MONDAY)return SUNDAY;return null;}}*//* * 将大量的if...else语句转移到相对应的元素中: * 现在让每一个元素有自己的实现方法首先构建一个抽象方法,让每一个元素都实现这个抽象方法,所以这个类必须是一个抽象类,由此我么可以看出枚举也是一个抽象的类*/public abstract WeekDay nextWeek();//让每一个元素都实现该方法public final static WeekDay SUNDAY = new WeekDay(){public WeekDay nextWeek() {// 星期天的下一天是星期一return MONDAY;}};public static final WeekDay MONDAY = new WeekDay(){public WeekDay nextWeek(){//此处星期一的下一天是星期天return SUNDAY;}};//复写toString方法public String toString() {//因为只有两个元素,所以使用三元运算符,不使用if...else语句了return this==SUNDAY?"SUNDAY":"MONDAY";}}

二.枚举的格式及常见方法

       1.枚举的格式

       enum  类名{}

        枚举的第一行都是这个枚举类的元素,也就是这个枚举可以产生多少对象,每个对象的名字就是我们需要定义的。在定义完元素名称后如果要为这个枚举类增加方法,而这个方法是每个对象特有的,比如是每个对象都要返回他的下一个对象,那么就把这个方法定义成抽象方法,然后让每个元素去实现这个方法。

       2.枚举的常见方法

       1>name()

        返回类型为String,获取元素名称。

       2>ordinal()

        返回类型int,把该枚举元素在所有枚举元素中的排行返回

       3>getDeclaringClass()

        返回类型Class,返回枚举元素的Class对象

       4>valueOf(Class<T> enumType,String name)

        返回带指定名称的指定类型的枚举常量,通过对象调用该方法时,可省略类型,此方法较为常用,我们可以通过字符串来获取一个枚举元素,非常方便。

       5>values()

        返回该枚举类中所有元素的数组

        示例:

//定义一个星期的枚举enum Week{//把所有的元素写在第一行,如果最后一个元素后还有内容必须要加“;”SUN,MON,TUES,WEDNES,THURS,FRI,SATUR;//私有化构造函数,当无需为元素指定初始化时可省略private Week(){System.out.println("空参构造函数 ");}}public class WeekEnum {public static void main(String[] args) {//获取一个枚举元素Week week = Week.SUN;System.out.println("name:"+week.name());System.out.println("ordinal:"+week.ordinal());System.out.println("getClass:"+week.getClass());System.out.println("getDeclarintClass:"+week.getDeclaringClass());System.out.println("valueOf:"+week.valueOf("SUN"));System.out.println("Enum.valueOf:"+Enum.valueOf(Week.class, "MON"));Week[] weeks = week.values();for(Week w: weeks){System.out.print(w.name()+" ");}}}

       3.枚举中的构造方法用来初始化元素,而且枚举中的构造方法必须是私有的,因为枚举就是为了固定变量值的,不能让外界创建对象。在枚举中较为复杂的一种是每一个元素都有指定的初始化参数,而且要覆盖掉枚举类中的抽象方法,我们以红绿灯为例说明,每一个灯都有着自己的亮灯时间和返回下一个灯的方法。

enum Lamp{RED(30){@Override//我现在知道这是什么意思了,这是注解,用来检测你的方法是不是真的覆盖了父类方法public Lamp nextLamp() {//红灯后返回绿灯return GREEN;}},GREEN(15){@Overridepublic Lamp nextLamp() {//绿灯后返回黄灯return YELLOW;}},YELLOW(5){@Overridepublic Lamp nextLamp() {//黄灯后返回红灯return RED;}};//定义私有成员变量private int time;//私有化构造函数,接收本类型休息时间private Lamp(int time){this.time = time;}//创建抽象方法返回下一个枚举实例,让每一个枚举实例都要实现该方法,public abstract Lamp nextLamp();}

       4.当枚举中只有一个元素时,这个枚举可以用作单例设计模式,这样省略了私有化构造函数和提供对外返回本类对象的方法这两个步骤,简化的书写。




0 0
原创粉丝点击