在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

java enum(枚举)的使用

2017-2-13 12:56| 发布者: zhangjf| 查看: 1024| 评论: 0

摘要: 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集” ...

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。

例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。

enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中,在上面的这种情况下,enum就能派上用场了。枚举类型的用途不仅如此,具体可用场景可看下面的介绍

1、常量

以前我们定义一个常量通常都是使用 public static final …… 定义的,如下面:

  1. public static final CONSTANT_STR = "TEST";
复制代码

或者使用接口定义的变量,因为接口定义的变量默认都是public static final,如下:

  1. /**
  2. * 星期的常量接口
  3. */
  4. public interface IWeekConstants {
  5. String MON = "Mon";
  6. String TUE = "Tue";
  7. String WED = "Wed";
  8. String THU = "Thu";
  9. String FRI = "Fri";
  10. String SAT = "Sat";
  11. String SUN = "Sun";
  12. }
复制代码

有了枚举我们可以使用下面的方式:

  1. public enum WeekEnum {
  2. MON, TUE, WED, THU, FRI, SAT, SUN;
  3. }
复制代码

解释:创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum> ,而 E 表示枚举类型的名称。 枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中 ,在这里, 每个值的 名称 都被转换成一个 字符串 ,并且 序数 设置 表示了 此设置 被创建的顺序

上面那段代码声明的enum对象实际上调用了7次Enum(String name, int ordinal) 这个构造函数。(name 是常量,上面是MON,TUE等,ordinal是被创建顺序)

  1. new Enum<EnumTest>("MON",0);
  2. new Enum<EnumTest>("TUE",1);
  3. new Enum<EnumTest>("WED",2);
  4. 。。。。。。
复制代码

2、switch

当我们用switch时,一般都是使用int和char,但其实枚举也可以用在switch中,而且可能使用枚举,可以让我们的代码的可读性更强。下面是枚举使用enum的例子

  1. enum Color{
  2. GREEN, YELLOW, RED
  3. }
  4. public class TrafficLight {
  5. Color color = Color.RED;
  6. public void change() {
  7. switch (color) {
  8. case RED:
  9. System.out.println("红色");
  10. break;
  11. case YELLOW:
  12. System.out.println("黄色");
  13. break;
  14. case GREEN:
  15. System.out.println("绿色");
  16. break;
  17. }
  18. }
  19. }
复制代码

3、向枚举中添加新方法 + 遍历

我们使用常量的时候,我们使用接口的时候是可以有值与之对应的,如上面IWeekConstants 接口的MON的值是Mon,但枚举好像没能标示出这种意义。下面我们就讨论该方式的实现和枚举类型的遍历

枚举类型提供了构造函数,我们可以通过构造函数和覆写toString方法来实现。实现代码如下:

  1. package com.zcr.test;
  2. enum ActionTypeEnum{
  3. //通过括号赋值,而且必须带有一个参构造器和一个属性跟方法,否则编译出错
  4. //赋值必须都赋值或都不赋值,不能一部分赋值一部分不赋值;如果不赋值则不能写构造器,赋值编译也出错
  5. 下载(1,"xiazai"),访问(2,"fangwen");
  6. int index;
  7. String name;
  8. private ActionTypeEnum(int index,String name){
  9. this.index = index;
  10. this.name = name;
  11. }
  12. public int getIndex()
  13. {
  14. return index;
  15. }
  16. public void setIndex(int index)
  17. {
  18. this.index = index;
  19. }
  20. public String getName()
  21. {
  22. return name;
  23. }
  24. public void setName(String name)
  25. {
  26. this.name = name;
  27. }
  28. }
  29. public class EnumTest
  30. {
  31. public static void main(String[] args)
  32. {
  33. ActionTypeEnum[] actionTypeEnums = ActionTypeEnum.values();
  34. for(ActionTypeEnum actionTypeEnum : actionTypeEnums){
  35. System.out.println("name=" + actionTypeEnum.getName());
  36. System.out.println("index= " + actionTypeEnum.getIndex());
  37. System.out.println("oridary=" + actionTypeEnum.ordinal());
  38. System.out.println("this = " + actionTypeEnum);
  39. System.out.println("下载值:" + actionTypeEnum.valueOf("下载"));
  40. System.out.println("name()方法= " + actionTypeEnum.name());
  41. System.out.println("--------------叫我分割线------------------");
  42. }
  43. }
  44. }
复制代码

运行结果:

  1. name=xiazai
  2. index= 1
  3. oridary=0
  4. this = 下载
  5. 下载值:下载
  6. name()方法= 下载
  7. --------------叫我分割线------------------
  8. name=fangwen
  9. index= 2
  10. oridary=1
  11. this = 访问
  12. 下载值:下载
  13. name()方法= 访问
  14. --------------叫我分割线------------------
复制代码

4、总结

可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承),但可以继承接口。

致谢:感谢您的阅读!

来自: http://www.cnblogs.com/0201zcr/p/5104497.html

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 16:10

Copyright 2015-2025 djqfx

返回顶部