Java 基础之-枚举

时间:2021-02-17 00:17:43
 
 

DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。

在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

Java代码 
  1. public enum Color {
  2. }

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

Java代码 
  1. enum Signal {
  2. }
  3. public class TrafficLight {
  4. public void change() {
  5. switch (color) {
  6. case RED:
  7. break;
  8. case YELLOW:
  9. break;
  10. case GREEN:
  11. break;
  12. }
  13. }

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

Java代码 
  1. public enum Color {
  2. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. // 普通方法
  11. public static String getName(int index) {
  12. for (Color c : Color.values()) {
  13. if (c.getIndex() == index) {
  14. return c.name;
  15. }
  16. return null;
  17. // get set 方法
  18. public String getName() {
  19. return name;
  20. public void setName(String name) {
  21. this.name = name;
  22. public int getIndex() {
  23. return index;
  24. public void setIndex(int index) {
  25. this.index = index;
  26. }

下面给出一个toString()方法覆盖的例子。

Java代码 
  1. public enum Color {
  2. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. //覆盖方法
  11. @Override
  12. public String toString() {
  13. return this.index+"_"+this.name;
  14. }

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

Java代码 
  1. public interface Behaviour {
  2. void print();
  3. }
  4. public enum Color implements Behaviour{
  5. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  6. // 成员变量
  7. private String name;
  8. private int index;
  9. // 构造方法
  10. private Color(String name, int index) {
  11. this.name = name;
  12. this.index = index;
  13. //接口方法
  14. @Override
  15. public String getInfo() {
  16. return this.name;
  17. //接口方法
  18. @Override
  19. public void print() {
  20. this.index+":"+this.name);
  21. }

Java代码 

  • public interface Food {
  • enum Coffee implements Food{
  • }
  • enum Dessert implements Food{
  • }
  • }

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。

关于枚举的实现细节和原理请参考:

参考资料:《ThinkingInJava》第四版

http://softbeta.iteye.com/blog/1185573

我的这篇文章,因为是转载的,可能基本就没有变动,导致被某人踩了一脚。觉得不符合我大师兄的性格。下面我把自己的使用理解给整理一下。

也是因为因为当时刚刚开始学习吧。把平时自以为了解的东西都只是大概了解了一下,说到底,还是自以为了解了,其实转眼就不知道什么是什么了。

出来学习,不习惯看代码怎么能行呢?

下面是我自己的测试代码。

  1. package com.lxk.enumTest;
  2. /**
  3. * Java枚举用法测试
  4. * <p>
  5. * Created by lxk on 2016/12/15
  6. */
  7. public class EnumTest {
  8. public static void main(String[] args) {
  9. forEnum();
  10. useEnumInJava();
  11. }
  12. /**
  13. * 循环枚举,输出ordinal属性;若枚举有内部属性,则也输出。(说的就是我定义的TYPE类型的枚举的typeName属性)
  14. */
  15. private static void forEnum() {
  16. for (SimpleEnum simpleEnum : SimpleEnum.values()) {
  17. System.out.println(simpleEnum + "  ordinal  " + simpleEnum.ordinal());
  18. }
  19. System.out.println("------------------");
  20. for (TYPE type : TYPE.values()) {
  21. System.out.println(type + " " + type.getTypeName() + "  ordinal  " + type.ordinal());
  22. }
  23. }
  24. /**
  25. * 在Java代码使用枚举
  26. */
  27. private static void useEnumInJava() {
  28. String typeName = "f5";
  29. TYPE type = TYPE.fromTypeName(typeName);
  30. if (TYPE.BALANCE.equals(type)) {
  31. System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
  32. } else {
  33. System.out.println("大师兄代码错误");
  34. }
  35. }
  36. /**
  37. * 季节枚举(不带参数的枚举常量)这个是最简单的枚举使用实例
  38. * Ordinal 属性,对应的就是排列顺序,从0开始。
  39. */
  40. private enum SimpleEnum {
  41. SPRING,
  42. SUMMER,
  43. AUTUMN,
  44. WINTER
  45. }
  46. /**
  47. * 常用类型(带参数的枚举常量,这个只是在书上不常见,实际使用还是很多的,看懂这个,使用就不是问题啦。)
  48. */
  49. private enum TYPE {
  50. /**
  51. * 防火墙
  52. */
  53. FIREWALL("firewall"),
  54. /**
  55. * 加密机
  56. */
  57. SECRET("secretMac"),
  58. /**
  59. * 负载均衡
  60. */
  61. BALANCE("f5");
  62. private String typeName;
  63. TYPE(String typeName) {
  64. this.typeName = typeName;
  65. }
  66. /**
  67. * 根据类型的名称,返回类型的枚举实例。
  68. *
  69. * @param typeName 类型名称
  70. */
  71. public static TYPE fromTypeName(String typeName) {
  72. for (TYPE type : TYPE.values()) {
  73. if (type.getTypeName().equals(typeName)) {
  74. return type;
  75. }
  76. }
  77. return null;
  78. }
  79. public String getTypeName() {
  80. return this.typeName;
  81. }
  82. }
  83. }



然后是测试的结果图:

Java 基础之-枚举

简单的例子,大家基本都用过,看不懂的基本都是第二个例子。可以看到,在第二个例子里面,后面带有参数,其实可以这么理解。

enum这个关键字,可以理解为跟class差不多,这也个单独的类。可以看到,上面的例子里面有属性,有构造方法,有getter,也可以有setter,但是一般都是构造传参数。还有其他自定义方法。那么在这些东西前面的,以逗号隔开的,最后以分号结尾的,这部分叫做,这个枚举的实例。也可以理解为,class
 new
出来的实例对象。这下就好理解了。只是,class,new对象,可以自己随便new,想几个就几个,而这个enum关键字,他就不行,他的实例对象,只能在这个enum里面体现。也就是说,他对应的实例是有限的。这也就是枚举的好处了,限制了某些东西的范围,举个栗子:一年四季,只能有春夏秋冬,你要是字符串表示的话,那就海了去了,但是,要用枚举类型的话,你在enum的大括号里面把所有的选项,全列出来,那么这个季节的属性,对应的值,只能在里面挑。不能有其他的。

我上面的例子,就是根据typeName,你可以从那些例子里面挑选到唯一的一个TYPE类型的枚举实例--TYPE.BALANCE。注意方法

TYPE type = TYPE.fromTypeName(typeName);

这个方法的返回类型就是这个TYPE枚举类型的。

这下就好理解,这个枚举是怎么在工作了吧