项目中枚举类怎么设置

本篇文章将介绍:

  1. 枚举类存在的意义
  2. 魔法值不能存在的原因
  3. 枚举类的设置
  4. 枚举类的使用注意事项
  5. 枚举类的存放位置

枚举类存在的意义就是防止程序中出现魔法值,魔法值就是一些写死的值举个例子:

user.setAge("23");

其中的23就是魔法值,

魔法值不能存在的原因:

魔法数值使代码的可读性大大下降

具体原因请查看:

https://blog.youkuaiyun.com/qq_39929929/article/details/82924887

下面说下枚举类的设置 

枚举类中设置的String  类型的key和String 类型的value

也有的是设置的是String类型的name 和Integer类型的value

先说第一种设置

如果设置的枚举属性都是String类型,那么,可能数据库库中对应的存储字段是varchar类型

那么在设置的枚举类中key值就是要存储到数据库中的值,那么在写业务代码时要进行相应的转换

设置默认值的时候
po.setDataSource(ProductDataSourceEnum.MDM.getKey());
前端传相应的值时需要做转换
po.setDataSource(ProductDataSourceEnum.getNameByValue(query.getDataSource()));

存储到数据库中

value表示在前端页面上显示的值,它是对key值意义的描述,所以在向前端展示数据的时候对应的字段我们也要做相应的转换

vo.setDataSource(ProductDataSourceEnum.getValueByName(po.getDataSource));

第一种的枚举类 设置

package com.deepexi.product.enums.product;

import com.deepexi.product.enums.certificate.SignStatusEnum;
import org.apache.commons.lang.StringUtils;

import java.util.Objects;

/**
 * @Author xiang
 * @CreatTime 2020/6/24
 * @Describe
 */
public enum ProductDataSourceEnum {

    MDM("MDM","MDM下发");

    public String key;
    public String value;

    ProductDataSourceEnum(String key, String value) {
        this.key = key;
        this.value = value;

    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }

    /**
     * 根据值返回名称
     */
    public static String getNameByValue(String value) {
        SignStatusEnum[] arr = SignStatusEnum.values();
        for (SignStatusEnum e : arr) {
            if (value.equals(e.getValue())) {
                return e.getKey();
            }
        }
        return "";
    }

    public static String getValueByName(String name) {
        SignStatusEnum[] arr = SignStatusEnum.values();
        for (SignStatusEnum e : arr) {
            if (name.equals(e.getKey())) {
                return e.getValue();
            }
        }
        return null;
    }

    public static Boolean isHasValue(String value) {
        if (Objects.isNull(value)) {
            return false;
        }
        if (StringUtils.isBlank(getNameByValue(value))) {
            return false;
        }
        return true;
    }

    public static Boolean isHasName(String name) {
        if (StringUtils.isBlank(name)) {
            return false;
        }
        if (Objects.isNull(getValueByName(name))) {
            return false;
        }
        return true;
    }
}

第二种枚举类设置

package com.deepexi.product.enums.product;

import org.apache.commons.lang.StringUtils;

import java.util.Objects;

public enum ValidEnum {
    START("使用中", 1),
    STOP("停用中", 0);

    private String name;
    private Integer value;

    ValidEnum(String name, Integer value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }


    public Integer getValue() {
        return value;
    }


    /**
     * 根据值返回名称
     */
    public static String getNameByValue(Integer value) {
        if (Objects.isNull(value)) {
            return "";
        }
        ValidEnum[] arr = ValidEnum.values();
        for (ValidEnum e : arr) {
            if (value.equals(e.getValue())) {
                return e.getName();
            }
        }
        return "";
    }

    public static Integer getValueByName(String name) {
        if (Objects.isNull(name)) {
            return null;
        }
        ValidEnum[] arr = ValidEnum.values();
        for (ValidEnum e : arr) {
            if (name.equals(e.getName())) {
                return e.getValue();
            }
        }
        return null;
    }

    public static Boolean isHasValue(Integer value) {
        if (Objects.isNull(value)) {
            return false;
        }
        return StringUtils.isNotBlank(getNameByValue(value));
    }

    public static Boolean isHasName(String name) {
        return StringUtils.isNotBlank(name) && !Objects.isNull(getValueByName(name));
    }
}

针对这种设置就是数据库中对应的字段就是int/bigint/tinyint这些类型

value就是对应数据库中存储的字段,是将value的值存储到数据库中

name就是对value值的描述,是展示在前端页面的

存储到数据库中做的转换

前端传相应的值的时候做的转换 
po.setValidLabel(ValidEnum.getValueByName(query.getValidLabel));
或者是设置默认值的时候
po.setValidLabel(ValidEnum.START.getValue());

同样 在向展示前端数据的时候做出相应的转换

    vo.setValidLabel(ValidEnum.getNameByValue(po.getValidLabel));

如果枚举类中有字段是Integer类型的时候一般是从1开始递增,除非设置的枚举是描述yes,no或者是停止,开启这些设置时从0开始

枚举类存放的位置

一般项目都分为xxx-api,xxx-provider

枚举类一般都放在xxx-provider项目的指定位置,而api中的枚举则是专门对api接口提供的仅仅是接口而不是service层,也就是说只有api接口中需要用到转换时枚举类才放到api中.

 

### Java 枚举类型 `enum` 的用法 枚举类型 (`enum`) 是一种特殊的数据类型,允许变量被赋予一组预定义常量中的一个。这有助于提高代码可读性和安全性。 #### 定义简单的枚举类 可以创建表示一周七天的简单枚举: ```java public enum DayOfWeek { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; } ``` 此段代码声明了一个名为 `DayOfWeek` 的枚举类型,并为其指定了七个可能取值[^1]。 #### 增强功能:带字段和方法的枚举 除了基本形式外,还可以给枚举成员添加属性以及实现接口或编写自定义逻辑的方法: ```java public enum Planet { MERCURY(3.30E23), VENUS(4.87E24), EARTH(5.98E24), MARS(6.42E23); private final double mass; // 私有构造函数用于初始化实例变量 Planet(double mass) { this.mass = mass; } public double getMass() { return mass; } } ``` 这里展示了如何通过私有的构造器来设置每个行星的质量参数,并提供了获取该质量值得公共访问器方法。 #### 使用场景举例——状态机模拟 当处理具有有限数量离散状态的对象时,比如订单的状态转换过程,使用枚举是非常合适的解决方案之一: ```java public class Order { private Status status; public void setStatus(Status newStatus){ switch(this.status){ case PENDING: if(newStatus != Status.PROCESSING && newStatus != Status.CANCELLED) throw new IllegalStateException(); break; case PROCESSING: if(newStatus != Status.SHIPPED) throw new IllegalStateException(); break; default: if(!newStatus.equals(Status.COMPLETED)) throw new IllegalStateException(); } this.status = newStatus; } public static enum Status{ PENDING, PROCESSING, SHIPPED, COMPLETED, CANCELLED; } } ``` 上述例子中,`Order.Status` 枚举用来管理订单的不同阶段及其合法转变路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值