Java 深入学习(31) —— 枚举

1 枚举类简介


  • 在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类

  • 在 Java 中使用 enum 关键字来定义枚举类,其地位与 class、interface 相同;

  • 枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器 (只能使用 private 访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用);

  • 一个 Java 源文件中最多只能有一个 public 类型的枚举类,且该 Java 源文件的名字也必须和该枚举类的类名相同,这点和类是相同的;

  • 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口;

  • 所有的枚举值都是 public static final 的,且非抽象的枚举类不能再派生子类;

  • 枚举类的所有实例(枚举值)必须在枚举类的第一行显式地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加 public static final 修饰,无需程序员显式添加。


2 枚举类的使用


2.1 常量和 switch 语句


在JDK1.5 之前,我们定义常量都是: public static fianl…. 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

public enum Signal {
    GREEN, YELLOW, RED
}

class TrafficLight {
    private Signal color = Signal.RED;

    public void change() {
        switch (color) {
            case RED:
                color = Signal.GREEN;
                break;
            case YELLOW:
                color = Signal.RED;
                break;
            case GREEN:
                color = Signal.YELLOW;
                break;
        }
    }

    public static void main(String[] args) {
        TrafficLight light = new TrafficLight();
        System.out.println(light.color);
        light.change();
        System.out.println(light.color);
        light.change();
        System.out.println(light.color);
    }
}

这里写图片描述


2.2 向枚举类中添加新方法


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

package learnenum;

/**
 * Author:  HeatDeath
 * Date:    2018/2/2
 * Desc:
 */
public enum Color {
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLOW("黄色", 4);
    // 成员变量
    private String name;
    private int index;

    // 构造方法
    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;
    }

    public String getName() {
        return name;
    }

    public int getIndex() {
        return index;
    }

    public static void main(String[] args) {
        System.out.println(Color.RED);
        System.out.println(Color.RED.getIndex());
        System.out.println(Color.RED.getName());
        System.out.println(Color.getName(1));
    }
}

这里写图片描述


2.3 覆盖枚举的方法


public enum Color {
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
    // 成员变量
    private String name;
    private int index;

    // 构造方法
    Color(String name, int index) {
        this.name = name;
        this.index = index;
    }

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

    public static void main(String[] args) {
        System.out.println(Color.RED);
        System.out.println(Color.GREEN);
        System.out.println(Color.YELLO);
    }
}

这里写图片描述


2.4 实现接口


package learnenum;

/**
 * Author:  HeatDeath
 * Date:    2018/2/2
 * Desc:
 */
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;

    // 构造方法
    Color(String name, int index) {
        this.name = name;
        this.index = index;
    }

    //接口方法
    public String getInfo() {
        return this.name;
    }

    //接口方法
    public void print() {
        System.out.println(this.index + ":" + this.name);
    }

    public static void main(String[] args) {
        System.out.println(Color.RED);
        System.out.println(Color.RED.getInfo());
        Color.RED.print();
    }
}

这里写图片描述


2.5 使用接口组织枚举


这里写图片描述


2.6 枚举集合的使用


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


3 参考资料

1、Java 枚举7常见种用法
http://softbeta.iteye.com/blog/1185573

2、Java 中的枚举 (enum)
https://www.jianshu.com/p/46dbd930f6a2

3、Java enum的用法详解
https://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html

4、《Java编程思想》

5、深入理解Java枚举类型(enum)
http://blog.csdn.net/javazejian/article/details/71333103


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值