Java注解属性默认值需用default关键字指定编译期常量,支持基本类型、String、枚举、注解及对应数组;不可为null或运行时表达式;数组默认值须用{}包裹。

在 Java 中定义带默认值的注解属性,只需在属性声明后用 default 关键字指定默认值即可。这个值必须是编译期常量,且类型需与属性声明一致。
语法格式:使用 default 指定常量值
注解属性的默认值必须是编译时常量,支持的类型包括:
- 基本类型(int、boolean 等)
- 字符串(String)
- 枚举类型(该枚举类已存在)
- 注解类型(另一个已定义的注解)
- 以上类型的数组(如 String[]、Class>[])
示例:
@interface MyAnnotation {
String value() default "default-value";
int count() default 1;
boolean active() default true;
ElementType type() default ElementType.METHOD;
Class<?> clazz() default Object.class;
String[] tags() default {"none"};
}
注意事项:默认值不能是 null 或运行时表达式
以下写法是非法的:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- String name() default null; ❌(引用类型默认值不能为 null,除非显式允许——但注解不支持)
- int now() default System.currentTimeMillis(); ❌(不是编译期常量)
-
List
list() default new ArrayList(); ❌(非编译时常量,且类型不匹配)
若希望表示“未设置”,可约定用空字符串、-1、特殊枚举值(如 UNSPECIFIED)或空数组代替。
省略有默认值的属性:使用注解时可跳过
当注解属性有默认值,使用该注解时可不显式赋值:
@MyAnnotation(value = "hello") // count、active、type 等均取默认值
public void doSomething() { }
甚至全部省略(只要所有属性都有默认值):
@MyAnnotation // 合法,所有属性走默认值
public void doOther() { }
数组类型默认值:必须用大括号包裹
即使是单元素数组,也必须用 {} 包裹:
- ✅ String[] roles() default {"USER"};
- ✅ Class>[] groups() default {};(空数组)
- ❌ String[] names() default "admin";(类型不匹配,缺少花括号)

















