• Java|枚举(Enum)学习总结


    枚举(Enumeration)

      枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。这种传统接口已被迭代器取代,虽然Enumeration 还未被遗弃,但在现代代码中已经被很少使用了。尽管如此,它还是使用在诸如Vector和Properties这些传统类所定义的方法中,除此之外,还用在一些API类,并且在应用程序中也广泛被使用。

      枚举声明了一些方法,例如hasMoreElements()和nextElement(),前一个用来测试此枚举是否包含更多的元素,后一个如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。下面的实例演示了这两个方法的使用:

    package javaSenior;
    
    import java.util.Enumeration;
    import java.util.Vector;
    
    public class EnumerationTester {
    
        public static void main(String[] args) {
            Enumeration<String> days;
            Vector<String> dayNames = new Vector<String>();
            dayNames.add("Sunday");
            dayNames.add("Monday");
            dayNames.add("Tuesday");
            dayNames.add("Wednesday");
            dayNames.add("Thursday");
            dayNames.add("Friday");
            dayNames.add("Saturday");
            days=dayNames.elements();
            while(days.hasMoreElements()) {
                System.out.println(days.nextElement());
            }
        }
    }

    编译之后结果如下:

    Sunday
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday

    语法定义

      创建枚举类型要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类。 枚举类型Class Enum<E extends Enum<E>>,在这里E是枚举类型的名称。 枚举类型的每一个值都将映射到protected Enum(String name,int ordinal)构造函数中。每个值的名称都会转换为一个字符串,并且序数设置表示了此设置被创建的顺序。

    代码示例如下:

    package javaSenior;
    
    /*
     * 创建枚举类型要使用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);
     * ......
     * */

    枚举的遍历与Switch操作

    代码示例如下:

    package javaSenior;
    
    public class Test {
    
        public static void main(String[] args) {
            
            //遍历、Switch操作
            for(EnumTest e:EnumTest.values()) {
                System.out.println(e.toString());
            }
            
            System.out.println("---------分割线----------");
            EnumTest test = EnumTest.MON;
            switch (test) {
            case MON:
                System.out.println("今天是星期一");
                break;
             case TUE:
                    System.out.println("今天是星期二");
                    break;
            default:
                System.out.println(test);
                break;
            }
            
        }
    }

    编译运行的结果为:

    MON
    TUE
    WED
    THU
    FRI
    SAT
    SUN
    ---------分割线----------
    今天是星期一

    枚举(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)

    返回带指定名称的指定枚举类型的枚举常量

    上述方法的使用代码示例如下:

    package javaSenior;
    
    public class Test {
    
        public static void main(String[] args) {
            EnumTest test=EnumTest.TUE;
            
            //compareTo(E o)
            switch (test.compareTo(EnumTest.WED)) {
            case -1:
                System.out.println("TUE在WED之前");
                break;
            case 1:
                System.out.println("TUE在WED之后");
                break;
            default:
                System.out.println("TUE与WED在同一位置");
                break;
            }
            
            //getDeclaringClass()
            System.out.println("getDeclaringClass():"+test.getDeclaringClass().getName());
            
             //name() 和  toString()
            System.out.println("name(): " + test.name());
            System.out.println("toString(): " + test.toString());
             
            //ordinal(), 返回值是从 0 开始
            System.out.println("ordinal(): " + test.ordinal());
            }    
    }

    编译运行的结果为:

    TUE在WED之前
    getDeclaringClass():javaSenior.EnumTest
    name(): TUE
    toString(): TUE
    ordinal(): 1

     给枚举自定义属性和方法

      如果需要自定义自己的方法,就需要在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。下面是给枚举对象加value的属性和getValue()的方法的示例:

    public enum EnumTest {
        
        MON(1),TUE(2),WED(3),THU(4),FRI(5),SAT(6){
            @Override
            public boolean isRest() {
                return true;
            }
        },
            SUN(0){
                @Override
                public boolean isRest() {
                    return true;
                }
            };
        private int value;
        
        private EnumTest(int value) {
            this.value=value;
        }
        
        public int getValue() {
            return value;
        }
        
        public boolean isRest() {
            return false;
        }
                
    }
    public class Test{
        public static void main(String[] args){
            System.out.println("EnumTest.FRI的value="+EnumTest.FRI.getValue());
        }
    }

    代码执行的结果为:

    EnumTest.FRI的value=5

    又如以下示例:

        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;  
            }  
        }  

    覆盖枚举的方法

    下面给出覆盖枚举方法的示例,以toString()为例:

            //覆盖方法  
            @Override  
            public String toString() {  
            /*
            *代码块
            */
          return this.index+"_"+this.name; }

    实现接口

      所有的枚举都继承自java.lang.Enum类。由于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); } }

    枚举集合EnumSet和EnumMap的使用

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

    package javaSenior;
    
    import java.util.EnumMap;
    import java.util.EnumSet;
    import java.util.Iterator;
    import java.util.Map.Entry;
    
    
    public class Test {
    
        public static void main(String[] args) {//EnumSet和EnumMap的应用
            //EnumSet
            EnumSet<EnumTest> weekSet=EnumSet.allOf(EnumTest.class);
            for(EnumTest day:weekSet) {
                System.out.print(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());
            }
    }

    编译执行后结果为:

    MON    TUE    WED    THU    FRI    SAT    SUN    MON:星期一

    总结

      Enum的语法结构尽管和class的不一样,但是经过编译器编译之后产生的是一个class文件。如果把这个class文件反编译,可以看到实际上生成了一个类,这个类继承了java.lang.Enum<E>。所以实际上Enum就是一个class,只不过java编译器给我们做了语法的解析和编译。这样,就可以把Enum看成是一个普通的class,他们都可以定义一些属性和方法。不同的是,Enum不能使用extends关键字来继承其他类,因为Enum已经继承了java.lang.Enum(Java是单一继承的)。

    参考链接

    学习时参考文章如下:

    http://www.runoob.com/java/java-enumeration-interface.html

    https://blog.csdn.net/testcs_dn/article/details/78604547

    http://www.cnblogs.com/hemingwang0902/archive/2011/12/29/2306263.html#title-1

  • 相关阅读:
    形象理解ERP(转)
    禁用windows server 2008 域密码复杂性要求策略
    How to adding find,filter,remove filter on display method Form
    Windows Server 2008 R2激活工具
    How to using bat command running VS development SSRS report
    Creating Your First Mac AppGetting Started
    Creating Your First Mac AppAdding a Track Object 添加一个 Track 对象
    Creating Your First Mac AppImplementing Action Methods 实现动作方法
    Creating Your First Mac AppReviewing the Code 审查代码
    Creating Your First Mac AppConfiguring the window 设置窗口
  • 原文地址:https://www.cnblogs.com/jlutiger/p/10304690.html
Copyright © 2020-2023  润新知