zoukankan      html  css  js  c++  java
  • java 枚举类型知识点记录

      在日常开发中,我们常用接口装常量或者在类里面写静态常量,java1.5以后加入了枚举类型enum。枚举类型是由一组固定的常量组成的类型。枚举本质是int值。因为枚举类型没有可以访问的构造器,所以枚举类型是真正的final。枚举的思想是:通过共有静态的final域为每个枚举常量导出实例类。enum实现了Serializable和Comparable接口。

      最简单的enum类如下:

      

    1 public enum MyEnum {
    2 
    3     GREEN,BLUE,BLACK;
    4 }

      常量用逗号分隔,用分号结束。

      enum有共有的方法name()和ordinal(),分别输出该常量的字符串名和枚举的序数。这个序数从0开始,是常量的位置,依次递增,所以这个值会跟随常量的位置而不同。所以这个方法不实用。一般需要定义自己的实例域。对以上代码改进如下:

      

    1 public enum MyEnum {
    2 
    3     GREEN(1),BLUE(2),BLACK(3);
    4     private MyEnum(int value){
    5         
    6     }
    7 }
    8     

      注意,enum只能定义default或者private的构造器。这就说明enum不允许手动实例化。每次调用枚举中的常量时候,实际内部调用了构造器,这就是 上面所说的通过常量生成实例

      枚举有values方法,可以返回当前枚举类的所有常量。方法如下:

      

     1 public enum MyEnum {
     2 
     3     GREEN(1),BLUE(2),BLACK(3);
     4     private MyEnum(int value){
     5         
     6     }
     7     
     8     public static void main(String[] args) {
     9         for (MyEnum myenum : MyEnum.values()) {
    10             System.out.println(myenum.name());//GREEN BLUE BLACK
    11         }
    12     }
    13 }

      那么,我们可以为自定义的枚举做一些功能,例如根据name查找我们自定义的参数。例如:

     1 public enum MyEnum {
     2 
     3     GREEN(1),BLUE(2),BLACK(3);
     4     private int value;
     5     private MyEnum(int value){
     6         this.value = value;
     7     }
     8     
     9     public static int getValue(String name){
    10         for (MyEnum myenum : MyEnum.values()) {
    11             if(myenum.name() == name){
    12                 return myenum.value;
    13             }
    14         }
    15         return 0;
    16     }
    17     
    18     public static void main(String[] args) {
    19         System.out.println(MyEnum.getValue(MyEnum.BLACK.name())+""); // 3
    20     }
    21 }

      还可以使用EnumSet放置枚举类型,生成枚举集合,EnumSet在java.util包中。并且实现了Collection和Serializable接口,继承了AbstractSet类,所以也实现了Set接口。示例如下:

      

    1 public static void printColor(Set<MyEnum> colors){
    2         for (MyEnum myEnum : colors) {
    3             System.out.println(myEnum.name());
    4         }
    5     }
    6     
    7     public static void main(String[] args) {
    8         MyEnum.printColor(EnumSet.of(MyEnum.BLACK,MyEnum.BLUE)); //BLUE BLACK
    9 }

      枚举类型也提供了EnumMap类,它允许使用枚举作为它的键值,这样我们就能直接利用枚举存放map类型数据,而不用需要转换枚举类型到我们需要的数据了。EnumMap代码声明如下:

      public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Cloneable

      从中看出key为枚举类型的。其中key值使用了泛型限制,使用extends Enum,保证了编译安全。

  • 相关阅读:
    ConcurrentHashMap的使用和原理
    记录下项目中常用到的JavaScript/JQuery代码一(大量实例)
    layer ui插件显示tips时,修改字体颜色
    flash上传文件,如何解决跨域问题
    ubuntu下的mv命令
    Semantic 3D
    shellnet运行train_val_seg.py
    Tensorflow的不足之处
    用pip命令把python包安装到指定目录
    ubuntu建立文件或者文件夹软链接
  • 原文地址:https://www.cnblogs.com/bigbang92/p/java-enum.html
Copyright © 2011-2022 走看看