【Java学习笔记】枚举类型

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ java.lang.Enum > 使用enum定义。 类如: public class EnumDemo {     enum Edge {         TOP, BOTTOM, LEFT, RIGHT//定义了一个enum类型的实例,一个枚举类型除了那些由枚举常量定义的实例外没有任何其他实例。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

java.lang.Enum > 使用enum定义。

类如:

public class EnumDemo {
    enum Edge {
        TOP, BOTTOM, LEFT, RIGHT//定义了一个enum类型的实例,一个枚举类型除了那些由枚举常量定义的实例外没有任何其他实例。
    };
    public static void main(String arg[]) {
        Edge edge1 = Edge.LEFT;
        Edge edge2 = Edge.LEFT;
      //由于每个枚举类型的实例在一个程序中只能有一个,所以我们可以使用==来判断是否相同。
        System.out.println("Can we use == to judge equals:"+ (edge1 == edge2));
        int i = edge1.ordinal();
        System.out.println("The value of i: " + i);
        System.out.println(edge1);
        String str = "";
        switch(edge1) {
    /*  case Edge.TOP: This is wrong*/
        case TOP: str = "The top edge"; break;
        case BOTTOM: str = "The bottom edge"; break;
        case LEFT: str = "The left edge"; break;
        case RIGHT: str = "The right edge"; break;
        }
        System.out.println(str);
    }
这就解决了switch不能对字符串进行的缺点了。注意:枚举类型也是类,里面的成员实际上是静态的final类型的枚举类型实例。

为了更好的理解枚举类型,我们用普通类模拟一下该枚举类

public abstract class WeekDay {
    private int workhours;
    private boolean work;
    private WeekDay(int workhours, boolean work) {
        this.workhours = workhours;
        this.work = work;
    }
    protected abstract WeekDay getNextDay();
    public static final WeekDay MONDAY = new WeekDay(8,true){
         public WeekDay getNextDay() {
                return TUESDAY;
            }
         @Override
        public String toString() {
            return "MONDAY";
        }
    };
    public static final WeekDay TUESDAY = new WeekDay(8,true){
         public WeekDay getNextDay() {
                return WEDNESDAY;
            }
         @Override
            public String toString() {
                return "TUESDAY";
            }
    };
    public static final WeekDay WEDNESDAY = new WeekDay(8,true){
         public WeekDay getNextDay() {
                return THURSDAY;
            }
         @Override
            public String toString() {
                return "WEDNESDAY";
            }
    };
    public static final WeekDay THURSDAY = new WeekDay(8,true){
         public WeekDay getNextDay() {
                return FRIDAY;
            }
         @Override
            public String toString() {
                return "THURSDAY";
            }
    };
    public static final WeekDay FRIDAY = new WeekDay(8,true){
         public WeekDay getNextDay() {
                return SATURDAY;
            }
         @Override
            public String toString() {
                return "FRIDAY";
            }
    };
    public static final WeekDay SATURDAY = new WeekDay(4,true){
         public WeekDay getNextDay() {
                return SUNDAY;
            }
         @Override
            public String toString() {
                return "SATURDAY";
            }
    };
    public static final WeekDay SUNDAY = new WeekDay(0,false){
         public WeekDay getNextDay() {
                return MONDAY;
            }
         @Override
            public String toString() {
                return "SUNDAY";
            }
    };
    private static void showDay(WeekDay d) {
        if(d.isWeekday()) {
            System.out.println(d + " is a weekday and has " +
                    d.getHours() + " working hours.");
        } else {
            System.out.println(d + " is not a weekday and has " +
                    d.getHours() + " working hours.");
        }
    }
    private int getHours() {
        // TODO Auto-generated method stub
        return workhours;
    }
    private boolean isWeekday() {
        return work;
    }
    public static void main(String[] args) {
        WeekDay day = WeekDay.FRIDAY;
        showDay(day);
        day = WeekDay.FRIDAY.getNextDay();
        showDay(day);
        day = day.getNextDay();
        showDay(day);
    }
}

因此,有以下更复杂的应用:

public enum Day {
MONDAY (8,true){//首先使用了子类继承的匿名类方式进行了对父类构造函数的,并且在子类中完成了父类的抽象方法
        public Day getNextDay() {
            return TUESDAY;
        }
    },

    TUESDAY (8,true){
        public Day getNextDay() {
            return WEDNESDAY;
        }
    },
    WEDNESDAY (8,true){
        public Day getNextDay() {
            return THURSDAY;
        }
    },
    THURSDAY (8,true){
        public Day getNextDay() {
            return FRIDAY;
        }
    },
    FRIDAY (8,true){
        public Day getNextDay() {
            return SATURDAY;
        }
    },
    SATURDAY (4,false){
        public Day getNextDay() {
            return SUNDAY;
        }
    },
    SUNDAY (0,false){
        public Day getNextDay() {
            return MONDAY;
        }
    };
    private int hours;
    private boolean weekday;
Day(int workHours,boolean weekdayFlag) {
        hours = workHours;
        weekday = weekdayFlag;
    }
    private abstract Day getNextDay();
    public int getHours() {
        return(hours);
    }
    public boolean isWeekday() {
        return(weekday);
    }
    private static void showDay(Day d) {
        if(d.isWeekday()) {
            System.out.println(d + " is a weekday and has " +
                    d.getHours() + " working hours.");
        } else {
            System.out.println(d + " is not a weekday and has " +
                    d.getHours() + " working hours.");
        }
    }
    public static void main(String arg[]) {
        Day day;
        day = Day.TUESDAY;
        showDay(day);
        day = Day.SATURDAY;
        showDay(day);
        day = Day.THURSDAY.getNextDay();
        showDay(day);
    }
}

注意:

1.注意枚举类型不能定义为abstract或者final。

2.枚举类中定义了抽象方法,但是枚举类却没有实例去实现这个抽象方法,这样会报错。

3.一个枚举类型除非包含至少一个枚举常量带有class body,否则就是隐式final的。

4.嵌套 (在一个类中定义的枚举)的枚举类型是隐式static的,若显示赋予就会出错。

5.EnumSet包含了许多静态方法用来指定不同的集合建立和读取方式。

 

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
1月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
116 60
|
4月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
|
3月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
67 9
Java——反射&枚举
|
3月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
从Java环境的搭建到实际代码的编写,从基本用法的讲解到底层原理的剖析,深度解析Java基础知识。本文是《Java学习路线》专栏的起始文章,旨在提供一套完整的Java学习路线,覆盖Java基础知识、数据库、SSM/SpringBoot等框架、Redis/MQ等中间件、设计模式、架构设计、性能调优、源码解读、核心面试题等全面的知识点,并在未来不断更新和完善,帮助Java从业者在更短的时间内成长为高级开发。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
|
3月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
3月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
86 5
|
3月前
|
安全 Java 开发者
Java 枚举(enum)详解
Java 中的枚举(`enum`)是一种特殊的数据类型,用于定义一组固定的常量,提升代码的类型安全性和可读性。枚举使用 `enum` 关键字定义,支持方法和构造函数,具有类型安全、单例、自动序列化等特点,并且可以遍历和用于 `switch` 语句中。实际应用包括状态机、指令集、类型标识等场景。枚举使代码更加清晰易维护。
178 1
|
2月前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
43 0
|
2月前
|
Java 程序员 开发工具
java学习笔记
java学习笔记
40 0
|
3月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
本文是“Java学习路线”中Java基础知识的高级篇,主要对多线程和反射进行了深入浅出的介绍,在多线程部分,详细介绍了线程的概念、生命周期、多线程的线程安全、线程通信、线程同步,并对synchronized和Lock锁;反射部分对反射的特性、功能、优缺点、适用场景等进行了介绍。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)