网站首页 > 技术文章 正文
起因
当我想给自定义注解的某个参数设一个默认值时,遇到了困难
为毛不能这样设置默认值捏?
注解参数
看下注解的文档吧,annotations(https://docs.oracle.com/javase/1.5.0/docs/guide/language/annotations.html) 里对注解的参数是这样说的
Each method declaration defines an element of the annotation type. Method declarations must not have any parameters or a throws clause. Return types are restricted to primitives, String, Class, enums, annotations, and arrays of the preceding types. Methods can have default values.
翻译
每个方法声明定义了该注解类型的一个元素,方法声明不能有任何参数或抛出异常。返回类型只限于原始数据类型,字符串,类,枚举,注解,以及他们的数组。方法可以有默认值。
看上去我想要设置的默认值是符合规范的,为毛编辑器会提示错误捏?继续研究文档
Once an annotation type is defined, you can use it to annotate declarations. An annotation is a special kind of modifier, and can be used anywhere that other modifiers (such as public, static, or final) can be used. By convention, annotations precede other modifiers. Annotations consist of an at-sign (@) followed by an annotation type and a parenthesized list of element-value pairs. The values must be compile-time constants.
请注意上面这段话里红色的部分,看来关键是在这个 compile-time constants,或曰 编译时常数 上,简单的理解就是在这些值编译器就能得到,而不需要解释器通过运行代码来确定
关于 compile-time constants,推荐一个文章:Compile Time Constants in Java(http://www.zoopable.com/compile-time-constants-in-java/),这里摘录一段,讲的是 compile-time constants 的基本规则
- They must be declared final
- They are of primitive data types or String
- They must be initialized with their declaration.
- Their value must be constant expression.
翻译
- 声明时以 final 修饰
- 原始数据类型或 String
- 声明时就要赋值
- 值必须是个常数表达式
所以
那么,下面代码里的 value 是个 compile-time constants 吗?
public static final byte[] value = "__NULL__".getBytes();
它不是,因为要拿到 value 的值,必须运行解释器来执行 getBytes() 方法,而编译时是不会调用解释器滴
再深入一点
这个代码里的 value 是不是 compile-time constants?
public static final int[] value = {1, 2, 3};
事实上也不是,虽然有 final 修饰,这个 value 甚至不是常数,因为我们可以通过下面代码轻易的修改它
value[0] = 2;
验证一下
结论
无论是为注解参数设置默认值,还是使用注解时给参数传值,都必须符合注解规范,关键是对 compile-time constants 的理解:不可变且编译器确定该值不依赖解释器的执行,若不能理解这一点就会觉得莫名其妙
回眸一笑
final String S1 = "tv:" + "album";
final String S2 = S1 + ":video";
final int I = 1 + 2;
上面代码定义的常量,是否 compile-time constants?
猜你喜欢
- 2025-07-27 JPA实体类注解,看这篇就全会了(java实体类注解)
- 2025-07-27 Java反射机制最全详解(图文全面总结)
- 2025-07-27 javaEE 新闻管理系统 oracle11+tomcat6
- 2025-07-27 SpringBoot 注解最全详解,建议收藏!
- 2024-10-28 从源码里的一个注释,我追溯到了12年前,有点意思
- 2024-10-28 Oracle数据库下使用PL/SQL编程 oracle数据库中,如何在sqlplus中执行sql脚本
- 2024-10-28 Spring注解驱动之后再说事务啊 spring事物注解失效
- 2024-10-28 让清华毕业大牛带你:深入了解Java中的注解,你能吸收到多少呢?
- 2024-10-28 使用自定义注解和切面AOP实现Java程序增强
- 2024-10-28 sql注入fuzz bypass waf SQL注入对于所有数据库的注入方法是一样的
你 发表评论:
欢迎- 635℃几个Oracle空值处理函数 oracle处理null值的函数
- 627℃Oracle分析函数之Lag和Lead()使用
- 615℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 610℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 607℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 601℃【数据统计分析】详解Oracle分组函数之CUBE
- 589℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 575℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- CVE-2025-30762|Oracle(java oracle)
- 低代码可能铲不掉“屎山”,但能让这个它更有「型」
- 科技大事件:新苹果手表可通过击掌或握手来传递信息
- 你的百万级上下文窗口大模型,可能并没有你想象中那么强
- DApp 开发中的安全测试(软件测试过程中安全测试的具体应用场景和测试思路)
- 盘点Java中最没用的知识⑧:这3个过时套路,你还在代码里硬撑?
- 机房硬件设备及Oracle数据库软件维护服务项目竞争性磋商公告
- 微软与甲骨文扩大合作关系,推出Oracle Database@Azure
- JPA实体类注解,看这篇就全会了(java实体类注解)
- Java反射机制最全详解(图文全面总结)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)