枚举是 JDK 1.5 新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错误码等。
枚举类型不止存在在 Java 语言中,在其它语言中也都能找到它的身影,例如 C# 和 Python 等,但我发现在实际的项目中使用枚举的人很少,所以本文就来聊一聊枚举的相关内容,好让朋友们对枚举有一个大概的印象,这样在编程时起码还能想到有“枚举”这样一个类型。
本文的结构目录如下:
枚举的 7 种使用方法
很多人不使用枚举的一个重要的原因是对枚举不够熟悉,那么我们就先从枚举的 7 种使用方法说起。
用法一:常量
在 JDK 1.5 之前,我们定义常量都是 public static final...
,但有了枚举,我们就可以把这些常量定义成一个枚举类了,实现代码如下:
public enum ColorEnum { RED, GREEN, BLANK, YELLOW }
用法二:switch
将枚举用在 switch 判断中,使得代码可读性更高了,实现代码如下:
enum ColorEnum { GREEN, YELLOW, RED } public class ColorTest { ColorEnum color = ColorEnum.RED; public void change() { switch (color) { case RED: color = ColorEnum.GREEN; break; case YELLOW: color = ColorEnum.RED; break; case GREEN: color = ColorEnum.YELLOW; break; } } }
用法三:枚举中增加方法
我们可以在枚举中增加一些方法,让枚举具备更多的特性,实现代码如下:
public class EnumTest { public static void main(String[] args) { ErrorCodeEnum errorCode = ErrorCodeEnum.SUCCESS; System.out.println("状态码:" + errorCode.code() + " 状态信息:" + errorCode.msg()); } } enum ErrorCodeEnum { SUCCESS(1000, "success"), PARAM_ERROR(1001, "parameter error"), SYS_ERROR(1003, "system error"), NAMESPACE_NOT_FOUND(2001, "namespace not found"), NODE_NOT_EXIST(3002, "node not exist"), NODE_ALREADY_EXIST(3003, "node already exist"), UNKNOWN_ERROR(9999, "unknown error"); private int code; private String msg; ErrorCodeEnum(int code, String msg) { this.code = code; this.msg = msg; } public int code() { return code; } public String msg() { return msg; } public static ErrorCodeEnum getErrorCode(int code) { for (ErrorCodeEnum it : ErrorCodeEnum.values()) { if (it.code() == code) { return it; } } return UNKNOWN_ERROR; } }
以上程序的执行结果为:
状态码:1000 状态信息:success
用法四:覆盖枚举方法
我们可以覆盖一些枚举中的方法用于实现自己的业务,比如我们可以覆盖 toString()
方法,实现代码如下:
public class EnumTest { public static void main(String[] args) { ColorEnum colorEnum = ColorEnum.RED; System.out.println(colorEnum.toString()); } } enum ColorEnum { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLOW("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private ColorEnum(String name, int index) { this.name = name; this.index = index; } //覆盖方法 @Override public String toString() { return this.index + ":" + this.name; } }
以上程序的执行结果为:
1:红色