Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • Java入门基础

  • Java核心基础

    • 多线程

    • Java常用类

    • 枚举类与注解

      • 枚举类
        • 学习目标
        • 场景
        • 特性
        • 自定义枚举类
        • 使用enum关键字定义枚举类
          • 使用说明
        • Enum类的主要方法
        • 实现接口的枚举类
      • 注解
    • Java集合

    • 数据结构与算法

    • 泛型

    • IO流

    • 网络编程

    • 反射

    • 函数式编程

  • 设计模式

  • Web开发

  • SpringBoot

  • 微服务

  • Elasticsearch

  • 运维

  • 后端
  • Java核心基础
  • 枚举类与注解
SaulJWu
2020-12-24

枚举类

# 学习目标

  • 如何自定义枚举类
  • 如何使用关键字enum定义枚举类
  • Enum类的主要方法
  • 实现接口的枚举类

# 场景

  • 类的对象只有有限个,确定的。举例如下:
    • 星期:Monday(星期一)、......、Sunday(星期天)
    • 性别:Man(男)、Woman(女)
    • 季节:Spring(春节)......Winter(冬天)
    • 支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
    • 就职状态:Busy、Free、Vocation、Dimission订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、Return(退货)、Checked(已确认)Fulfilled(已配货)、
    • 线程状态:创建、就绪、运行、阻塞、死亡
  • 当需要定义一组常量时,强烈建议使用枚举类

# 特性

枚举类的实现:

  • JDK1.5之前需要自定义枚举类
  • JDK 1.5 新增的enum 关键字用于定义枚举类

若枚举只有一个对象, 则可以作为一种单例模式的实现方式。

枚举类的属性

  • 枚举类对象的属性不应允许被改动, 所以应该使用private final 修饰
  • 枚举类的使用private final 修饰的属性应该在构造器中为其赋值
  • 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数

# 自定义枚举类

JDK1.5之前需要自定义枚举类

  • 1、私有化类的构造器,保证不能在类的外部创建其对象
  • 2、在类的内部创建枚举类的实例。声明为:public static final
  • 3、对象如果有实例变量,应该声明为private final,并在构造器中初始化

比如:

public class Season {
    private final String SEASONNAME;//季节的名称

    private final String SEASONDESC;//季节的描述

    private Season(String seasonName, String seasonDesc) {
        this.SEASONNAME = seasonName;
        this.SEASONDESC = seasonDesc;
    }

    public static final Season SPRING = new Season("春天", "春暖花开");

    public static final Season SUMMER = new Season("夏天", "夏日炎炎");

    public static final Season AUTUMN = new Season("秋天", "秋高气爽");

    public static final Season WINTER = new Season("冬天", "白雪皑皑");
    
    public String getSeasonNmae() {
        return seasonNmae;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}
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

# 使用enum关键字定义枚举类

# 使用说明

  • 使用enum定义的枚举类默认继承了java.lang.Enum类,因此不能再继承其他类
  • 枚举类的构造器只能使用private 权限修饰符
  • 枚举类的所有实例必须在枚举类中显式列出(, 分隔; 结尾)。
    • 列出的实例系统会自动添加public static final 修饰
  • 必须在枚举类的第一行声明枚举类对象

JDK 1.5 中可以在switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定。

实例

public enum Season {
    SPRING("春天", "春风又绿江南岸"),
    SUMMER("夏天", "映日荷花别样红"),
    AUTUMN("秋天", "秋水共长天一色"),
    WINTER("冬天", "窗含西岭千秋雪");

    private final String seasonNmae;

    private final String seasonDesc;

    private Season(String seasonNmae, String seasonDesc) {
        this.seasonNmae = seasonNmae;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonNmae() {
        return seasonNmae;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# Enum类的主要方法

  • values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
  • valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。
  • toString():返回当前枚举类对象常量的名称。

# 实现接口的枚举类

  • 和普通Java 类一样,枚举类可以实现一个或多个接口。

  • 若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。

  • 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法。

情况一:统一实现方法

比如:

  • 封装API的错误码
public interface IErrorCode {
    long getCode();

    String getMessage();
}
1
2
3
4
5
  • 枚举了一些常用API操作码
public enum ResultCode implements IErrorCode {
    
    SUCCESS(200, "操作成功"),
    FAILED(500, "操作失败"),
    VALIDATE_FAILED(404, "参数检验失败"),
    UNAUTHORIZED(401, "暂未登录或token已经过期"),
    FORBIDDEN(403, "没有相关权限");
    
    private long code;
    private String message;

    private ResultCode(long code, String message) {
        this.code = code;
        this.message = message;
    }

    public long getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

情况二:每个枚举值分别来实现方法

public interface Paint {
    void setColor();

    void setType();
}
1
2
3
4
5
public enum Color implements Paint {
		RED("red color", 0) {
			@Override
			public void setColor() {
				System.out.println("Current paint color: " + RED._name);
			}
 
			@Override
			public void setType() {
				System.out.println("Current paint type: " + "5");
			}
		},
		GREEN("green color", 1) {
			@Override
			public void setColor() {
				System.out.println("Current paint color: " + GREEN._name);
			}
 
			@Override
			public void setType() {
				System.out.println("Current paint type: " + "1");
			}
		},
 
		BLUE("blue color", 2) {
			@Override
			public void setColor() {
				System.out.println("Current paint color: " + BLUE._name);
			}
 
			@Override
			public void setType() {
				System.out.println("Current paint type: " + "12");
			}
		},
    
		YELLOW("yellow color", 3) {
			@Override
			public void setColor() {
				System.out.println("Current paint color: " + YELLOW._name);
			}
 
			@Override
			public void setType() {
				System.out.println("Current paint type: " + "80");
			}
		};
    
    	private String name;
		private int id;
 
		private Color(String name, int id) {
			this.name = name;
			this.id = id;
		}
 
		public String getName() {
			return name;
		}
 
		public int getId() {
			return id;
		}
}
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
帮我改善此页面 (opens new window)
#enum#枚举类
上次更新: 2020/12/24, 04:54:52
Java随机数
注解

← Java随机数 注解→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式