Mushroom Notes Mushroom Notes
🍄首页
  • JavaSE

    • 基础篇
    • 数据结构
    • IO流
    • Stream流
    • 函数式接口
    • JUC
    • 反射
    • 网络编程
    • 设计模式
  • JavaEE

    • Servlet
    • JDBC
    • 会话技术
    • 过滤器监听器
    • 三层架构
  • JDK

    • 总览
  • JVM

    • 总览
  • 常用mate
  • CSS
  • JavaScript
  • rds 数据库

    • MySQL
    • MySQL 进阶
    • MySQL 库表规范
  • nosql 数据库

    • Redis
    • Redis 进阶
    • Redis 底层
    • MongoDB
  • Spring生态

    • Spring
    • Spring MVC
    • Spring boot
    • Spring Validation
  • Spring Cloud生态

    • Spring Cloud
    • 服务治理
    • 远程调用
    • 网关路由
    • 服务保护
    • 分布式事务
    • 消息中间件
  • 数据库

    • Mybatis
    • Mybatis Plus
    • Elasticsearch
    • Redisson
  • 通信

    • Netty
📚技术
  • 方案专题
  • 算法专题
  • BUG专题
  • 安装专题
  • 网安专题
  • 面试专题
  • 常用网站
  • 后端常用
  • 前端常用
  • 分类
  • 标签
  • 归档

kinoko

一位兴趣使然的热心码农
🍄首页
  • JavaSE

    • 基础篇
    • 数据结构
    • IO流
    • Stream流
    • 函数式接口
    • JUC
    • 反射
    • 网络编程
    • 设计模式
  • JavaEE

    • Servlet
    • JDBC
    • 会话技术
    • 过滤器监听器
    • 三层架构
  • JDK

    • 总览
  • JVM

    • 总览
  • 常用mate
  • CSS
  • JavaScript
  • rds 数据库

    • MySQL
    • MySQL 进阶
    • MySQL 库表规范
  • nosql 数据库

    • Redis
    • Redis 进阶
    • Redis 底层
    • MongoDB
  • Spring生态

    • Spring
    • Spring MVC
    • Spring boot
    • Spring Validation
  • Spring Cloud生态

    • Spring Cloud
    • 服务治理
    • 远程调用
    • 网关路由
    • 服务保护
    • 分布式事务
    • 消息中间件
  • 数据库

    • Mybatis
    • Mybatis Plus
    • Elasticsearch
    • Redisson
  • 通信

    • Netty
📚技术
  • 方案专题
  • 算法专题
  • BUG专题
  • 安装专题
  • 网安专题
  • 面试专题
  • 常用网站
  • 后端常用
  • 前端常用
  • 分类
  • 标签
  • 归档
  • JavaSE

  • JavaEE

  • JDK版本特性

    • 总览
    • Java8

    • Java 17

      • java 17 - 增强型伪随机数生成器
      • java 17 - 增强 switch表达式
      • java 17 - 文本块优化
      • java 17 - 日期周期&数字格式化
      • java 17 - 密封类 sealed class
      • java 17 - ZGC 的改进
      • java 17 - record 关键字
        • 示例
        • class与record的区别
      • java 17 - instanceof模式匹配
      • java 17 - HTTP 客户端改进
    • Java 21

  • JVM

  • Java
  • JDK版本特性
  • Java 17
kinoko
2024-01-11
目录

java 17 - record 关键字


record关键字用于创建不可变数据类,通常用于函数式编程或数据建模,用来定义不可变的数据结构,其中包含一组字段(fields)或属性,用于解决临时创建数据容器的场景。

# 示例


平时我们如果需要临时做一个数据容器,就得去创建一个类,定义属性,生成getset、toString之类方法,或者是用@lombok来简化,比如:
创建Class

class User {
    private String name;
    private int age;
    
    // getset...
}
1
2
3
4
5
6

在代码块中创建对象

public static void main(String[] args) {
    User user1 = new User("张三", 18);
    System.out.println(user1);
}
1
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

打印

User{name='张三', age=18}
true
UserRecord[name=李四, age=20]
true
1
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

打印

User{name='张三', age=18}
true
调用构造函数传入name:李四,age:20
调用构造函数传入name:李四,age:20
调用静态方法
name:李四,age:20
李四 20
true
1
2
3
4
5
6
7
8

尝试设值的结果
image.png
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

# class与record的区别


class关键字和 record关键字的区别在于它们在编程语言中的用途和语义。以下是它们的一些主要区别:

  1. 用途:
  • class通常用于面向对象编程,用来创建具有属性和方法的对象。它可以被继承和实例化。
  • record通常用于函数式编程或数据建模,用来定义不可变的数据结构,其中包含一组字段(fields)或属性。
  1. 不可变性:
  • 在一些编程语言中,record创建的数据结构通常是不可变的,这意味着一旦创建,其字段的值就不能被修改。而在一些情况下,class创建的对象可以是可变的,允许对其属性进行修改。
  1. 继承与多态:
  • class可以通过继承和多态来实现代码重用和扩展。子类可以继承父类的属性和方法,并且可以根据需要进行重写或扩展。
  • record通常不支持继承,因为它的设计目的是为了表示不可变的数据结构,而不是作为可扩展的类。

总之,class 和 record 是用于不同编程范式和场景的关键字,开发人员应该根据具体的需求和编程语言的特性来选择使用哪种关键字来定义自定义类型。

#java#jdk17
上次更新: 2024/01/11 17:06:16
java 17 - ZGC 的改进
java 17 - instanceof模式匹配

← java 17 - ZGC 的改进 java 17 - instanceof模式匹配→

最近更新
01
JVM 底层
09-13
02
JVM 理论
09-13
03
JVM 应用
09-13
更多文章>
Theme by Vdoing | Copyright © 2022-2024 kinoko | MIT License | 粤ICP备2024165634号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式