zoukankan      html  css  js  c++  java
  • 枚举

    1、枚举概念

    在Java中枚举使用enum关键字表示,它是一种非常有用的特性,可以理解为具体特定性质的类。Enum不仅Java有,C和C++也有这个概念。例如:

     1 public enum Family {
     2 
     3     FATHER,
     4 
     5     MOTHER,
     6 
     7     SON,
     8 
     9     DAUGHTER;
    10 
    11 }

    这是一个Family枚举类,总共有4个值,因为枚举类型都是常量,所以用大写字母表示

     1 //使用枚举
     2 
     3 class UseEnum {
     4 
     5     public static void main(String[] args) {
     6 
     7         Family f = Family.FATHER;
     8 
     9         System.out.println(f);
    10 
    11     }
    12 
    13 }

    运行结果:

     

    2、枚举特性

    (1)当创建完enum枚举类后,编译器会自动为enum添加toString()方法,能够方便显示enum实例的具体名字。除了toString()方法,编译器还会添加ordinal()方法,这个方法用来表示enum常量的声明顺序,以及values()方法显示顺序的值。

     1 public enum Family {
     2 
     3     FATHER,
     4 
     5     MOTHER,
     6 
     7     SON,
     8 
     9     DAUGHTER;
    10 
    11 }
    12 
    13 class EnumUse {
    14 
    15     public static void main(String[] args) {
    16 
    17         for (Family family : Family.values()) {
    18 
    19             System.out.println(family + ",ordinal_" + family.ordinal());
    20 
    21         }
    22 
    23  
    24 
    25     }
    26 
    27 }

    运行结果:

     (2)枚举可以静态导入包,导入静态包的时候可以不用输入枚举类名.变量,可以直接用常量。使用enum和static关键字就能做到静态导入包。

    枚举和普通类一样,除了枚举中能够方便快捷的定义常量,日常开发用的public static final XXX都可以用枚举类定义,枚举中也能定义属性和方法。

     1 package day07;
     2 
     3  
     4 
     5 public enum OrdinalEnum {
     6 
     7     WEST("west"),
     8 
     9     EAST("east"),
    10 
    11     SOUTH("south"),
    12 
    13     MORTH("north");
    14 
    15     String description;
    16 
    17  
    18 
    19     OrdinalEnum(String description) {
    20 
    21         this.description = description;
    22 
    23     }
    24 
    25  
    26 
    27     public String getDescription() {
    28 
    29         return description;
    30 
    31     }
    32 
    33  
    34 
    35     public void SetDescripiton(String description) {
    36 
    37         this.description = description;
    38 
    39     }
    40 
    41  
    42 
    43     public static void main(String[] args) {
    44 
    45         for (OrdinalEnum ordinalEnum : OrdinalEnum.values()) {
    46 
    47             System.out.println(ordinalEnum.getDescription());
    48 
    49         }
    50 
    51     }
    52 
    53 }

    运行结果:

    (3)Switch可以和enum一起使用,例如构造一个小型状态机:

     1 package day07;
     2 
     3  
     4 
     5 enum Signal {
     6 
     7     GREEN, YELLOW, RED
     8 
     9 }
    10 
    11  
    12 
    13 public class TrafficLight {
    14 
    15     Signal color = Signal.RED;
    16 
    17  
    18 
    19     public void change() {
    20 
    21         switch (color) {
    22 
    23             case RED:
    24 
    25                 color = Signal.GREEN;
    26 
    27                 break;
    28 
    29             case GREEN:
    30 
    31                 color = Signal.RED;
    32 
    33                 break;
    34 
    35             case YELLOW:
    36 
    37                 color = Signal.YELLOW;
    38 
    39                 break;
    40 
    41         }
    42 
    43     }
    44 
    45 }

    (4)Enum隐式的继承与Enum类,Enum类位于java.lang包下,可以自动引用。Class类中有三个关于Enum的方法:getEnumConstants():T[],getEnumConstantsShared():T[],isEnum():boolea。前两个用于获取enum常量,isEnum用于判断是否是枚举类型。

    3、EnumSet和EnumMap

    • EnumSet是JDK1.5引入的,EnumSet的设计充分考虑了速度因素,使用EnumSet可以作为Enum的替代者,因为它的效率比较高。
    • EnumMap是一种特殊的Map,它要求其中的key键值是来自一个enum。因为EumMap速度也非常快,所以可以使用EumMap的key进行快速查找。

    枚举是Java中很小的功能,但是这个技巧有时候能够让代码变得优雅和简洁。

    欢迎批评指正,提出问题,谢谢!
  • 相关阅读:
    python 各层级目录下的import方法
    Ubuntu更新python3.5到python3.7
    程序员的江湖--个人品牌
    产品经理看哪吒之魔童降世
    Python 相对路径和绝对路径--python实战(九)
    vim 下修改tab键为四个空格
    一个python问题引发的思考
    【python】多进程共享变量
    【python】spark+kafka使用
    【python】kafka在与celery和gevent连用时遇到的问题
  • 原文地址:https://www.cnblogs.com/xxeleanor/p/14399974.html
Copyright © 2011-2022 走看看