如何理解java中的record类

如何理解java中的record类

背景

java14才出来的record,类似于enum,定义了一种特殊的类。

用于标记不可变的数据类。

正常写法

定义一个用户类,一般会这么定义

//User.class
public class User {
    private String name = null;
    private String password = null;

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }


    public String getPassword() {
        return password;
    }

    @Override
    public boolean equals(Object o) {
        //用于判断是否相等
        if (this == o) return true;
        if (!(o instanceof User)) return false;
        User user = (User) o;
        return name.equals(user.name) && password.equals(user.password);
    }

    @Override
    public int hashCode() {
        //hash算法
        return Objects.hash(name, password);
    }

    @Override
    public String toString() {
        return "user{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

写个程序验证一下

public class test {
    public static void main(String[] args) {
        User1 user = new User1("XiaoMing", "123456");
        User1 user2 = new User1("XiaoMing", "123456");

        System.out.println(user.name());
        System.out.println(user.password());
        System.out.println(user);
        System.out.println(user.equals(user2));
    }
}

输出

XiaoMing
123456
User1[name=XiaoMing, password=123456]
true

使用record

完成与上面相同的类,使用record,需要怎么写呢?

只用一行:

public record User1(String name,String password) {}

写个程序测试一下:

public class test {
    public static void main(String[] args) {
        User1 user = new User1("XiaoMing", "123456");

        System.out.println(user.name());
        System.out.println(user.password());
        System.out.println(user);
    }
}

输出:

XiaoMing
123456
User1[name=XiaoMing, password=123456]

分析:

  1. getName方法变成了name,但是功能一样的,只是命名方式变了
  2. 因为是不可变数据类型,没有set方法
  3. 自动toString,虽然最后结果不一样,但是可以正常看,不是com.czcode.customer.User@b66c70b0这种玩意了
  4. 自动实现equals,如果不覆盖这个方法,两个对象比较时候会比较指向的对象是不是同一个对象,这个只是比了里面的值是否相等。

总结:

这种类其实就是帮你写好了样例代码

继续进阶一下

record中可以覆盖构造方法、创建静态方法、定义自己的方法

看代码

public record User1(String name, String password) {
   	//再定义一个构造方法
    public User1(String name) {
        this(name, null);
    }
	
    //额外定义的方法
    public String nameToUppercase() {
        return this.name.toUpperCase();
    }
	
    //静态方法
    public static String nameAddPassword(User1 user1) {
        return user1.name + user1.password;
    }
}

测试代码

public class test {
    public static void main(String[] args) {
        User1 user = new User1("XiaoMing", "123456");

        System.out.println(user.nameToUppercase());
        System.out.println(User1.nameAddPassword(user));

        User1 userAnotherConstructor = new User1("hello");
        System.out.println(userAnotherConstructor);
    }
}

输出

XIAOMING
XiaoMing123456
User1[name=hello, password=null]

总结

这个关键字其实就相当于替你创建了一些样例代码(toSting,构造方法等),同时给你增加了一定限制条件(无法设置某个属性的值)。

有什么问题欢迎沟通学习~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值