java8 版本+ 新特性

record

一、Record 是什么?

Record 是 Java 16 正式引入的一种特殊的类类型,专门用于透明地承载不可变数据。它用一行代码替代了传统 Java 类中大量的样板代码。

// 一行代码搞定一切
public record UserRecord (String username, int age, String email) {
}
// 等价的传统类需要 60-80 行代码
import java.util.Objects;

public final class UserRecord extends java.lang.Record {
    private final String username;
    private final int age;
    private final String email;

    // 构造器
    public UserRecord(String username, int age, String email) {
        this.username = username;
        this.age = age;
        this.email = email;
    }

    // 访问器(注意:没有 get 前缀)
    public String username() {
        return username;
    }

    public int age() {
        return age;
    }

    public String email() {
        return email;
    }

    // toString() - 自动生成
    @Override
    public String toString() {
        return "UserRecord[username=" + username + ", age=" + age + ", email=" + email + "]";
    }

    // hashCode() - 自动生成
    @Override
    public int hashCode() {
        return Objects.hash(username, age, email);
    }

    // equals() - 自动生成
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        UserRecord that = (UserRecord) obj;
        return age == that.age &&
               Objects.equals(username, that.username) &&
               Objects.equals(email, that.email);
    }
}

二、Record 的核心特性

1. 自动生成的方法

方法生成规则示例(UserRecord)
构造器全参数构造器,参数顺序与声明一致new UserRecord("张三", 25, "zhangsan@example.com")
访问器与字段同名,没有 get 前缀user.username()user.age()
toString()格式:类名[字段1=值1, 字段2=值2, ...]UserRecord[username=张三, age=25, email=zhangsan@example.com]
hashCode()基于所有字段计算Objects.hash(username, age, email)
equals()比较所有字段的值所有字段相等才返回 true

2. 不可变性

  • 所有字段都是 private final
  • 对象一旦创建,字段值不可修改
  • 天然线程安全,适合函数式编程

3. 继承限制

  • Record 是 final 类,不能被继承
  • 所有 Record 都隐式继承自 java.lang.Record

4. 类级别特性

特性支持情况
实现接口✅ 可以
继承类❌ 不能(已经是 final)
泛型✅ 支持
静态字段/方法✅ 支持
实例方法✅ 支持(自定义)
注解✅ 支持(可传播到字段/访问器)

5. 用法

(1)带校验的构造器(紧凑构造器)
public record UserRecord (String username, int age, String email) {
    // 紧凑构造器:编译后,会自动把逻辑加在标准全参数构造器的逻辑前面执行
    public UserRecord{
        if (age < 0) {
            throw new IllegalArgumentException("年龄不能为负数");
        }
        if (username == null || username.trim().isEmpty()) {
            throw new IllegalArgumentException("姓名不能为空");
        }
        // 可以规范化参数
        email = email.substring(0);
    }
}
(2)自定义构造器
public record UserRecord (String username, int age, String email) {
    // 紧凑构造器:在标准构造器执行前介入
    public UserRecord{
        if (age < 0) {
            throw new IllegalArgumentException("年龄不能为负数");
        }
        if (username == null || username.trim().isEmpty()) {
            throw new IllegalArgumentException("姓名不能为空");
        }
        // 可以规范化参数
        email = email.substring(0);
    }
    // 自定义单参数构造器:必须显式调用主构造器,并且所有属性必须初始化
    public UserRecord(String username) {
        this(username, 0,"abc@qq.com");
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值