------- android培训、java培训、java学习型技术博客、期待与您交流! ----------
关于java Enum:
* 1:Enum一般用来表示一组相同类型的常量,如:星期,月份,颜色等。* 对这些属性用常量的好处是不仅可以保证单例,且比较的时候可以用
* "=="来替代equals。在JDK1.5之前没有这个类型,那时候一般用接口
* 常量来替代,有了Enum后可以更铁近的表示这种常量。
* 2:如何使用Enum
* 简单的用法:一般用于代表一组常用常量,可用来代表一类相同类型的常量值
* 如:
* public enum Color
* {
* RED,BLUE,GREEN,BLACK;
* }
* 枚举对象里面的值都必须是唯一的。
* 可以通过Enum类型名直接引用该常量,如:Color.RED
*
* 复杂用法:Enum类中有很多方法,同时枚举常量还可以有自己的方法。
* 可以很方便的遍历枚举对象。
1:使用普通的类来实现枚举的原理:
* 下面这个两个类WeekDay和WeekDay1就是枚举的原理:
* 这个类比较特殊,它的构造函数是私有的,不允许其他人创建对象
* 然后它定义了几个成员变量。并且这些成员变量是静态的,常量
* 并且是它本身的对象。别人要用它的对象,就只能通过WeekDay.MON
* 来使用此对象。
* */
public class WeekDay
{
private WeekDay(){}
public final static WeekDay SUN =new WeekDay();
public final static WeekDay MON=new WeekDay();
public WeekDay nextDay()
{
if(this==SUN)
{
return MON;
}
else
return SUN;
}
public String toString()
{
return this==SUN?"SUN":"MON";
}
}
/*下面的代码是上面的优化,非常经典:
* 如果是从周一到周日,都列举的话,上面的代码就要写很长的if.else
* 语句或swith语句。所以我门采用下面的方法,用抽象方法定义nextDay(),就将大量
* 的if.else语句转移成了一个个独立的类。
*
* 但是同时方法抽象了,类也必须抽象,抽象类只能通过其子类,重写
* 它的方法,才能创建对象,所以就直接使用了内部类。
*
* private WeekDay1(){}
* //使用内部类来定义SUN对象
* public final static WeekDay1 SUN =new WeekDay1(){
*
*
* @Override
* public WeekDay1 nextDay() {
* // TODO 自动生成的方法存根
* return MON;
* }
*
* };
* //使用内部类来定义MON对象。
* public final static WeekDay1 MON =new WeekDay1(){
*
*
* @Override
* public WeekDay1 nextDay() {
* // TODO 自动生成的方法存根
* return SUN;
* }};
* public abstract WeekDay1 nextDay();
* public String toString()
* {
* return this==SUN?"SUN":"MON";
* }
* }
**/
//然后再主函数中调用WeekDay对象,及其中的方法。
public class EnumTest {
public static void main(String[]args)
{
WeekDay1 weekDay =WeekDay1.MON;
System.out.println(weekDay.nextDay());
WeekDay weekDay2=WeekDay.FRI;
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());
System.out.println(weekDay2.getClass());
System.out.println(weekDay2.getDeclaringClass());
//getClass()得到的是Enum类,
//getDeclaringClass()得到的是类声明的类。
System.out.println(WeekDay.valueOf("SUN"));
//获取枚举中的常量对象元素,返回的是对象数组。
System.out.println(WeekDay.values().length);
}
//像上面的代码实现的功能,太麻烦了,所以就引出了枚举:
//我们将WeekDay或WeekDay1中的代码用枚举来代替:
/*
public enum WeekDay
{
SUN,MON,TUE,WED,THT,FRI,SAT
}
这就是一个最简单的枚举。*/
//下面的代码演示了稍微复杂一点的枚举的用法:
/*
* 枚举TrafficLamp类定义在EnumTest类的内部成员方法上,
* 然后TrafficLamp类没有单独定义在另一个类中,因为枚举类本身就是一个类,
* 可以直接在枚举类中定义。像上例中WeekDay类是定义再了另外一个类中。
* 并且TrafficLamp
* 类的成员,全部都得定义在枚举获取的对象列表后面,并且可以
* 指定这些对象是通过TrafficLamp的那个构造函数来创建的。
* 并且TrafficLamp中有抽象方法,所以此类也是抽象的,不能直接
* 创建对象,要通过子类来创建。而我们下列中,直接用内部类来
* 操作。
*
*
* */
public enum TrafficLamp
{//枚举获得的对象,使用了TrafficLamp的带参数构造函数,并且用内部类
//来完成了抽象类TrafficLamp的对象建立。
RED(30){
public TrafficLamp nextLamp()
{
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp()
{
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp()
{
return RED;
}
};
//类TrafficLamp中的成员。
public abstract TrafficLamp nextLamp();//抽象方法
private int time;//成员变量
private TrafficLamp(int time)//私有化的带参数的构造函数
{
this.time=time;
}
}
}
------- android培训、java培训、java学习型技术博客、期待与您交流! ----------