Java中的枚举你真的了解嘛?

1.什么是枚举类?

Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。

Java 枚举类使用enum 关键字来定义,各个常量使用逗号 ,来分割。

比如定义一个颜色枚举:

public enum ColorEnum {
    GREEN,READ,BLUE;

    public static void main(String[] args) {
        ColorEnum colorEnum = ColorEnum.BLUE;

        System.out.println(colorEnum);
    }
}

输出结果:

BLUE

含有成员变量写法:

public enum Sex {
   
    MAN("男",1),

    WOMAN("女",0);

    private final String desc;
    private final int code;

    Sex(String desc, int code) {
        this.desc = desc;
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public int getCode() {
        return code;
    }
    
}

成员变量需要有对应的构造函数,枚举变量(成员变量1..),

2.枚举与类的区别

没有任何区别。通过反编译可以看到enum定义的类型就是class,只不过它有以下几个特点:

  • 定义的enum类型总是继承自java.lang.Enum,且无法被继承(反编译可以看到被final修饰);
  • 只能定义出enum的实例,而无法通过new操作符创建enum的实例;
  • 定义的每个实例都是引用类型的唯一实例;
  • enum的默认父类都默认实现了Serializable接口,所以枚举都默认支持序列化

3.枚举中的常用方法

values

这个方法比较特殊,因为在Javaapi文档中找不到这个方法,这个方法的作用是将枚举类型中的所有常量返回枚举数组,可以用于遍历所有的枚举值。举例如下:

public enum ColorEnum {
    GREEN,READ,BLUE;

    public static void main(String[] args) {
        ColorEnum[] values = ColorEnum.values();
        for (ColorEnum colorEnum : values) {
            System.out.println(colorEnum);
        }
    }
}

输出结果:

GREEN
READ
BLUE

valueOf

valueOf(Stirng str)可以把一个字符串转换为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。举例如下:

public enum ColorEnum {
    GREEN,READ,BLUE;

    public static void main(String[] args) {
        ColorEnum colorEnum = ColorEnum.valueOf("GREEN");
        System.out.println(colorEnum);
    }
}

输出结果:

GREEN

name

name()方法可以得到枚举常量的名称。举例如下:

public enum Sex {
    /**
     * 性别男
     */
    MAN("男"),
    /**
     * 性别女
     */
    WOMAN("女");
    private final String value;
    Sex(String value) {
        this.value = value;
    }
    public static void main(String[] args) {
        Sex sex = Sex.MAN;
        System.out.println(sex.name());
    }
}

输出结果:

MAN

orginal

ordinal()可以得到当前枚举常量的次序。举例如下:

public enum ColorEnum {
    GREEN,READ,BLUE;

    public static void main(String[] args) {
        ColorEnum colorEnum = ColorEnum.valueOf("READ");
        System.out.println(colorEnum.ordinal());

    }
}

输出结果:

1

方法汇总

image

4.枚举中的一些用法

在switch中使用

举例如下:

public enum Sex {
    /**
     * 性别男
     */
    MAN("男"),
    /**
     * 性别女
     */
    WOMAN("女");
    private final String value;
    Sex(String value) {
        this.value = value;
    }
    public static void main(String[] args) {
        Sex sex = Sex.MAN;
        System.out.println(sex.name());
        switch (sex){
            case MAN:
                System.out.println("男性");
                break;
            case WOMAN:
                System.out.println("女性");
                break;
        }
    }
}

输出结果:

男性

实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。但是可以实现接口。举例如下:

public enum ColorEnum implements Behaviour{
    GREEN,READ,BLUE;

    public static void main(String[] args) {
        ColorEnum colorEnum = ColorEnum.valueOf("READ");
        colorEnum.method();
    }

    @Override
    public void method() {
        System.out.println("实现接口中的方法");
    }
}

interface Behaviour {
    void method();
}

用接口组织枚举

比如我们定义一个玩游戏的接口,我们可以在接口中用枚举指定玩游戏的类型:

public interface Playing {
    enum GameEnum{
        ACTION("动作类"),
        ADVENTURE("冒险类"),
        CASUAL("休闲类");
        private final String type;

        GameEnum(String type) {
            this.type = type;
        }
    }
}

枚举中的集合类

EnumSet

EnumSet为把枚举类型存储到Set集合中,举例如下:

public enum ColorEnum{
    GREEN,READ,BLUE;

    public static void main(String[] args) {
        EnumSet<ColorEnum> colorEnums = EnumSet.allOf(ColorEnum.class);
        System.out.println(colorEnums);
    }

}

输出结果:

[GREEN, READ, BLUE]

EnumMap

EnumMap是一种把枚举类型当做Map的key的一种特殊类型。举例如下:

public enum ColorEnum{
    GREEN,READ,BLUE;

    public static void main(String[] args) {
       
        EnumMap<ColorEnum, String> enumMap = new EnumMap<>(ColorEnum.class);

        enumMap.put(ColorEnum.BLUE,"蓝色");
        enumMap.put(ColorEnum.READ,"红色");
        enumMap.put(ColorEnum.GREEN,"绿色");

        enumMap.forEach((key,value)-> System.out.println(key+"--"+value));
    }

}

输出如下:

GREEN--绿色
READ--红色
BLUE--蓝色

5.枚举类中的使用建议

  • 枚举类中的构造方法用不能加public修饰,因为它默认是单例的(默认使用private),不允许外部以创建对象的方式生成枚举对象
  • 字段强烈建议声明为final,只允许获取,不允许修改
  • 枚举类名带上Enum后缀,枚举成员名称需要大写,单词间用下划线隔开
  • 枚举类型几乎是固定不变的全局常量,使用频率高、范围广,所以枚举常量都需要添加清晰的注释。

举例code:

public enum SexEnum {
    /**
     * 性别男
     */
    MAN("男"),
    /**
     * 性别女
     */
    WOMAN("女");

    private final String value;

    SexEnum(String value) {
        this.value = value;
    }
}

参考:

  • https://www.runoob.com/java/java-enum.html
  • https://blog.csdn.net/qq_26676207/article/details/80405497
  • https://www.liaoxuefeng.com/wiki/1252599548343744/1260473188087424
  • https://www.jb51.net/article/96631.htm
  • 《阿里巴巴开发手册》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值