如何理解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]
分析:
- getName方法变成了name,但是功能一样的,只是命名方式变了
- 因为是不可变数据类型,没有set方法
- 自动toString,虽然最后结果不一样,但是可以正常看,不是
com.czcode.customer.User@b66c70b0
这种玩意了 - 自动实现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,构造方法等),同时给你增加了一定限制条件(无法设置某个属性的值)。
有什么问题欢迎沟通学习~