zoukankan      html  css  js  c++  java
  • java-基础-【一】枚举

       enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

    一、static final定义[jdk1.5之前]

    public static fianl

    二、接口常量

    public interface IConstants {
        String MON = "Mon";
        String TUE = "Tue";
        String WED = "Wed";
        String THU = "Thu";
        String FRI = "Fri";
        String SAT = "Sat";
        String SUN = "Sun";
    }

    三、枚举语法(定义)

      创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。

      枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

    示例

    public enum EnumTest {
        MON, TUE, WED, THU, FRI, SAT, SUN;
    }

    这段代码实际上调用了7次 Enum(String name, int ordinal):

    new Enum<EnumTest>("MON",0);
    new Enum<EnumTest>("TUE",1);
    new Enum<EnumTest>("WED",2);
        ... ...

    四、遍历,switch等方法使用

    遍历、switch 等常用操作

    for (EnumTest e : EnumTest.values()) {
      System.out.println(e.toString());
    }

    enum 对象的常用方法介绍

    int compareTo(E o) 
              比较此枚举与指定对象的顺序。
    
    Class<E> getDeclaringClass() 
              返回与此枚举常量的枚举类型相对应的 Class 对象。
    
    String name() 
              返回此枚举常量的名称,在其枚举声明中对其进行声明。
    
    int ordinal() 
              返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
    
    String toString()
    
               返回枚举常量的名称,它包含在声明中。
    
    static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
              返回带指定名称的指定枚举类型的枚举常量。

    五、自定义枚举

    自定义自己的方法,必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

    public enum Color {  
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
        // 成员变量  
        private String name;  
        private int index;  
        // 构造方法  
        private Color(String name, int index) {  
            this.name = name;  
            this.index = index;  
        }  
        // 普通方法  
        public static String getName(int index) {  
            for (Color c : Color.values()) {  
                if (c.getIndex() == index) {  
                    return c.name;  
                }  
            }  
            return null;  
        }  
        // get set 方法  
        public String getName() {  
            return name;  
        }  
        public void setName(String name) {  
            this.name = name;  
        }  
        public int getIndex() {  
            return index;  
        }  
        public void setIndex(int index) {  
            this.index = index;  
        }  
    }  
    View Code

    六、EnumSet,EnumMap 的应用

    java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型

            // EnumSet的使用
            EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
            for (EnumTest day : weekSet) {
                System.out.println(day);
            }
     
            // EnumMap的使用
            EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
            weekMap.put(EnumTest.MON, "星期一");
            weekMap.put(EnumTest.TUE, "星期二");
            // ... ...
            for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
                Entry<EnumTest, String> entry = iter.next();
                System.out.println(entry.getKey().name() + ":" + entry.getValue());
            }

    七、原理分析

     enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:

    public class com.hmw.test.EnumTest extends java.lang.Enum{
        public static final com.hmw.test.EnumTest MON;
        public static final com.hmw.test.EnumTest TUE;
        public static final com.hmw.test.EnumTest WED;
        public static final com.hmw.test.EnumTest THU;
        public static final com.hmw.test.EnumTest FRI;
        public static final com.hmw.test.EnumTest SAT;
        public static final com.hmw.test.EnumTest SUN;
        static {};
        public int getValue();
        public boolean isRest();
        public static com.hmw.test.EnumTest[] values();
        public static com.hmw.test.EnumTest valueOf(java.lang.String);
        com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
    }

    所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。

    八、实现接口

    public interface Behaviour {  
        void print();  
        String getInfo();  
    }  
    public enum Color implements Behaviour{  
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
        // 成员变量  
        private String name;  
        private int index;  
        // 构造方法  
        private Color(String name, int index) {  
            this.name = name;  
            this.index = index;  
        }  
    //接口方法  
        @Override  
        public String getInfo() {  
            return this.name;  
        }  
        //接口方法  
        @Override  
        public void print() {  
            System.out.println(this.index+":"+this.name);  
        }  
    }  
    View Code

    九、使用接口组织枚举

    public interface Food {  
        enum Coffee implements Food{  
            BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
        }  
        enum Dessert implements Food{  
            FRUIT, CAKE, GELATO  
        }  
    } 
  • 相关阅读:
    oracle(八)块清除
    oracle(七)索引
    oracle(六) physical read and logical read
    oracle动态视图(一)stat
    oracle(五)tkprof 使用 transient kernal profile 侧面 轮廓
    dbms_stats.gather_table_stats详解
    oracle(四) 常用语句
    oracle(三) SQL语句
    [Swift]LeetCode269. 外星人词典 $ Alien Dictionary
    [Mac]如何让两个窗口各占半个屏幕
  • 原文地址:https://www.cnblogs.com/bjlhx/p/6673001.html
Copyright © 2011-2022 走看看