java注解属性默认值必须是编译期常量,支持基本类型、string、class、枚举、注解及对应数组;不可为null(推荐用空字符串等语义值代替)或运行时表达式,数组默认值用{}包裹。

Java 自定义注解中,通过合理设置属性的默认值,可以让调用方在使用注解时省略不关心的参数,从而大幅简化配置写法,提升可读性和易用性。
默认值必须是编译期常量
注解属性的默认值只能是编译时常量:基本类型、String、Class、枚举、注解类型,或上述类型的数组。不能是 null(除非显式声明为 default null),也不能是运行时计算的表达式或对象实例。
- ✅ 正确:
@interface Loggable { String value() default "INFO"; int level() default 1; Class> handler() default DefaultHandler.class; } - ❌ 错误:
String msg() default new Date().toString();(非编译期常量) - ⚠️ 注意:
String[] tags() default {};是合法空数组,默认值可直接写成default {}或default {""}
用空字符串或占位符代替 null
避免让调用方传 null,而是用语义明确的默认值(如空字符串、特殊标记名)来表示“未指定”。这样既安全,又便于后续逻辑判断。
- 推荐:
String prefix() default "";→ 使用时可直接忽略该属性 - 不推荐:
String prefix() default null;→ 调用方若不传,运行时可能触发 NPE - 进阶技巧:用特殊字符串如
"__AUTO__"表示自动推导,处理逻辑中再做分支判断
布尔属性优先设为 false
布尔型属性默认值建议设为 false,符合“最小权限”和“显式开启”的设计直觉。调用方只需在需要时显式启用,避免误开启副作用。
- 例如:
boolean async() default false;→ 大多数场景同步执行即可 - 而
boolean required() default true;也常见,但需确保语义清晰(如校验注解中“必填”是常态) - 避免歧义:不要用
enabled()却默认true,除非该功能默认必须生效
组合常用配置为“快捷属性”
把高频组合抽象成一个简化的属性名,背后由处理器统一映射。比如用 mode() 枚举替代多个开关属性。
- 冗余写法:
@Cacheable(readonly = true, sync = false, expire = 300) - 优化后:
@Cacheable(mode = CacheMode.READ_ONLY),内部按模式预设各项参数 - 实现方式:注解处理器读取
mode后,再查表获取对应readonly、sync等实际值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











