枚举
枚举是jdk1.5版本增加的,枚举在C中是有的,为什么要用枚举,枚举是什么,我们先定义一个类叫Enum,这是枚举的单词,EnumTest.这里我们定义一个整数,叫weekDay。表示星期几。采用枚举,就是规定一个值,我定义了一个新的类型,以后你用这个类型,定义的值,就只能是我提前规定好的那些值。如果不是那些值,编译器就不让编过。
java的枚举,还是有一点复杂的,特别是要学深入,就有点复杂。为了让大家更好的了解枚举,我就先用普通类的方式来模拟实现枚举的功能,当大家对普通类掌握以后呢,java自身的枚举也就自然而然的掌握了。我定义一个新的类型。当这个类型的变量指向的值,只能是固定的那些值。首先我们先定义一个类叫WeekDay,它创建出来的实例对象,只能是我规定的那么几个。首先把构造方法改为私有的。让外面不能随便创建对象。其次,定义一个静态变量,类型还是WeekDay,同时定义成final。变量名是SUN, 值是new WeekDay().同理,写上7这个这样的值,分别命名成MON等,等到外面调用的时候,赋值的时候,只能是WeekDay weekDay = WeekDay.MON;或者SUN这些常量。如果想搞出这个列表(7个常量)之外的另外一个对象给外面调用是不可能的。也就是说MON这个常量,现在是一个Weekday类型的对象,由于类型一致,所以我们可以把这个对象赋值给引用变量weekDay。如果想为这个引用变量赋值,只能赋我在这个类型里面定义好的那些常量。这就是枚举。
枚举是个类,那么这个类里面是不是还能有方法呢?假设这个类中有个公开的方法。有一个叫nextDay()的方法。返回值类型是WeekDay,这个方法,不能是静态的了。因为我们之前的常量都是通过new出来的。方法里面我们添加if判断,而这个判断条件一定是通过某个对象来调用的。假如当前对象等等于SUN这个引用变量指向的对象,那么返回MON,elseif,如果列表有很多个就有很多个elseif。
上面就是用普通的java类来实现枚举的原理。也就是说,这个所定义出来的变量的值只能这里规定的那么几个。而且这个值不是一个普通的基本类型的值,而是对象类型的(本例中)。待会我们要学到枚举,枚举的每一个元素都是对象。
对于方法,还有一种实现方式。现在的方法中由于有大量的ifelse,有的人就不想这么写代码,他想把每一个元素的nextDay都用一个独立的方法去写,先写一个抽象方法: public abstract WeekDay nextDay();既然有了抽象方法,那么类也应该是抽象的,而类既然是抽象的了,那么以前类中通过new出来的静态常量就不可以了。我们必须去用它的子类才能去new对象。现在在原有代码基础上加上一对大括号,这就是表示用这个类的子类,来创建实例对象,这个子类是没有名字的,由于没有名字,所以叫匿名类,这个子类的具体代码就是在大括号里面,这表示定义了一个WeekDay的子类,并且用这个子类创建了一个对象,那这个子类的具体代码,就是覆盖父类中的抽象方法,并实现功能。
以上是我们用一个普通类来模拟一个枚举类的实现,下面我们来看一下真正的枚举类的基本应用。为了方便大家学习,枚举类就不单独定义一个文件了。定义枚举的关键字的是enum,后面加上枚举类的名称,WeekDay,最后直接大括号,这就是一个枚举。我们希望这个枚举类中有哪些值呢?就可以直接写上变量名即可,变量与变量之间,用逗号隔开,由于书写习惯和方便代码可看,每定义一个变量,最好是换行写下一个变量。最后的变量可写分号也可以不写分号。枚举就相当于一个类,枚举里面的一个元素 就相当于这个类中的一个实例对象,枚举类内部自动有toString()方法。对于枚举,还有name()方法,就是自己的名字,ordinal()方法,排序在第几位,还有个静态方法valueof(),把一个字符串变成枚举中的对应元素。
以上就是枚举的入门,下面我们来看看带有构造参数的枚举。上面中的示例枚举是一个最简单的枚举,枚举也是一个类吧,我们现在想为枚举定义构造方法,定义带有参数的构造方法,但需要注意:1.元素列表必须位于所有成分之前。就是说,构造方法必须位于列表之后,如果元素列表后面有成员,那么最后一个元素要带有分号。2. 构造方法必须私有。默认的列表中的元素初始化时,使用无参构造函数,如果想在元素初始化时,使用有参构造,可以在元素后面加上括号,填入相应参数。
接下来,我们再讲解一个更复杂的枚举。这个枚举带有抽象方法。前面已经说了,枚举就是一个类,枚举类的成员就是这个类的实例对象。我们以一个交通灯的示例作为演示。创建一个内部枚举类,叫TrafficLamp,有三种交通灯,分别是RED,GREEN,YELLOW,定义一个抽象方法,nextLamp();可以在元素后加{},来实现子类。
如果枚举只有一个成员,就可以作为一种单例的实现方式。
枚举就介绍完了。