1、枚举概念

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个, 否则编译器就会报错,枚举可以让编译器在编译时就可以控制源程序赋给的非法值, 使用普通变量的方式在开发阶段无法实现这一目标。

在JDK 1.5之后, 使用关键字enum定义一种新的类型, 称为枚举类型。


2、Enum类与enum类关键字

使用enum关键字定义的枚举类, 实际上就相当于定义了一个类, 此类继承了Enum类而已。

Enum类中定义了如下的方法:

protected Enum(String name,int ordinal) 此构造方法不能被外部直接调用, 只能被其子 类访问, 此构造方法为自动调用。
public final String name() 枚举的名字
public final int ordinal() 枚举的序号

3、集合对枚举的支持

在JDK 1.5之后, 对于Set和Map接口而言又增加了两个新的子类: EnumSet、 EnumMap两个类。


4、带构造方法的枚举

  1. public enum Color {
  2. RED(10),BLUE(10);
  3. private Color() {}
  4. private int color;
  5. private Color(int color){
  6. this.color = color;
  7. }
  8. }

5、 让枚举实现接口

  1. interface Info {
  2. public String getColor();
  3. }
  4. public enum Color implements Info {
  5. RED {
  6. public String getColor() {return "红色";}
  7. },
  8. GREEN {
  9. public String getColor() {return "绿色";}
  10. },
  11. BLUE {
  12. public String getColor() {return "蓝色";}
  13. };
  14. }

6、 在枚举中定义抽象方法

  1. public enum Color{
  2. RED {
  3. public String getColor() {return "红色";}
  4. },
  5. GREEN {
  6. public String getColor() {return "绿色";}
  7. },
  8. BLUE {
  9. public String getColor() {return "蓝色";}
  10. };
  11. public abstract String getColor();
  12. }

Info

  1. package com.vince;
  2. /**
  3. */
  4. public interface Info {
  5. public int getColor();
  6. }

Color

  1. package com.vince;
  2. /**
  3. * 定义一个枚举类型
  4. */
  5. public enum Color implements Info{
  6. RED(10) {
  7. @Override
  8. public String getColor2() {
  9. return "red";
  10. }
  11. },GREEN(20) {
  12. @Override
  13. public String getColor2() {
  14. return "green";
  15. }
  16. },BLUE {
  17. @Override
  18. public String getColor2() {
  19. return "blue";
  20. }
  21. };
  22. private int color;
  23. private Color(){
  24. System.out.println("无参构造器");
  25. }
  26. private Color(int color){
  27. this.color = color;
  28. System.out.println("有参构造器");
  29. }
  30. @Override
  31. public int getColor() {
  32. return color;
  33. }
  34. public abstract String getColor2();
  35. }

EnumDemo

  1. package com.vince;
  2. import org.junit.Test;
  3. import java.util.Arrays;
  4. import java.util.EnumMap;
  5. import java.util.EnumSet;
  6. /**
  7. */
  8. public class EnumDemo {
  9. public static final int RED = 0x1;
  10. public static final int GREEN = 0x2;
  11. public static final int BLUE = 0x3;
  12. public int color;
  13. @Test
  14. public void test1(){
  15. color = RED;
  16. color = 4;
  17. }
  18. public Color colorEnum;
  19. @Test
  20. public void test2(){
  21. // colorEnum = Color.RED;
  22. // colorEnum = Color.BLUE;
  23. colorEnum = Color.GREEN;
  24. System.out.println(colorEnum);
  25. System.out.println(colorEnum.name());
  26. System.out.println(colorEnum.ordinal());
  27. System.out.println(colorEnum.toString());
  28. Color[] values = Color.values();
  29. System.out.println(Arrays.toString(values));
  30. }
  31. @Test
  32. public void test3(){
  33. EnumSet<Color> set = EnumSet.allOf(Color.class);
  34. for(Color c: set){
  35. System.out.println(c);
  36. }
  37. EnumMap<Color,String> map = new EnumMap<>(Color.class);
  38. map.put(Color.RED,"red");
  39. map.put(Color.GREEN,"green");
  40. map.put(Color.BLUE,"blue");
  41. }
  42. @Test
  43. public void test4(){
  44. System.out.println(Color.RED.getColor());
  45. System.out.println(Color.RED.getColor2());
  46. }
  47. //使用枚举实现单例设计模式
  48. @Test
  49. public void test5(){
  50. Singleton.SINGLETON.method();
  51. }
  52. }

Singleton

  1. package com.vince;
  2. /**
  3. */
  4. public enum Singleton {
  5. SINGLETON;
  6. public void method(){
  7. System.out.println("method");
  8. }
  9. }