java面向对象(五)枚举类Enum

枚举类知识点

一、什么是枚举类

1.什么是枚举

一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数

2.枚举类 : 只包含可选枚举对象的类

二、为什么要使用枚举类

没有枚举类的情况下,模拟枚举:

一般通过定义一个或多个只包含常量的类,如我们定义接口响应的错误对象:

  • 一个定义状态码的类
  • 一个定义提示信息的类
  1. /**
  2. * 错误码类
  3. */
  4. class ErrorCode {
  5. public final static int SERVER_ERROR = 9000;
  6. public final static int PARAM_SERVER = 4001;
  7. public final static int DB_SERVER = 5001;
  8. public final static int CACHE_ERROR = 6001;
  9. public final static int UNKNOWN_ERROR = 9999;
  10. }
  11. /**
  12. * 错误提示信息类
  13. */
  14. class ErrorMsg {
  15. public final static String SERVER_ERROR = "服务端错误";
  16. public final static String PARAM_SERVER = "参数错误";
  17. public final static String DB_SERVER = "数据库错误";
  18. public final static String CACHE_ERROR = "缓存错误";
  19. public final static String UNKNOWN_ERROR = "未知错误";
  20. }
  21. public class Contants {
  22. public static void main(String[] args) {
  23. System.out.println(ErrorCode.CACHE_ERROR);
  24. System.out.println(ErrorMsg.CACHE_ERROR);
  25. }
  26. }

上面这个例子的问题:

  • 定义了很多冗余的信息,比如ErrorCode的错误码类,除了具体的数字不一样,其他的都是一样的类型
  • 当要输出某类错误时,要查错误码的具体的某个码值,还要查错误信息类的对应的提示信息,如何对应是一个问题

三、如何定义枚举类

  1. enum [类名] {
  2. }
  • 和定义普通类很相似,普通类是用class关键词来标注,而枚举类很enum关键词来标明
  1. enum ResponseError {
  2. SERVER_ERROR(9000, "服务端错误"),
  3. PARAM_ERROR(4001, "参数错误"),
  4. DB_ERROR(5001, "数据库错误"),
  5. CACHE_ERROR(6001, "缓存错误"),
  6. UNKNOWN_ERROR(9999, "未知错误");
  7. //错误码
  8. private int code;
  9. //错误提示信息
  10. private String message;
  11. ResponseError(int code, String message) {
  12. this.code = code;
  13. this.message = message;
  14. }
  15. public int getCode() {
  16. return this.code;
  17. }
  18. public String getMessage() {
  19. return this.message;
  20. }
  21. }
  22. public class EnumDemo {
  23. public static void main(String[] args) {
  24. System.out.println(ResponseError.PARAM_ERROR.getCode()); //4001
  25. System.out.println(ResponseError.PARAM_ERROR.getMessage()); //参数错误
  26. }
  27. }

四、枚举类的实质及特点

  • 枚举类实质上是一个继承自Enum类的类(不需要显示声明它继承于Enum)
  • 枚举类的实例化方法是不能加权限修饰符的(它实质上是一个私有的),即它不能在类外部对枚举类进行实例化
  • 枚举类中的枚举对象,如上例中的SERVER_ERROR等相当于在类内部实例化后的对外开放的实例对象

我们编译上面的例子,发现:

  1. enum ResponseError {
  2. SERVER_ERROR(9000, "服务端错误"),
  3. PARAM_ERROR(4001, "参数错误"),
  4. DB_ERROR(5001, "数据库错误"),
  5. CACHE_ERROR(6001, "缓存错误"),
  6. UNKNOWN_ERROR(9999, "未知错误");
  7. private int code;
  8. private String message;
  9. //变成私有实例化方法了
  10. private ResponseError(int var3, String var4) {
  11. this.code = var3;
  12. this.message = var4;
  13. }
  14. public int getCode() {
  15. return this.code;
  16. }
  17. public String getMessage() {
  18. return this.message;
  19. }
  20. }