在项目中经常用到枚举作为数据字典值和描述的相互转化。

用法如下:

public enum CommunicationParamsCom {
COM_1(1, "COM1"), COM_2(2, "485端口1"), COM_3(3, "485端口2"), COM_31(31, "载波"); private int value;
private String key; CommunicationParamsCom(int value, String key) {
this.value = value;
this.key = key;
} public int getValue() {
return value;
} public String getKey() {
return key;
} public static CommunicationParamsCom getEnmuByValue(int value) {
for (CommunicationParamsCom item : values()) {
if (value == item.getValue()) {
return item;
}
}
return null;
} public static CommunicationParamsCom getEnmuByKey(String key) {
if (StringUtil.isEmpty(key)) {
return null;
}
for (CommunicationParamsCom item : values()) {
if (key.equals(item.getKey())) {
return item;
}
}
return null;
}
}

  

当枚举类多了之后,会存在很多重复的值和描述相互转化的方法,类似getEnmuByValue和getEnmuByKey。

最近找到一种方法,利用接口、接口默认方法、泛型,实现通用的方法。同类型的枚举只需要实现该接口即可。

代码如下:

 public interface ICommonEnum {
int getValue(); String getKey(); static <E extends Enum<E> & ICommonEnum> E getEnmu(Integer value, Class<E> clazz) {
Objects.requireNonNull(value);
EnumSet<E> all = EnumSet.allOf(clazz);
return all.stream().filter(e -> e.getValue() == value).findFirst().orElse(null);
} static <E extends Enum<E> & ICommonEnum> E getEnmu(String key, Class<E> clazz) {
Objects.requireNonNull(key);
EnumSet<E> all = EnumSet.allOf(clazz);
return all.stream().filter(e -> e.getKey().equals(key)).findFirst().orElse(null);
}
}

具体用法:

     public enum RtuProtocol implements ICommonEnum {
PTL_A(1, "A规约"), PTL_B(2, "B规约"); private int value;
private String key; RtuProtocol(int value, String key) {
this.value = value;
this.key = key;
} public int getValue() {
return value;
} public String getKey() {
return key;
}
}

转换时的调用举例:

RtuProtocol protocol = ICommonEnum.getEnmu(1,RtuProtocol.class)


java8下 枚举 通用方法的更多相关文章

  1. Ubuntu 14.04下 Java通用安装方法

    参考: 解决Floodlight1.2+Mininet问题及使用安装 Ubuntu下安装JDK1.7图文详解 Ubuntu 14.04下 Java通用安装方法 1.到oracle官网下下载对应jdk包 ...

  2. DataTable数据赋值给Model通用方法

    注:该文属本人原创,今后项目中发现该方法存在BUG会实时更新,转载记得附上原文出处,方便大家获得最新代码. 相信大家在做项目中,经常会根据不同的表new各种不同的Model,当需要对Model进行实例 ...

  3. hibernate学习笔记4---HQL、通用方法的抽取实现

    一.通用方法的抽取实现 由于hibernate中对增删改查的一切操作都是面向对象的,所以将增删改查抽取成通用方法,以满足不同的表的增删改查操作,简化jdbc代码. 具体例子如下: package cn ...

  4. 使用JsPlumb绘制拓扑图的通用方法

    转自:http://www.it165.net/pro/html/201311/7616.html 使用JsPlumb绘制拓扑图的通用方法 一. 实现目标 绘制拓扑图, 实际上是个数据结构和算法的问题 ...

  5. [置顶] .NET下枚举类型的Save和Load分析

    今天在写代码的时候,心血来潮对原来的字符串保存状态位的方式很不满意,对于代码里出现了 state == "1" 这样的状态判断很是不爽.那么理想中的判断是怎样的呢?很简单如你所想枚 ...

  6. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  7. java8新特性-默认方法

    作为一个java程序猿,经常会被问基础怎么样,对于这个问题,我理解的有两方面:一是对于java基础的理解和掌握,比如JDK的相关特性:二是工作的经历,毕竟,语言编程是一门实战性质的艺术,就算掌握了千万 ...

  8. 使用 JsPlumb 绘制拓扑图的通用方法

    摘要: 实现 JsPlumb 绘制拓扑图的通用方法. 只要服务端返回一个符合指定格式的数据结构,就可以绘制相应的拓扑图. 难度: 中级 示例工程见:  http://download.csdn.net ...

  9. 精简Docker镜像的五种通用方法

    http://dockone.io/article/8163 精简Docker镜像的好处很多,不仅可以节省存储空间和带宽,还能减少安全隐患.优化镜像大小的手段多种多样,因服务所使用的基础开发语言不同而 ...

随机推荐

  1. mybatis(五):源码分析 - 参数映射流程

  2. Atcoder Beginner Contest 156E(隔板法,组合数学)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ; ; long long fac[N] ...

  3. linux异常 - 弹出界面 eth0:设备eth0似乎不存在

    问题描述: 用VMware vSphere Client复制虚拟机之后,出现这个问题 解决方法: service network stop service NetworkManager restart

  4. [BJOI2012]连连看

    Description Luogu4134 Solution \(l,r \le 1000\),暴力枚举是否能匹配.这是一个选匹配的问题,所以直接网络流,原图不一定是二分图咋办?拆点啊!然后直接做就行 ...

  5. C++ windows线程操作(转)

    参考 1._beginthreadex创建线程 DWORD m_dwMSGTID; // 线程ID HANDLE m_hMSG; // 线程句柄 m_hMSG = (HANDLE)_beginthre ...

  6. Rider代码格式设置

    单选注释格式设置: File/Settings(Ctrl+Alt+S/Command+Option+S)/Code Style/C#选择Other

  7. Java爬虫学习(2)之用对象保存文件demo(1)

    package com.mieba.spider; import java.util.ArrayList; import java.util.List; import java.util.Vector ...

  8. AcWing 859. Kruskal算法求最小生成树 稠密图

    //稠密图 #include <cstring> #include <iostream> #include <algorithm> using namespace ...

  9. 3.0 java学习网站

    1.http://www.rupeng.com/Courses/Index/51 2.https://www.zhihu.com/question/25255189

  10. java 实体类 时间格式字段注解

    @DatetimeFormat是将String转换成Date,一般前台给后台传值时用 @JsonFormat(pattern="yyyy-MM-dd") 将Date转换成Strin ...