Java枚举分析

枚举的作用是在编译时阻止数据不合法,规范数据类型。

一:用普通类模拟枚举实现原理

在主类中

public class Enum {
 public static void main(String[] args) {
  // 定义的对象及为枚举对象的属性 每一个枚举都是一个对象
  WeekDay1 weekday = WeekDay1.SUN;
  System.out.println(weekday);
 }
}

模拟枚举类型类

/*
 * 创建枚举对象
 */
public abstract class  WeekDay1 {
 private WeekDay1() {
 }

 // 定义常量
 /*
 public static final WeekDay SUN = new WeekDay();
 public static final WeekDay MON = new WeekDay();
  */
 
 // 定义方法
 /*public WeekDay nextDay() {
  if (this == SUN) {
   return MON;
  } else {
   return SUN;
  }
 }*/

 
 //抽象类  常量定义必须继承子类  子类为匿名内部类,继承父类中的抽象方法
 public static final WeekDay1 SUN=new WeekDay1(){

  @Override
  public WeekDay1 nextDay() {
   return MON;
  }
  
 };
 public static final WeekDay1 MON=new WeekDay1() {
  
  @Override
  public WeekDay1 nextDay() {
   // TODO Auto-generated method stub
   return SUN;
  }
 };
 
 
 
 //为了省去nextDay中的if...else方法,可以将方法定义为抽象方法 类就为抽象类了。
 public abstract WeekDay1 nextDay();


 // 打印常量的值必须覆盖tostring方法
 public String toString() {
  return this == SUN ? "SUNDAY" : "MONDAY";
 }
}

ps:
采用抽象方法定义nextDay就将大量的if...else语句转移成了一个个独立的类。
在一个个独立的类中编写方法就要继承调用类的内部类

 

二:采用enum

// 编写枚举
public class EnumBase {
 public static void main(String[] args) {
  WeekDay wd = WeekDay.MON;
  System.out.println(wd);
  System.out.println(wd.name());
  System.out.println(wd.ordinal());
  System.out.println(WeekDay.valueOf("SUN")); // 将字符串转化为枚举对象
  System.out.println(WeekDay.values().length);

  System.out.println(trafficLamp.Red.nextLamp());
 }

 public enum WeekDay {
  SUN(1), MON, SAT, TUE;
  // 编写构造方法 构造方法必须为私有private类型
  private WeekDay() {
   System.out.println("first");
  }

  private WeekDay(int day) {
   System.out.println("second");
  }
 }

 // 编写带上抽象方法的枚举
 public enum trafficLamp {
  // 枚举类熟悉相当于对象,实现抽象方法
  Red(30) {
   public trafficLamp nextLamp() {
    time--;
    System.out.println(time);
    return Green;
   }
  },
  Yellow(45) {
   public trafficLamp nextLamp() {
    return Red;
   }
  },
  Green(5) {
   public trafficLamp nextLamp() {
    return Yellow;
   }
  };
  // 抽象方法
  public abstract trafficLamp nextLamp();

  // 带参数构造方法
  public  int time;

  private trafficLamp(int time) {
   this.time = time;
  }
 }
}


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值