黑马程序员——Enum的原理及用法总结

------- 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学习型技术博客、期待与您交流! ----------






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值