[JAVA]枚举类型的应用

本文介绍枚举类的概念和开发过程中枚举的用法。
枚举类使用enum关键字定义,enum默认继承自Enum类,由于java单继承的特点,enum类无法再继承其他父类

一、枚举类的特性

1、简单枚举类的定义

枚举类用关键字enum定义,成员变量之间用逗号分隔,最后一个成员变量用分号结束。枚举类的命名建议加上Enum后缀。
代码如下:

public enum FruitEnum {
    APPLE,
    ORANGE,
    BANANA,
    PEAR
}

枚举的成员变量均为常量,可以通过FruitEnum.APPLE调用,构造方法被默认强制是私有,禁止通过new关键字实例化。
枚举类自带values()方法可以返回该枚举的所有实例

2、添加自定义方法

枚举类继承自Enum,默认实现了很多常用方法,包括:toString(),compareTo(),equals(),hashCode()等。
我们也可以给枚举类添加自定义方法,需要注意如下几点:

1、自定义方法必须在enum实例之后;
2、如果显示指明了构造方法,必须是默认(enum中默认既是私有)或私有
3、最后一个实例需要加分号

例如,给简单示例增加要给重写的toString()方法:

public enum FruitEnum {
    APPLE,
    ORANGE,
    BANANA,
    PEAR;

    @Override
    public String toString() {
        return "fruit:"+super.toString();
    }
}

3、实现构造函数

public enum FruitEnum {
    /**
     * description 苹果
     **/
    APPLE("苹果", 1),
    /**
     * description 橘子
     **/
    ORANGE("橘子", 2),
    /**
     * description 香蕉
     **/
    BANANA("香蕉", 3),
    /**
     * description 梨
     **/
    PEAR("梨", 4),
    /**
     * description 猕猴桃
     **/
    KIWI_FRUIT("猕猴桃", 5);

    private String description;
    private final Integer value;

    /**
     * description 构造函数
     * param [description, value]
     **/
    FruitEnum(String description, int value) {
        this.description = description;
        this.value = value;
    }

    /**
     * description 根据枚举值获取枚举对象
     * param [value]
     * return com.company.enumtest.FruitEnum
     * author 郑晓龙
     * createTime 2019/12/3 10:35
     **/
    public static FruitEnum getFruitEnumByValue(Integer value) {
        if (value == null) {
            return null;
        }
        for (FruitEnum fruitEnum : FruitEnum.values()) {
            if (fruitEnum.ordinal() == value) {
                return fruitEnum;
            }
        }
        throw new NoSuchElementException();
    }

    public String getDescription() {
        return description;
    }

    public Integer getValue() {
        return value;
    }
}

二、枚举的应用场景

1、switch语句中使用枚举

case语句中不需要写枚举类名,可以直接写枚举实例,例如:

    FruitEnum fruit = FruitEnum.KIWI_FRUIT;
    switch (fruit){
        case APPLE:
            System.out.println("get apple!");
            break;
        case KIWI_FRUIT:
            System.out.println("get KIWI_FRUIT!");
            break;
        default:
            System.out.println("default");
    }

2、枚举实现单例模式

由于枚举天然的静态化和不可用new实例化,可以用于单例模式

public enum Singleton {
    INSTANCE;
    /**
     * description 无参构造函数(可以省略)
     **/
    private Singleton(){
        System.out.println("I'm singleton");
    }
    public static void doSomething(){
        System.out.println("I'm doing!");
    }

}

main方法中使用单例:

 Singleton.doSomething();
 Singleton.doSomething();

执行结果:

I'm singleton
I'm doing!
I'm doing!

可以看到,当Singleton类第一次被调用时,实例化了该单例类,并执行了方法,第二次直接执行了方法。

参考:

posted on 2019-12-03 13:54  郑晓龙  阅读(877)  评论(0编辑  收藏  举报

导航