Java枚举(Enum)的使用和对if-else的优化

本文最后更新于2023.03.28-17:25,某些文章具有时效性,若有错误或已失效,请在下方留言或联系涛哥

前言

在没有枚举时,通常使用定义变量然后通过数据的规定的规则去前端手动改变渲染视图的内容

在有枚举后,通常我们只需要定义号,不同的变量代表什么即可,然后直接通过传递我们自定义的getXxx方法的值给客户端并显示

什么是枚举?

枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造器、定义成员变量和方法,也能实现一个或多个接口,但枚举类不能继承其他类。

优点

(1)类型检查,有效性检查

(2)枚举作为一个类,可以有自己的属性(通常应该是常量,我没遇到过不是的情况)以及自己的方法(否则只能用switch来写,实际违反原则)

(3)和常量相比,无需查看文档和源码就能直接知道所有可能返回值,方便编码。

缺点

枚举类不能继承其他类

enum的常用方法

使用关键字enum时,会隐式继承Enum类,这样就可以使用Enum类的相关方法

toString():Enum类已经重写过了,返回的是当前对象名;子类可以重写该方法,用于返回对象的属性信息

name():返回当前对象名(常量名),子类中不能重写

ordinal():返回当前对象的位置号,默认从0开始

values():返回当前枚举类中所有的常量对象

valueOf():将字符串转换成已有的枚举对象,要求字符串必须为已有的常量名,否则报异常!

compareTo():比较两个枚举常量的大小(编号),返回的结果是两个枚举常量的编号相减得到的数

创建枚举

package com.demo;

public enum SexEnum {
    MALE,FEMALE
}

添加属性和方法

package com.demo;

public enum SexEnum {
    MALE(0,"男")
    ,FEMALE(1,"女")

    private Integer index;
    private String name;

    SexEnum(Integer i,String name) {
        this.index = i;
        this.name = name;
    }

    public Integer getIndex() {
        return index;
    }

    public String getName() {
        return name;
    }
}

定义抽象方法

package com.demo;

public enum SexEnum {
    MALE(0){
        @Override
        public String getSex() {
            return "男";
        }
    },FEMALE(1){
        @Override
        public String getSex() {
            return "女";
        }
    };
    private Integer index;
    SexEnum(Integer index) {
        this.index = index;
    }

    public Integer getIndex() {
        return index;
    }
    public abstract String getSex();
}

完整枚举类

package com.demo;

public enum SexEnum {
    MALE(0,"男"),FEMALE(1,"女");
    private Integer index;
    private String name;
    SexEnum(Integer i,String name) {
        this.index = i;
        this.name = name;
    }

    public Integer getIndex() {
        return index;
    }

    public String getName() {
        return name;
    }
    public static SexEnum ofSexEnum(Integer id) {
        for (SexEnum s : SexEnum.values()) {
            if (s.getIndex() == id.intValue()) {
                return s;
            }
        }
        return null;
    }
}

 减少if-else使用

在没有优化之前是这样

   @RequestMapping("test1/{id}")
    public Object test1(@PathVariable("id") Integer id) {
        Integer key = 0;
        String sex = "";
        HashMap<Integer,String> map = new HashMap<Integer,String>();
        if (Objects.isNull(id)) {
            System.out.println("打印了");
            return "id is null";
        }
        if (id==0){
           sex = SexEnum.MALE.getName();
           key = SexEnum.MALE.getIndex();
        }
        if (id == 1){
            sex = SexEnum.FEMALE.getName();
            key = SexEnum.FEMALE.getIndex();
        }
        map.put(key,sex);
        return map;
    }

优化之后

@RequestMapping("test2/{id}")
    public Object test2(@PathVariable("id") Integer id) {
        HashMap<Integer,String> map = new HashMap<Integer,String>();
        SexEnum sexEnum = null;
        for (SexEnum s : SexEnum.values()) {
            if (id.equals(s.getIndex())) {
                sexEnum = s;
            }
        }
        map.put(sexEnum.getIndex(), sexEnum.getName());
        return map;
    }

最终优化

    @RequestMapping("test3/{id}")
    public Object test3(@PathVariable("id") Integer id) {
        HashMap<Integer,String> map = new HashMap<Integer,String>();
        SexEnum sexEnum = SexEnum.ofSexEnum(id);
        map.put(sexEnum.getIndex(), sexEnum.getName());
        return map;
    }

关键是我们把上面的代码封装到枚举里这样我们就可以减少很多代码的编写

    public static SexEnum ofSexEnum(Integer id) {
        for (SexEnum s : SexEnum.values()) {
            if (s.getIndex() == id.intValue()) {
                return s;
            }
        }
        return null;
    }

这种方法好处:

  1. 有利于进行数据处理,并保存到数据库
  2. 减少冗余代码

结尾

到这里就结束了,涛哥也是在工作中才慢慢知道该如何使用。以前只知道概念,如果你也喜欢编程那就关注涛哥,涛哥将会给你带来更优秀,更精彩的原创文章

欢迎点赞,关注三连,欢迎注册!!!

阅读剩余
THE END