Java 默认值分为两大类:JVM 自动默认值、程序员手动设置默认值(含注解)。
开发中绝不依赖 JVM 默认值,全部手动显式赋值。
一、JVM 自动默认值(仅成员变量有效)
局部变量没有默认值,必须手动赋值,否则编译报错。
java
public class Demo {
// 基本类型
byte b; // 0
short s; // 0
int i; // 0
long l; // 0L
float f; // 0.0f
double d; // 0.0
boolean bl; // false
char c; // 空字符 '\u0000'
// 引用类型
String str; // null
Object obj; // null
List list; // null
}
二、手动设置默认值(Java 原生 5 种)
方式1:字段直接赋值(开发最常用 ⭐⭐⭐⭐⭐)
适用:DO、DTO、VO 所有固定默认字段
java
public class User {
private Integer status = 1; // 默认正常
private Integer deleted = 0; // 默认未删除
private String type = ""; // 字符串空串防空指针
private List<Long> ids = new ArrayList<>(); // 集合永远不空
}
方式2:构造方法赋值
适用:需要根据参数动态赋默认值
java
public class User {
private Integer age;
public User() {
this.age = 18; // 无参构造默认18
}
public User(Integer age) {
// 传空则给默认值
this.age = age == null ? 18 : age;
}
}
方式3:实例代码块赋值
构造执行前统一初始化,适合多构造复用默认逻辑
java
public class User {
private Integer pageSize;
{
pageSize = 10;
}
}
方式4:静态代码块(只给 static 变量赋值)
java
public class Constant {
public static int DEFAULT_PAGE;
static {
DEFAULT_PAGE = 10;
}
}
方式5:取值兜底默认(Optional / 三目)
适用:接口接收数据、数据库查询数据为空兜底
java
// 1. 三目运算
String name = username == null ? "匿名用户" : username;
// 2. Optional(企业主流写法)
String name = Optional.ofNullable(username).orElse("匿名用户");
Integer count = Optional.ofNullable(num).orElse(0);
三、Spring 注解默认值(面试+开发重点)
方式1:@RequestParam 接口参数默认值
前端不传参数,自动使用默认值
java
@GetMapping("/list")
public Result list(
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize
){
// 不传就是 1、10
}
方式2:@Value 配置文件默认值
配置文件没有该配置时,使用默认值
java
// 格式 ${key:默认值}
@Value("${upload.max:10240}")
private Long maxSize;
方式3:@ConfigurationProperties 配置类默认值
直接字段赋值即为默认,无需注解
java
@ConfigurationProperties(prefix = "sms")
public class SmsConfig {
// 配置文件不写,默认就是5
private Integer expire = 5;
}
方式4:@RequestHeader 请求头默认值
java
@GetMapping("/test")
public Result test(
@RequestHeader(value = "token", defaultValue = "default-token") String token
){
}
四、Lombok 专属默认值(超级常用)
重点坑点:使用 @Builder 必须加 @Builder.Default,否则默认值失效
java
@Data
@Builder
public class User {
@Builder.Default
private Integer status = 1;
@Builder.Default
private String name = "匿名用户";
@Builder.Default
private List<String> list = new ArrayList<>();
}
// 使用
User user = User.builder().build(); // 全部默认值生效
五、MyBatis 数据库自动填充默认值
新增时自动赋值,用于创建时间、修改时间、删除标识
java
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Integer deleted = 0;
六、数据库层默认值(最终兜底)
sql
CREATE TABLE user(
status INT DEFAULT 1,
deleted TINYINT DEFAULT 0,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
七、默认值执行优先级(必背)
静态代码块 > 字段直接赋值 > 实例代码块 > 构造方法
后面的会覆盖前面的默认值
八、企业开发统一规范(终极总结)
- DO/VO/DTO 固定默认:字段直接赋值
- 集合类型:必须 new 空集合,禁止 null
- 接口入参默认:@RequestParam(defaultValue)
- 配置参数默认:@Value("key:默认值")
- 空数据兜底:Optional.orElse()
- Builder 模式:必须加 @Builder.Default
- 数据库兜底:字段 DEFAULT 默认值