还有你不知道的Java枚举特性(上篇)
简介
博文 Java 枚举的本质 跟大家一起学习了 Java 语言中枚举到底是什么,探索其本质和原理。用一句话来概括其本质就是:“Java 中的枚举是一个特殊的 Java 类”,有兴趣的同学可以点击了解上面那篇文章。
今天跟大家一起学习和总结一下 Java 中的枚举的其他特性和用途,由于内容较多,这次的分享分为两篇文章来写,欢迎大家拍砖、指正和交流!
本篇主要内容:
- Java switch 语句支持枚举类型以及注意事项
- Java 枚举的常量使用
- 如何在自定义枚举中自定义成员变量和成员方法、静态方法
- Java 枚举实现接口
下篇主要内容:
- Java 枚举是一个特殊的类,聊聊其方法的重写
- 如何使用接口来组织 Java 枚举?
- JDK 数据结构中关于枚举的集合
EnumSet
和字典 EnumMap
switch 语句支持枚举
JDK1.5 才开始有枚举类型,同时可爱的 Java 组织丰富了 switch
语句,即支持枚举。
我们还是动手写个例子~
定义一个枚举 Color
,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public enum Color { RED("red color", 0), GREEN("green color", 1), BLUE("blue color", 2), YELLOW("yellow color", 3); Color(String name, int id) { _name = name; _id = id; } private String _name; private int _id; public String getName() { return _name; } public int getId() { return _id; } public static Color getColor(int max) { Random random = new Random(System.currentTimeMillis()); int num = random.nextInt(max); switch (num) { case 0: return Color.RED; case 1: return Color.GREEN; case 2: return Color.BLUE; case 3: return Color.YELLOW; default: return Color.BLUE; } } }
|
为枚举 Color
提供了一个静态方法 getColor
,可以获取随机的颜色值。
那么,可以结合 switch
语句这样使用,示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public static void main(String[] args) { int len = Color.values().length; Color color = Color.getColor(len); switch (color) { case RED: System.out.println("select " + "RED"); break; case GREEN: System.out.println("select " + "GREEN"); break; case BLUE: System.out.println("select " + "BLUE"); break; case YELLOW: System.out.println("select " + "YELLOW"); break; default: System.out.println("select " + "unknow!!"); break; } }
|
可以看出,switch
语句中条件值是 Color
对象。
这里提醒大家要注意一个问题,如果 case
的条件带上类的名字,代码是无法通过编译的。如下面的代码(错误示例):
1 2 3 4
| case Color.RED: System.out.println("select " + "RED"); break;
|
编译的错误信息:
1
| Error: An enum switch case label must be the unqualified name of an enumeration constant
|
即 switch
case
语句结合枚举使用时,只能写枚举类定义的变量名称,不能加类名。
当常量使用
一般在 Java 中我们定义常量最常用的方式就是使用下面的方式,如下:
1
| public static final int MAX_NAME_LENGTH = 0x1112;
|
有了枚举之后,也可以使用枚举来定义常量。
1 2 3
| public enum Color { YELLOW, BLANK, RED, GREEN }
|
这样就可以把一些相关的常量放到定义的枚举当中了。
自定义方法、成员变量
上面的例子中自定义的一个枚举 Color
,大家可以看到可以给它添加成员变量 _id
、_name
,构造方法和其他方法 getColor
(静态方法)。
如果这部分很难理解,建议去阅读 Java 枚举的本质 这篇文章。
实现接口
所有的枚举类都继承自 Enum
,因为 Java 不支持多继承,所以枚举无法继承其它类。
枚举既然是和 Java 的普通类基本一样,那么,枚举当然也可以实现接口。
下面是枚举 Color
实现接口 Paint
的例子,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| interface Paint { void setColor(); }
public enum Color implements Paint { RED("red color"), GREEN("green color"), BLUE("blue color"), YELLOW("yellow color");
Color(String name) { _name = name; }
private String _name;
@Override public void setColor() { System.out.println("Current paint color: " + _name); } }
|
还可以采用匿名内部类的方式,让每个枚举值实现接口 Paint
的方法,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public enum Color implements Paint { RED("red color") { @Override public void setColor() { System.out.println("Current paint color: " + RED._name); } }, GREEN("green color") { @Override public void setColor() { System.out.println("Current paint color: " + GREEN._name); } }, BLUE("blue color") { @Override public void setColor() { System.out.println("Current paint color: " + BLUE._name); } }, YELLOW("yellow color") { @Override public void setColor() { System.out.println("Current paint color: " + YELLOW._name); } };
Color(String name) { _name = name; }
private String _name;
@Override public void setColor() { System.out.println("Current paint color: " + _name); } }
|
可以写个方法测试一下,如下:
1 2 3 4 5
| public static void main(String[] args) { for (Color color : Color.values()) { color.setColor(); } }
|
输出结果,如下:
1 2 3 4
| Current paint color: red color Current paint color: green color Current paint color: blue color Current paint color: yellow color
|
人生没有永远的赢家,切勿大喜大悲,要以平常心对待一切~