java 17 - record 关键字
record关键字用于创建不可变数据类,通常用于函数式编程或数据建模,用来定义不可变的数据结构,其中包含一组字段(fields)或属性,用于解决临时创建数据容器的场景。
# 示例
平时我们如果需要临时做一个数据容器,就得去创建一个类,定义属性,生成getset、toString之类方法,或者是用@lombok来简化,比如:
创建Class
class User {
private String name;
private int age;
// getset...
}
1
2
3
4
5
6
2
3
4
5
6
在代码块中创建对象
public static void main(String[] args) {
User user1 = new User("张三", 18);
System.out.println(user1);
}
1
2
3
4
2
3
4
很繁琐,有了record关键字就可以做这样的操作:
public static void main(String[] args) {
User user1 = new User("张三", 18);
User user2 = new User("张三", 18);
System.out.println(user1);
System.out.println(user1.equals(user2));
record UserRecord(String name, int age){}
UserRecord userRecord1 = new UserRecord("李四", 20);
UserRecord userRecord2 = new UserRecord("李四", 20);
System.out.println(userRecord1);
System.out.println(userRecord1.equals(userRecord2));
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
打印
User{name='张三', age=18}
true
UserRecord[name=李四, age=20]
true
1
2
3
4
2
3
4
也可以定义私有方法和静态方法构造方法等,但是设值只能通过构造方法设值,获取值的方法是属性名()
public static void main(String[] args) {
User user1 = new User("张三", 18);
User user2 = new User("张三", 18);
System.out.println(user1);
System.out.println(user1.equals(user2));
record UserRecord(String name, int age){
UserRecord(String name, int age){
// 注意这里必须调用传参赋值
this.name = name;
this.age = age;
System.out.println("调用构造函数传入name:" + name + ",age:" + age);
}
private void print(){
System.out.println("name:" + name + ",age:" + age);
}
public static void test() {
System.out.println("调用静态方法");
}
}
UserRecord userRecord1 = new UserRecord("李四", 20);
UserRecord userRecord2 = new UserRecord("李四", 20);
UserRecord.test();
userRecord1.print();
// 获取属性
System.out.println(userRecord1.name() + " " + userRecord1.age());
System.out.println(userRecord1.equals(userRecord2));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
打印
User{name='张三', age=18}
true
调用构造函数传入name:李四,age:20
调用构造函数传入name:李四,age:20
调用静态方法
name:李四,age:20
李四 20
true
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
尝试设值的结果
record也可以单独作为文件声明
public record UserRecord(String name, int age) {
public UserRecord(String name, int age){
// 注意这里必须调用传参赋值
this.name = name;
this.age = age;
System.out.println("调用构造函数传入name:" + name + ",age:" + age);
}
private void print(){
System.out.println("name:" + name + ",age:" + age);
}
public static void test() {
System.out.println("调用静态方法");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# class与record的区别
class关键字和 record关键字的区别在于它们在编程语言中的用途和语义。以下是它们的一些主要区别:
- 用途:
class通常用于面向对象编程,用来创建具有属性和方法的对象。它可以被继承和实例化。record通常用于函数式编程或数据建模,用来定义不可变的数据结构,其中包含一组字段(fields)或属性。
- 不可变性:
- 在一些编程语言中,
record创建的数据结构通常是不可变的,这意味着一旦创建,其字段的值就不能被修改。而在一些情况下,class创建的对象可以是可变的,允许对其属性进行修改。
- 继承与多态:
class可以通过继承和多态来实现代码重用和扩展。子类可以继承父类的属性和方法,并且可以根据需要进行重写或扩展。record通常不支持继承,因为它的设计目的是为了表示不可变的数据结构,而不是作为可扩展的类。
总之,class 和 record 是用于不同编程范式和场景的关键字,开发人员应该根据具体的需求和编程语言的特性来选择使用哪种关键字来定义自定义类型。
上次更新: 2024/01/11 17:06:16