{"id":15297334,"url":"https://github.com/luo-zhan/easyenum","last_synced_at":"2025-09-10T01:37:48.281Z","repository":{"id":180092190,"uuid":"664457959","full_name":"luo-zhan/EasyEnum","owner":"luo-zhan","description":"重铸枚举荣光！","archived":false,"fork":false,"pushed_at":"2024-05-24T03:02:34.000Z","size":98,"stargazers_count":8,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-13T22:47:53.516Z","etag":null,"topics":["enum","java","jdk"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luo-zhan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-07-10T02:53:59.000Z","updated_at":"2025-03-12T07:46:31.000Z","dependencies_parsed_at":null,"dependency_job_id":"ac06dddf-aed5-41e8-bf7d-85dae2d23fad","html_url":"https://github.com/luo-zhan/EasyEnum","commit_stats":null,"previous_names":["luo-zhan/easyenum"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/luo-zhan/EasyEnum","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luo-zhan%2FEasyEnum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luo-zhan%2FEasyEnum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luo-zhan%2FEasyEnum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luo-zhan%2FEasyEnum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luo-zhan","download_url":"https://codeload.github.com/luo-zhan/EasyEnum/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luo-zhan%2FEasyEnum/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274396735,"owners_count":25277395,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-09T02:00:10.223Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["enum","java","jdk"],"created_at":"2024-09-30T19:16:43.336Z","updated_at":"2025-09-10T01:37:48.248Z","avatar_url":"https://github.com/luo-zhan.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EasyEnum\n[![Coverage Status](https://coveralls.io/repos/github/luo-zhan/EasyEnum/badge.svg?branch=main)](https://coveralls.io/github/luo-zhan/EasyEnum?branch=main)\n[![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/luo-zhan/EasyEnum)]()\n[![GitHub](https://img.shields.io/github/license/luo-zhan/EasyEnum)](http://opensource.org/licenses/apache-2-0)\n[![GitHub last commit](https://img.shields.io/github/last-commit/luo-zhan/EasyEnum?label=Last%20commit)]()\n\n重铸枚举荣光！！\n\n## 功能\n- [x] 简化枚举类定义（省略属性定义\u0026get方法，提供大量实用的枚举转换工具）\n- [x] Json序列化、反序列支持（Redis/MQ等需要json序列化的场景）\n- [x] Spring开发支持（支持Post请求DTO/VO中使用枚举属性、支持Get请求方法出入参使用枚举、Feign调用支持枚举传输）\n- [x] MyBatis开发支持（Entity中可直接用枚举属性在sql中自动转换成数值、MyBatisPlus中Wrapper支持直接使用枚举条件）\n- [x] Dubbo传参支持（json协议完美支持，Hessian协议不推荐使用枚举传输）\n\n## 快速上手\n\n### 1. 创建枚举类\n\n回想一下，以前我们每次创建枚举类都要定义属性、写get方法和一堆工具方法，代码非常重复。\n\n而使用EasyEnum后，将枚举实现`Dict`接口，代码将简化成如下。\n```java\n/**\n * 性别枚举示例\n */\npublic enum SexEnum implements Dict\u003cInteger\u003e {\n    MALE(1, \"男\"),\n    FEMALE(2, \"女\"),\n    UNKNOWN(3, \"未知\");\n\n    SexEnum(Integer code, String text) {\n        // 一个init方法搞定，该方法来自Dict接口\n        init(code, text);\n    }\n}\n```\n你没看错，原先的属性定义、get方法、工具方法全部省略，仅仅只需要在构造方法中调用`init()`方法即可。接着就能通过`getCode()`和`getText()`方法获取枚举的编码值和文本。\n```java\nInteger code = SexEnum.MALE.getCode(); // 1\nString text = SexEnum.MALE.getText(); // \"男\"\n```\n\n\u003e Dict的含义即为字典，拥有编码和文本两个固定属性，而在业务开发中定义的枚举大都是就是字典，所以抽象成接口，省略枚举类中重复代码。\n\n### 2.使用枚举方法\nDict接口除了优化枚举申明，还提供了大量实用的api：\n```java\n// 1、通过code获取text\nString text = Dict.getTextByCode(SexEnum.class, 1); // \"男\"\n// 2、通过text获取code\nInteger code = Dict.getCodeByText(SexEnum.class, \"男\"); // 1\n// 3、通过code获取枚举\nSexEnum sex = Dict.getByCode(SexEnum.class, 1); // SexEnum.MALE\n```\n转换成字典项集合，常用于给前端下拉框展示使用\n```java\n// 4、获取枚举的所有元素\nList\u003cDictBean\u003e all = Dict.getAll(SexEnum.class); // [{code:1,text:\"男\"},{code:2,text:\"女\"},{code:3,text:\"未知\"}]\n// 5、获取枚举的指定元素\nList\u003cDictBean\u003e items = Dict.getItems(SexEnum.MALE, SexEnum.FEMALE); // [{code:1,text:\"男\"},{code:2,text:\"女\"}]\n// 6、排除指定元素，获取其他元素\nList\u003cDictBean\u003e items = Dict.getItemsExclude(SexEnum.UNKNOWN); // [{code:1,text:\"男\"},{code:2,text:\"女\"}]\n```\n上例中的DictBean是Dict的一个实现类，用于存储真正的枚举数据，DictBean定义如下：\n```java\npublic class DictBean implements Dict\u003cObject\u003e {\n    /**\n     * 字典code\n     */\n    private final Object code;\n    /**\n     * 字典text\n     */\n    private final String text;\n    /**\n     * 是否废弃\n     */\n    private final transient boolean isDeprecated;\n    \n}\n```\n其中`isDeprecated`属性的作用是如果我们在枚举项上使用`@Deprecated`注解时，这个属性的值就会为true。\n\n示例：\n```java\npublic enum SexEnum implements Dict\u003cInteger\u003e {\n    MALE(1, \"男\"),\n    FEMALE(2, \"女\"),\n    @Deprecated\n    UNKNOWN(3, \"未知\");\n    ...\n}\n\n// 使用getAll()的重载方法，第二个入参表示是否排除废弃枚举项\nList\u003cDictBean\u003e all = Dict.getAll(SexEnum.class, true); // [{code:1,text:\"男\"},{code:2,text:\"女\"}]\n```\n\n\n### 3.Spring开发支持\n#### 3.1 Post请求DTO/VO中使用枚举属性\n在以往的接口开发中，当DTO中有枚举含义的字段时，常常是用Integer类型来定义，然后代码中写逻辑时需要这样：\n```java\n// 实际上这段代码还会告警，提示应使用equals\nif(student.getSex() == SexEnum.MALE.getCode()){\n    ...\n}\n```\n又比如当遇到switch-case时，代码也稍显麻烦：\n```java\n// 写法1，直接用魔法值\nswitch(studentDTO.getSex()){\n    case 1: System.out.print(\"男\");break;\n    case 2: System.out.print(\"女\");break;\n}\n// 写法2，先转换成枚举类\nSexEnum sex = SexEnum.getByCode(studentDTO.getSex());\nswitch(sex){\n    case MALE: System.out.print(\"男\");break;\n    case FEMAL: System.out.print(\"女\");break;\n}\n```\n那为什么不直接在Bean中使用枚举类型的属性呢？\n```java\npublic class StudentDTO {\n    private Integer id;\n    private String name;\n    private SexEnum sex; // 使用枚举类型\n    \n}\n\n// 写switch-case很顺畅\nswitch(studentDTO.getSex()){\n    case MALE:  System.out.print(\"男\");break;\n    case FEMAL: System.out.print(\"女\");break;\n}\n```\n\u003e 这里DTO、VO都支持直接用枚举类型的属性，因为组件对Dict枚举的json序列化和反序列化做了支持\n\u003e \n\u003e 源码参考：DictJacksonConfiguration\n#### 3.2 支持Get请求方法出入参使用枚举\n接口参数除了Json序列化方式，也有可能是Get请求参数方式，组件同样也做了支持\n```java\n@GetMapping(\"/listStudentBySex\")\npublic List\u003cStudent\u003e listStudent(SexEnum sex){\n    ...   \n}\n```\n\u003e 这里无论是入参还是出参都可以使用枚举，因为对枚举对Spring的converter做了支持\n\u003e \n\u003e 源码参考：DictSpringConvertConfintion\n\n#### 3.3 Feign调用支持枚举参数传输\nFeign调用时，方法参数会先在调用方序列化成url请求参数进行传输，到达被调用方后再反序列化成方法入参，这里也对枚举做了支持\n\n```java\n\n// 被调用方接口申明\n@FeignClient(url = \"\", path = \"/student\")\npublic interface StudentFeignClient {\n\n    @GetMapping(\"/listStudentBySex\")\n    List\u003cStudent\u003e listStudent(SexEnum sex); //直接使用枚举入参\n}\n\n// 调用方：\n@Resource\nprivate StudentFeignClient studentFeignClient;\n...\nList\u003cStudent\u003e studentList = studentFeignClient.listStudent(SexEnum.MALE);\n```\n\u003e 源码参考：DictSpringConvertConfiguration\n\n### 4.Mybatis开发支持\n可以在实体中直接使用枚举来充当属性，sql查询后会自动进行类型转换：\n```java\npublic class Student{\n    @TableId\n    private Integer id;\n    private String name;\n    private SexEnum sex; // 使用枚举类型\n    \n}\n```\n另外，如果你使用了MybatisPlus，那么也可以简化MybatisPlus的枚举条件查询代码：\n```java\nWrapper\u003cStudent\u003e wrapper = new LambdaQueryWrapper\u003c\u003e(); // QueryWrapper同理\n// 之前\nwrapper.eq(Student::sex, SexEnum.MALE.getCode());\n// 之后\nwrapper.eq(Student::sex, SexEnum.MALE);\n// 注意：这里的代码简化不要求Student类中的sex属性类型必须是枚举，Integer类型同样有效\n```\n\u003e 源码参考：DictMybatisConfiguration\n## 使用方式\n导入依赖即自动生效\n   ```xml\n    \u003c!-- Spring开发支持，含核心功能、Json、SpringConverter（项目须依赖springWeb）和Mybatis（项目须依赖mybatis）） --\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.luo-zhan\u003c/groupId\u003e\n        \u003cartifactId\u003eeasy-enum-for-spring\u003c/artifactId\u003e\n        \u003cversion\u003e1.3.1-RELEASE\u003c/version\u003e\n    \u003c/dependency\u003e\n   ```\n如果你不需要Spring和Mybatis的支持，只需要Dict枚举的工具方法，可以只引入以下依赖\n```xml\n\u003c!-- 核心模块 --\u003e\n\u003cdependency\u003e\n   \u003cgroupId\u003eio.github.luo-zhan\u003c/groupId\u003e\n   \u003cartifactId\u003eeasy-enum\u003c/artifactId\u003e\n   \u003cversion\u003e1.3.1-RELEASE\u003c/version\u003e\n\u003c/dependency\u003e\n```\n## 交流\n\n有任何问题或建议，欢迎提issues或者来讨论组内畅所欲言\n\n[💬进入讨论组](https://github.com/luo-zhan/EasyEnum/discussions)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluo-zhan%2Feasyenum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluo-zhan%2Feasyenum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluo-zhan%2Feasyenum/lists"}