【JDK 16】Record

70 阅读2分钟

Record


关键字

record\color{blue}{record}

作用

可提供属性只读的实例


特点

1、提供接收所有属性的构造器
2、自带getter方法,无setter方法,更不能修改实例属性
3、是final类
4、自动重写toString、equals和 hashCode方法`


定义使用

定义

record 类名 (T1 t1 , T2 t2 , T3 t3) {  //逻辑代码 }

 record User (String id , String name , int age ){ //逻辑代码 }

使用

User user = new User("10010", "码鹿鸭", -99);
String name = user.name();
int age = user.age();

System.out.println(user.toString());
//打印: User[id=10010, name=码鹿鸭, age=-99]

特殊构造器

public 类名{ //逻辑代码 }

特殊构造器可以对参数进行限制或处理( 注意这里没有放参数的小括号)

比如年龄不可能少于0,我们可以使用特殊构造器进行限制

public record User (String id , String name , int age ){
    public User{
        if(age < 0) throw new RuntimeException("年龄小于0");
    }
}
new User("10010", "码鹿鸭", -99);

此时创建年龄小于0就会报异常

Exception in thread "main" java.lang.RuntimeException: 年龄小于0

如果需要对参数进行处理,可以使用特殊构造器处理

public record User (String id , String name , int age ){
    public User{
        id = "0x" + id;
    }
}

此时属性可以修改,id 变成 0x10010 

System.out.println(new User("10010", "码鹿鸭", 18).id());
//打印: 0x10010

创建实例完毕后,属性就不可修改了


定义方法

可以像其他类一样自定义方法,但不能修改实例属性

public record User (String id , String name , int age ){
    public void introduceMyself(){
        System.out.println("我的名字是" + name + ",年龄" + age);
    }
}
user.introduceMyself();
//打印:我的名字是码鹿鸭,年龄18

定义变量

只能定义静态变量,Record类大括号内不能定义实例变量

public record User (String id , String name , int age ){
    public static String 静态变量;
}