• Java学习笔记——枚举


    目录

    一、枚举的相关概念

    二、Enum

    (一)相关方法

    (二)特性

    三、EnumSet

    相关方法

    四、EnumMap

    五、枚举的常见用法

    (一)常量

    (二)switch

    (三)向枚举中添加新方法

    (四)覆盖枚举的方法

    (五)实现接口

    (六)使用接口组织枚举

    六、代码


    Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。

    Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

    本章节将对枚举进行详细阐述。

    一、枚举的相关概念

    1、定义:枚举是一个特殊的类,一般表示一组常量,例如一年四季,一年的十二个月以及一周七天等。Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

    2、示例:

    (1)定义一个颜色的枚举类

    1. // 定义一个颜色的枚举类
    2. enum Color{
    3. Red, Green, Blue;
    4. }

    (2)引用

    1. public static void main(String[] args){
    2. Color c = Color.Red;
    3. }

    3、优点:将常量组织起来,统一进行管理

    4、场景:错误码、状态机等

    5、本质:java.lang.Enum的子类

    二、Enum

    (一)相关方法

    enum定义的枚举类默认继承了java.lang.Enum类,并实现了java.lang.Serializable和java.lang.Comparable接口。

    其种,以下方法位于java.lang.Enum类中,简单介绍以下方法的使用。

    • values():返回枚举类中所有的值
    • valueOf():返回指定字符串值的枚举常量
    • name():返回实例名
    • ordinal():查找枚举常量的索引
    • equals():判断是否是同一对象,也可使用==比较
    • getDeclaringClass():返回实例所属的enum类型

    代码实例

    1. public class Day23 {
    2. // 定义一个颜色的枚举类
    3. enum Color{
    4. Red, Green, Blue;
    5. }
    6. // 定义一个一年四季的枚举类
    7. enum Season{
    8. Spring, Summer, Autumn, Winter;
    9. }
    10. public static void main(String[] args){
    11. Color r = Color.Red;
    12. Color g = Color.Green;
    13. Color b = Color.Blue;
    14. Season sp = Season.Spring;
    15. Season su = Season.Summer;
    16. Season au = Season.Autumn;
    17. Season wi = Season.Winter;
    18. /* 方法 */
    19. // values(): 返回枚举类中所有的值
    20. System.out.println("------values()------");
    21. for (Color color: Color.values()) {
    22. System.out.println(color);
    23. }
    24. // valueOf(): 返回指定字符串值的枚举常量
    25. System.out.println("------valueOf()------");
    26. System.out.println(Color.valueOf("Red"));
    27. System.out.println(Color.valueOf("Green"));
    28. System.out.println(Color.valueOf("Blue"));
    29. // name(): 返回实例名
    30. System.out.println("------name()------");
    31. System.out.println(r.name());
    32. System.out.println(g.name());
    33. System.out.println(b.name());
    34. // ordinal(): 查找枚举常量的索引
    35. System.out.println("------ordinal()------");
    36. System.out.println(r.ordinal());
    37. System.out.println(g.ordinal());
    38. System.out.println(b.ordinal());
    39. // equals(): 判断是否是同一对象,也可使用==比较
    40. System.out.println("------equals()------");
    41. System.out.println(r.equals(g)); // false
    42. System.out.println(r.equals(r)); // true
    43. System.out.println(r.equals(sp)); // false
    44. // getDeclaringClass(): 返回实例所属的enum类型
    45. System.out.println("------getDeclaringClass()------");
    46. System.out.println(r.getDeclaringClass());
    47. System.out.println(sp.getDeclaringClass());
    48. }
    49. }

    结果 

    1. ------values()------
    2. Red
    3. Green
    4. Blue
    5. ------valueOf()------
    6. Red
    7. Green
    8. Blue
    9. ------name()------
    10. Red
    11. Green
    12. Blue
    13. ------ordinal()------
    14. 0
    15. 1
    16. 2
    17. ------equals()------
    18. false
    19. true
    20. false
    21. ------getDeclaringClass()------
    22. class Java_learning.Day23$Color
    23. class Java_learning.Day23$Season

    (二)特性

    1. 枚举不能继承,但可以看做一个常规的类;
    2. 不允许使用“=”为枚举常量赋值,可使用方法显示赋值;
    3. enum可以添加普通方法、静态方法、抽象方法、构造方法;
    4. enum可以实现接口,但无法继承,因为enum继承java.lang.Enum类,Java不允许多继承,所以 enum无法继承其他类。

    三、EnumSet

    EnumSet是枚举类型的高性能Set实现,它要求放入它的枚举常量必须属于同一枚举类型。

    相关方法

    • noneOf():创建空集合
    • allOf():创建包含所有元素的结合
    • of():创建包含指定元素的集合
    • range():创建范围集合
    • complementOf():补集
    • copyOf():复制集合

    代码实例

    1. // 创建空集合_EnumSet.noneOf(Month.class)
    2. EnumSet enumSet1 = EnumSet.noneOf(Month.class);
    3. // 创建包含所有元素的集合_EnumSet.allOf(Month.class)
    4. EnumSet enumSet2 = EnumSet.allOf(Month.class);
    5. // 创建包含指定元素的集合_EnumSet.of(Month.JANUARY, Month.DECEMBER)
    6. EnumSet enumSet3 = EnumSet.of(Month.JANUARY, Month.DECEMBER);
    7. // 创建范围集合_EnumSet.range(Month.JANUARY, Month.OCTOBER)
    8. // 第一个枚举值的索引位置必须大于第二个枚举值,不然会导致异常。
    9. EnumSet enumSet4 = EnumSet.range(Month.JANUARY, Month.OCTOBER);
    10. // 补集_EnumSet.complementOf(enumSet4)
    11. EnumSet enumSet5 = EnumSet.complementOf(enumSet4);
    12. // 复制集合
    13. EnumSet enumSet6 = EnumSet.copyOf(enumSet5);
    14. System.out.println("noneOf: " + enumSet1);
    15. System.out.println("allOf: " + enumSet2);
    16. System.out.println("of: " + enumSet3);
    17. System.out.println("range: " + enumSet4);
    18. System.out.println("complementOf: " + enumSet5);
    19. System.out.println("copyOf: " + enumSet6);

    结果

    1. noneOf: []
    2. allOf: [JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER]
    3. of: [JANUARY, DECEMBER]
    4. range: [JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER]
    5. complementOf: [NOVEMBER, DECEMBER]
    6. copyOf: [NOVEMBER, DECEMBER]

    四、EnumMap

    EnumMap是专门为枚举类型定制的Map,EnumMap 在使用上跟HashMap差不多,但是EnumMap 的性能更好,所以,如果键为Enum 类型时,建议使用 EnumMap 代替 HashMap。

    代码实例

    1. EnumMap dayMap = new EnumMap<>(DayOfWeek.class);
    2. for (DayOfWeek value: DayOfWeek.values()){
    3. dayMap.put(value, value.ordinal());
    4. }
    5. dayMap.forEach((k, v) -> System.out.println(k + " -> " + v));

    结果

    1. MONDAY -> 0
    2. TUESDAY -> 1
    3. WEDNESDAY -> 2
    4. THURSDAY -> 3
    5. FRIDAY -> 4
    6. SATURDAY -> 5
    7. SUNDAY -> 6

    五、枚举的常见用法

    (一)常量

    创建四个方向的枚举常量:

    1. enum Direction{
    2. up, down, left, right;
    3. }

    (二)switch

    在 switch 中使用枚举类

    1. // 常量
    2. enum Direction{
    3. up, down, left, right;
    4. }
    5. // switch
    6. static class Reverse{
    7. Direction d = Direction.right;
    8. public void change(){
    9. switch (d){
    10. case up:
    11. d = Direction.down;
    12. break;
    13. case down:
    14. d = Direction.up;
    15. break;
    16. case left:
    17. d = Direction.right;
    18. break;
    19. case right:
    20. d = Direction.left;
    21. break;
    22. }
    23. }
    24. }

    (三)向枚举中添加新方法

    1. enum Signal{
    2. RED("红色", 1), GREEN("绿色", 2), YELLOW("黄色", 3);
    3. // 成员变量
    4. private String name;
    5. private int index;
    6. // 构造方法
    7. Signal(String name, int index) {
    8. this.name = name;
    9. this.index = index;
    10. }
    11. // 普通方法
    12. public String getName(int index){
    13. for (Signal s: Signal.values()){
    14. if (s.getIndex() == index){
    15. return s.name;
    16. }
    17. }
    18. return null;
    19. }
    20. // get set 方法
    21. public String getName() {
    22. return name;
    23. }
    24. public void setName(String name) {
    25. this.name = name;
    26. }
    27. public int getIndex() {
    28. return index;
    29. }
    30. public void setIndex(int index) {
    31. this.index = index;
    32. }
    33. }

    (四)覆盖枚举的方法

    1. enum Family{
    2. Father("父亲", 1), Mother("母亲", 1), Brother("兄弟", 1), Sister("姐妹", 1);
    3. private String name;
    4. private int index;
    5. Family(String name, int index) {
    6. this.name = name;
    7. this.index = index;
    8. }
    9. // 覆盖方法
    10. public String toString(){
    11. return this.index+"_"+this.name;
    12. }
    13. }

    (五)实现接口

    1. interface Move{
    2. void move_up();
    3. void move_down();
    4. void move_left();
    5. void move_right();
    6. }
    7. enum interfaceMove implements Move{
    8. up("上", 1), down("下", 2), left("左", 3), right("右", 4);
    9. private String dir;
    10. private int index;
    11. interfaceMove(String dir, int index) {
    12. this.dir = dir;
    13. this.index = index;
    14. }
    15. @Override
    16. public void move_up() {
    17. }
    18. @Override
    19. public void move_down() {
    20. }
    21. @Override
    22. public void move_left() {
    23. }
    24. @Override
    25. public void move_right() {
    26. }
    27. }

    (六)使用接口组织枚举

    1. interface Animal{
    2. enum Dog implements Animal{
    3. dog1, dog2, dog3;
    4. }
    5. enum Cat implements Animal{
    6. cat1, cat2, cat3;
    7. }
    8. }

    六、代码

    1. import org.threeten.bp.DayOfWeek;
    2. import org.threeten.bp.Month;
    3. import java.util.EnumMap;
    4. import java.util.EnumSet;
    5. public class Day23 {
    6. // 定义一个颜色的枚举类
    7. enum Color{
    8. Red, Green, Blue;
    9. }
    10. // 定义一个一年四季的枚举类
    11. enum Season{
    12. Spring, Summer, Autumn, Winter;
    13. }
    14. /* 常见用法 */
    15. // 常量
    16. enum Direction{
    17. up, down, left, right;
    18. }
    19. // switch
    20. static class Reverse{
    21. Direction d = Direction.right;
    22. public void change(){
    23. switch (d){
    24. case up:
    25. d = Direction.down;
    26. break;
    27. case down:
    28. d = Direction.up;
    29. break;
    30. case left:
    31. d = Direction.right;
    32. break;
    33. case right:
    34. d = Direction.left;
    35. break;
    36. }
    37. }
    38. }
    39. // 向枚举中添加新方法
    40. enum Signal{
    41. RED("红色", 1), GREEN("绿色", 2), YELLOW("黄色", 3);
    42. // 成员变量
    43. private String name;
    44. private int index;
    45. // 构造方法
    46. Signal(String name, int index) {
    47. this.name = name;
    48. this.index = index;
    49. }
    50. // 普通方法
    51. public String getName(int index){
    52. for (Signal s: Signal.values()){
    53. if (s.getIndex() == index){
    54. return s.name;
    55. }
    56. }
    57. return null;
    58. }
    59. // get set 方法
    60. public String getName() {
    61. return name;
    62. }
    63. public void setName(String name) {
    64. this.name = name;
    65. }
    66. public int getIndex() {
    67. return index;
    68. }
    69. public void setIndex(int index) {
    70. this.index = index;
    71. }
    72. }
    73. // 覆盖枚举的方法
    74. enum Family{
    75. Father("父亲", 1), Mother("母亲", 1), Brother("兄弟", 1), Sister("姐妹", 1);
    76. private String name;
    77. private int index;
    78. Family(String name, int index) {
    79. this.name = name;
    80. this.index = index;
    81. }
    82. // 覆盖方法
    83. public String toString(){
    84. return this.index+"_"+this.name;
    85. }
    86. }
    87. // 实现接口
    88. interface Move{
    89. void move_up();
    90. void move_down();
    91. void move_left();
    92. void move_right();
    93. }
    94. enum interfaceMove implements Move{
    95. up("上", 1), down("下", 2), left("左", 3), right("右", 4);
    96. private String dir;
    97. private int index;
    98. interfaceMove(String dir, int index) {
    99. this.dir = dir;
    100. this.index = index;
    101. }
    102. @Override
    103. public void move_up() {
    104. }
    105. @Override
    106. public void move_down() {
    107. }
    108. @Override
    109. public void move_left() {
    110. }
    111. @Override
    112. public void move_right() {
    113. }
    114. }
    115. // 使用接口组织枚举
    116. interface Animal{
    117. enum Dog implements Animal{
    118. dog1, dog2, dog3;
    119. }
    120. enum Cat implements Animal{
    121. cat1, cat2, cat3;
    122. }
    123. }
    124. public static void main(String[] args){
    125. Color r = Color.Red;
    126. Color g = Color.Green;
    127. Color b = Color.Blue;
    128. Season sp = Season.Spring;
    129. Season su = Season.Summer;
    130. Season au = Season.Autumn;
    131. Season wi = Season.Winter;
    132. /* 方法 */
    133. // values(): 返回枚举类中所有的值
    134. System.out.println("------values()------");
    135. for (Color color: Color.values()) {
    136. System.out.println(color);
    137. }
    138. // valueOf(): 返回指定字符串值的枚举常量
    139. System.out.println("------valueOf()------");
    140. System.out.println(Color.valueOf("Red"));
    141. System.out.println(Color.valueOf("Green"));
    142. System.out.println(Color.valueOf("Blue"));
    143. // name(): 返回实例名
    144. System.out.println("------name()------");
    145. System.out.println(r.name());
    146. System.out.println(g.name());
    147. System.out.println(b.name());
    148. // ordinal(): 查找枚举常量的索引
    149. System.out.println("------ordinal()------");
    150. System.out.println(r.ordinal());
    151. System.out.println(g.ordinal());
    152. System.out.println(b.ordinal());
    153. // equals(): 判断是否是同一对象,也可使用==比较
    154. System.out.println("------equals()------");
    155. System.out.println(r.equals(g)); // false
    156. System.out.println(r.equals(r)); // true
    157. System.out.println(r.equals(sp)); // false
    158. // getDeclaringClass(): 返回实例所属的enum类型
    159. System.out.println("------getDeclaringClass()------");
    160. System.out.println(r.getDeclaringClass());
    161. System.out.println(sp.getDeclaringClass());
    162. /* 工具类——EnumSet */
    163. // 创建空集合_EnumSet.noneOf(Month.class)
    164. EnumSet enumSet1 = EnumSet.noneOf(Month.class);
    165. // 创建包含所有元素的集合_EnumSet.allOf(Month.class)
    166. EnumSet enumSet2 = EnumSet.allOf(Month.class);
    167. // 创建包含指定元素的集合_EnumSet.of(Month.JANUARY, Month.DECEMBER)
    168. EnumSet enumSet3 = EnumSet.of(Month.JANUARY, Month.DECEMBER);
    169. // 创建范围集合_EnumSet.range(Month.JANUARY, Month.OCTOBER)
    170. // 第一个枚举值的索引位置必须大于第二个枚举值,不然会导致异常。
    171. EnumSet enumSet4 = EnumSet.range(Month.JANUARY, Month.OCTOBER);
    172. // 补集_EnumSet.complementOf(enumSet4)
    173. EnumSet enumSet5 = EnumSet.complementOf(enumSet4);
    174. // 复制集合
    175. EnumSet enumSet6 = EnumSet.copyOf(enumSet5);
    176. System.out.println("noneOf: " + enumSet1);
    177. System.out.println("allOf: " + enumSet2);
    178. System.out.println("of: " + enumSet3);
    179. System.out.println("range: " + enumSet4);
    180. System.out.println("complementOf: " + enumSet5);
    181. System.out.println("copyOf: " + enumSet6);
    182. /* 工具类——EnumMap */
    183. System.out.println("------EnumMap------" + enumSet6);
    184. EnumMap dayMap = new EnumMap<>(DayOfWeek.class);
    185. for (DayOfWeek value: DayOfWeek.values()){
    186. dayMap.put(value, value.ordinal());
    187. }
    188. dayMap.forEach((k, v) -> System.out.println(k + " -> " + v));
    189. }
    190. }
  • 相关阅读:
    【数据结构初阶-二叉树】非线性数据结构来了
    数据库与缓存更新一致性四种策略
    在uniapp中,如何去掉一些不想要的权限,
    YOLOv7改进:全网原创首发 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测 | NeurIPS2022
    交换机/防火墙-基础配置-23.10.11
    求第n项的因子数量
    【电商项目实战】用户注册(详细篇)
    基于householder变换的QR分解
    基于支持向量机的试剂条图像识别,基于SVM的图像识别,SVM的详细原理,Libsvm工具箱使用注意事项
    c语言的三种基本结构——初学者一定要了解哦
  • 原文地址:https://blog.csdn.net/weixin_45666660/article/details/125975246