Java枚举

导读:本篇文章讲解 Java枚举,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

为什么需要枚举?

常量定义它不香吗?为啥非得用枚举?

静态常量:

    /**
     * 成功
     */
    public static final int SUCCESS = 1;
    /**
     * 失败
     */
    public static final int FAILURE = 0;

对于这种单值类型的静态常量定义,本身也没错,主要是在使用的地方没有一个明确性的约束而已

    public void getCode(int code){
        
    }

比如这里的 getCode 函数的本意是传入 code 的两种静态常量之一,但由于没有类型上的约束,因此传入任意一个int值都是可以的,编译器也不会提出任何警告。

但是在枚举类型出现之后,上面这种情况就可以用枚举严谨地去约束,比如用枚举去定义视频状态就非常简洁了:

枚举类:

public enum TypeEnum {

    /**
     * 成功
     */
    SUCCESS(1),
    /**
     * 失败
     */
    FAILURE(0)
    ;
    
    private final  int code;

    TypeEnum(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}
// 入参就有明确的约束    
public void getCode(TypeEnum typeEnum){
        
}

这样在使用 getCode 函数时,入参类型就会受到明确的类型约束,一旦传入无效值,编译器就会帮我们检查,从而规避潜在问题。

除此之外,枚举在扩展性方面比普常量更方便、也更优雅。

枚举类型的常用方法

方法名 具体含义 使用方法
values() 将枚举类型成员以数组的形式返回 枚举类.values()
valueOf() 将普通字符串转换为枚举实例 枚举类.valueOf(“ABC”)
compareTo() 比较两个枚举对象在定义时的顺序 枚举对象.compareTo()
ordinal() 得到枚举成员的位置索引 枚举对象.ordinal()

values()方法

该方法可以将枚举类型成员以数组的形式返回,也可以通过该方法获取枚举类型的成员。

测试枚举类

package com.yang.enums;

/**
 * @Author: chen yang
 * @Date: 2021/12/17 11:26
 * @Description: 颜色枚举类
 */
public enum ColorEnum {

    /**
     * 蓝色
     */
    BLUE("blue", "我是蓝色"),
    /**
     * 红色
     */
    RED("red", "我是红色"),

    /**
     * 黑色
     */
    BLACK("black", "我是黑色"),
    GREEN("green", "我是绿色");
    /**
     * 颜色
     */
    private final String name;

    /**
     * 描述
     */
    private final String description;

    ColorEnum(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 通过颜色获取描述
     *
     * @param name
     * @return
     */
    public static String getDescription(String name) {
        for (ColorEnum color : ColorEnum.values()) {
            if (color.name.equals(name)) {
                return color.getDescription();
            }
        }
        return null;
    }

    /**
     * 通过颜色获取描述
     *
     * @param name
     * @return
     */
    public static String getDescription1(String name) {
      return Arrays.stream(ColorEnum.values())
                .filter(color -> Objects.equals(color.getName(), name))
                .findFirst()
                .map(ColorEnum::getDescription)
                .orElse(null);
    }
}
    // 遍历枚举类 
    public static void main(String[] args) {

        // 方式一
        for (ColorEnum colorEnum : ColorEnum.values()) {
            System.out.println("枚举类型成员变量:" + colorEnum);
        }

        System.out.println("------------------------");


        // 方式二
        for (int i = 0; i < ColorEnum.values().length; i++) {
            System.out.println("枚举类型成员变量:" + ColorEnum.values()[i]);
        }

    }

Java枚举

valueOf()与compareTo()方法

枚举类型中静态方法valueOf()可以实现将普通字符串转换为枚举实例,而compareTo()方法用于比较两个枚举对象在定义时的顺序。

public static void main(String[] args) {

        // 将字符串转换成枚举实例
        ColorEnum black = ColorEnum.valueOf("BLACK");
        System.out.println(black);

        System.out.println("------------------------");

        // 比较顺序关系
        compare(black);
    }

    /**
     * 比较两个枚举对象在定义时的顺序
     * @param colorEnum
     */
    public static void compare(ColorEnum colorEnum){
        for (ColorEnum value : ColorEnum.values()) {
            // compareTo()方法用于比较两个枚举对象在定义时的顺序
            System.out.println(colorEnum + " 与 "+value + " 的比较结果为: "+colorEnum.compareTo(value));
        }
    }

Java枚举

 说明:调用compareTo()方法返回的结果,正值代表方法中的参数在调用该方法的枚举对象位置之前;0代表两个相互比较的枚举成员的位置相同;负值代表方法中参数在调用该方法的枚举对象位置之后。

ordinal()方法

该方法用于得到枚举成员的位置索引。

public static void main(String[] args) {

        // 获取枚举成员的位置索引
        for (int i = 0; i < ColorEnum.values().length; i++) {
            System.out.println(ColorEnum.values()[i] + "在枚举类型中位置索引值" + ColorEnum.values()[i].ordinal());
        }
    }

Java枚举

使用枚举类型的优势 

枚举类型声明提供了一种用户友好的变量定义方法,枚举了某种数据类型所有可能出现的值。总结枚举类型,它具有以下特点:

(1)类型安全。

(2)紧凑有效的数据定义。

(3)可以和程序其他部分完美交互。

(4)运行效率高。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95919.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!