首页 > 其他分享 >枚举类的相关使用

枚举类的相关使用

时间:2024-05-11 14:08:20浏览次数:15  
标签:PAY PayEnum 枚举 实例 使用 相关 type public

Java 枚举类

枚举类的含义

枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

  • 枚举类的常见使用场景

    1、定义业务相同的一类属性
    2、为同一个业务场景的不同处理方式进行策略处理

  • 举例
    现在我们有一个扫码支付的场景: 支持支付宝、微信、银联等相关支付渠道
public enum PayEnum {

    ALI_PAY(1, "alipay"),

    WX_PAY(2, "wxpay"),

    UNION_PAY(3, "unionpay");

    private final Integer type;

    private final String payChannel;

    // 以空间换时间,来减少每一次枚举渠道方法调用的时间复杂度
    private static Map<Integer, PayEnum> payChannelEnums = new ConcurrentHashMap<Integer, PayEnum>(8);

    PayEnum(Integer type, String payChannel) {
        this.type = type;
        this.payChannel = payChannel;

    }

    public Integer getType() {
        return this.type;
    }

    public String getPayChannel() {
        return this.payChannel;
    }

    public static PayEnum getPayEnumByType(Integer type) {
        if (payChannelEnums.isEmpty()) {
            for (PayEnum each : PayEnum.values()) {
                payChannelEnums.putIfAbsent(each.getType(), each);
            }
        }
        return payChannelEnums.get(type);
    }
}
  • 枚举类注意事项

1、枚举类的每一个属性都需要定义成常量,防止外部调用时更改相关数值,保证系统的安全性
2、枚举类的每一个实例应基于规约使用全大写的形式例如: ALI_PAY、WX_PAY、UNION_PAY
3、每一个枚举每一个枚举实例都是一个静态常量实例
4、当找不到对应的枚举类是需要抛出 IllegalArgumentException 异常
5、枚举类默认 extends 自 Enum

基于 Hutool EnumUtil 获取枚举相关属性

  • 获取枚举类的全部实例属性
  EnumUtil.getFieldValues(PayEnum.class, "type"); // [1,2,3]
  • 获取枚举类中枚举实例的全部名称
  List<String> names = EnumUtil.getNames(PayEnum.class); // ["ALI_PAY", "WX_PAY", "UNION_PAY"]  
  • 获取枚举字符串 -> Enum 实例的 Map
 Map<String,PayEnum> enumMap = EnumUtil.getEnumMap(PayEnum.class); // {{ALI_PAY:ALI_PAY}, {WX_PAY:WX_PAY},{UNION_PAY:UNION_PAY}}

基于枚举类实现策略模式

 /**
* 烹饪时常枚举类
*/
public enum CookTimeEnum {


   NOODLE("面条", 3L) {
       void cookType() {
           System.out.println("大火烹饪");
       }
   },

   DUMPLING("饺子", 6L) {
       void cookType() {
           System.out.println("中火烹饪");
       }
   };


   /**
    * 食物名称
    */
   @Getter
   private final String foodName;

   /**
    * 烹饪时间
    */
   @Getter
   private final Long cookingTime;

   CookTimeEnum(String foodName, Long cookingTime) {
       this.foodName = foodName;
       this.cookingTime = cookingTime;
   }

   /**
    * 烹饪方式
    */
   abstract void cookType();
}
  • 解释

1、每一个枚举类的实例都是一个 class 对象,所以每一个实例都需要重新他的抽象方法-> 以此实现策略模式

标签:PAY,PayEnum,枚举,实例,使用,相关,type,public
From: https://www.cnblogs.com/ayizzz/p/18186377

相关文章

  • 使用 Docker 部署 VS Code in The Browser
    1)介绍GitHub:https://github.com/coder/code-server在日常学习工作中,Vscode已成为我们首选的代码编辑器。然而,其局限性在于当我们从家到公司移动时,难以保持连续的编码体验。针对这一痛点,虽然市面上已有如VisualStudioCodespaces、Cloudstudio和CloudIDE等在线编辑器(Web......
  • 使用Consul服务注册和发现
    2.1服务注册2.1.1引入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>2.1.2编写配置文件server:port:80spring:application:......
  • android中Room数据库的基本使用
    简介:还在使用原生的sqllite?有这么清爽且稳如狗的room为啥不用呢?Room是Google官方推荐使用的数据库,相比较某些优秀数据库框架来说,不用过于担心某天库会停止维护,且访问数据库非常流畅,并且提供了与常规的ORM框架一样,通过添加编译期注解来进行表和字段的配置,譬如@Database、@Dao、@E......
  • WebGL:使用着色器进行几何造型
    前言本文将介绍如何使用着色器来进行几何造型,说到几何图形大家一定都不陌生,比如说三角形、圆形,接触过WebGL基础使用的小伙伴一定都知道怎么去在画布上绘制一个三角形,只要传入三个顶点坐标,并选择绘图模式,我们就能在WebGL的画布上画出一个三角形。但是除了这种形式之外,我们还可以......
  • 如何安全的使用密码登录账号(在不知道密码的情况下)
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、打开工具,进入账号密码模块(快捷键:Ctrl+2),如图2、看到鼠标移动到密码那一栏有提示,按住Ctrl或者Alt点击或者双击就能复制内容,这方法虽然快,但还是能看到密码。3、先模拟一个账号,随意填写数据。保存它。之后左侧......
  • 微信自动群发消息代码实现,销售人员可以直接下载成品使用了
    在探索微信营销的新边界时,一款名为“智慧沟通”的工具悄然诞生,它融合了通讯录智能群发与朋友圈互动优化的功能,为营销领域带来了一股清新的气息。此工具不仅在技术层面进行了革新,还充分考虑了用户体验与隐私保护,让我们一窥其背后的巧妙设计。技术揭秘:通讯录智能群发核心逻辑通讯......
  • RustDesk 自建服务器部署和使用教程
    RustDesk是一个强大的开源远程桌面软件,是中国开发者的作品,它使用Rust编程语言构建,提供安全、高效、跨平台的远程访问体验。可以说是目前全球最火的开源远程桌面软件了,GitHub星星数量达到了惊人的64k!与TeamViewer、ToDesk等专有远程访问解决方案相比,RustDesk作为一个开源......
  • 使用js有效括号匹配封装函数
    点击查看代码functionisValidParentheses(str){//定义一个栈,用于存储待匹配的左括号letstack=[];//定义一个对象,用于快速判断括号是否成对constpairs={')':'(','}':'{',']':'['};//遍历输入字符串for(let......
  • 小程序无法使用TextEncoderDecoder问题
    不知道为什么用网友给的FastestSmallestTextEncoderDecoder这个在小程序一直引入不到里面的方法找网友要了两个js包就能用https://github.com/123456789xzxz/miniprogram/blob/main/miniprogram-text-decoder.jshttps://github.com/123456789xzxz/miniprogram/blob/main/minipr......
  • inspectAR - PCB增强现实工具包+Wireshark - 最广泛使用的开源网络协议分析器
    1、Wireshark-最广泛使用的开源网络协议分析器Wireshark是世界上最重要的、被广泛使用的网络协议分析器。Wireshark可以从以太网,IEEE802.11,PPP/HDLC,ATM,蓝牙,USB,令牌环,帧中继,FDDI和其他(取决于你的平台)读取实时数据。软件官网:https://www.wireshark.org/Wireshark......