怎么把Java枚举名称作为注解的属性值

javalover123
• 阅读 327

一、前言

  • Java注解的属性值,必须为 常量
  • 有些场景想把 枚举名称 设置为 注解的属性值(如 spring-cache 用枚举配置缓存,使用时 需要 缓存名称)

二、方案

  • 方案一:名称属性 + 外部名称接口

    @lombok.Getter
    @lombok.AllArgsConstructor
    public enum CommonCacheConfig {
      QUOTE_LEVEL(CommonCacheConstant.QUOTE_LEVEL, 2);
    
      private final String name;
    
      private final int ttl;
    }
public interface CommonCacheConstant {

    String QUOTE_LEVEL = "QUOTE_LEVEL";

}

使用:@Cacheable(cacheNames = CommonCacheConstant.QUOTE_LEVEL)

  • 方案二:名称属性 + 内部名称接口

    public enum CommonCacheConfig {
      QUOTE_LEVEL(Constant.QUOTE_LEVEL, 2);
    
      private final String name;
      private final Integer ttl;
    
      public interface Constant {
          String QUOTE_LEVEL = "QUOTE_LEVEL";
      }
    }

    使用:@Cacheable(cacheNames = CommonCacheConfig.Constant.QUOTE_LEVEL)

  • 方案三:Lombok 的 FieldNameConstants

    @lombok.Getter
    @lombok.AllArgsConstructor
    @lombok.experimental.FieldNameConstants(onlyExplicitlyIncluded = true)
    public enum CommonCacheConfig {
    
      @FieldNameConstants.Include QUOTE_LEVEL(2);
    
      private final Integer ttl;
    

}

使用:@Cacheable(cacheNames = CommonCacheConfig.Fields.QUOTE_LEVEL)  
注意:FieldNameConstants 的 onlyExplicitlyIncluded 需设置为 true,否则 按枚举的属性(如 ttl)生成,同时在 枚举项前加 @FieldNameConstants.Include

## 三、总结
- 通过 Lombok 的 FieldNameConstants 自动生成 枚举名称常量,提高了 可维护性
- 参考:[java - Use Enum type as a value parameter for @RolesAllowed-Annotation - Stack Overflow](https://stackoverflow.com/questions/3271659/use-enum-type-as-a-value-parameter-for-rolesallowed-annotation/45800305#45800305)

本文首先发布于 [https://www.890808.xyz/](https://www.890808.xyz/) ,其他平台需要审核更新慢一些。

![javalover123](https://img.890808.xyz/file/javalover123/2023/04/688b88cfd4ed9f6fcd56828b849ce47c.jpg)
点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
2年前
一篇文章带你了解CSS 文本样式
大家好,我是IT共享者,人称皮皮。这篇文章我们来讲讲CSS的文本样式。一、文本颜色Color颜色属性被用来设置文字的颜色。颜色是通过CSS最经常的指定:十六进制值如"#FF0000"。一个RGB值"RGB(255,0,0)"。颜色的名称如"红"。一个网页的文本颜色是指在主体内的选择:
LeeFJ LeeFJ
1年前
Foxnic-Web 代码生成 (4) —— shadow 方法的应用
FoxnicWeb实体生成中shadow方法的应用本文探讨的是在FoxnicWeb实体模型生成时,配置枚举属性与逻辑值属性。配置枚举属性映射通过shadow方法为属性对应枚举,并同步生成get、set方法。
Easter79 Easter79
2年前
SpringMVC(五):@RequestMapping下使用@RequestParam绑定请求参数值
在处理方法入参使用@RequestParam可以把请求参数传递给请求方法,@RequestParam包含的属性值:\value:参数名称\required:是否必须,默认为true,表示请求参数中必须包含对应的参数,否则抛出异常。\defaultValue:当请求参数缺少或者有请求参数但值为空时,值采用该设置值。示
Wesley13 Wesley13
2年前
CSS基本语法及页面引用
css基本语法及页面引用(1)css基本语法css的定义方法是:选择器{属性:值;属性:值;属性:值;}选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个值。代码示例:/css注释ctrlshift"/"/d
Stella981 Stella981
2年前
API之Object.keys()
一、语法Object.keys(obj)参数:枚举自身属性的对象。返回值:一个表示给定对象的所有可枚举属性的字符串数组。二、处理对象,返回可枚举的属性数组varobj{projId:'SM31726327362187',pro
Wesley13 Wesley13
2年前
Java中枚举的线程安全性及序列化问题
JavaSE5提供了一种新的类型Java的枚举类型,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。本文将深入分析枚举的源码,看一看枚举是怎么实现的,他是如何保证线程安全的,以及为什么用枚举实现的单例是最好的方式(https://www.oschina.net/act
Stella981 Stella981
2年前
SpringBoot2 学习10 Controller接收参数的方式
地址传值@PathVariable获取路径参数。即url/{id}这种形式。?传值@RequestParam获取查询参数。即url?name这种形式用注解@RequestParam绑定请求参数到方法入参当请求参数username不存在时会有异常发生,可以通过设置属性requiredfalse解决,例如:@R
Easter79 Easter79
2年前
SpringBoot2 学习10 Controller接收参数的方式
地址传值@PathVariable获取路径参数。即url/{id}这种形式。?传值@RequestParam获取查询参数。即url?name这种形式用注解@RequestParam绑定请求参数到方法入参当请求参数username不存在时会有异常发生,可以通过设置属性requiredfalse解决,例如:@R
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Easter79 Easter79
2年前
Swift讲解专题十一——属性
Swift讲解专题十一——属性一、引言      属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算属性用于计算一个值,其可以用于类,结构体和枚举。二、存储属性      存储属性使用变量或者常量来存储一个
javalover123
javalover123
Lv1
10年Java经验,多个开源项目贡献者。https://github.com/javalover123
文章
16
粉丝
2
获赞
5