Java新秀登场:深入了解Record类型

简介: Java新秀登场:深入了解Record类型

Java 16 新增了一项非常酷炫的特性,那就是 Record(记录)。

Record 可以让我们更方便地定义类,它简化了代码,并提供了类似于数据传输对象(DTO)和值对象(VO)的功能。在本文中,我将深入介绍 Java Record 的各种使用方法、使用场景、优点、缺点和注意事项。

简介

Record 是一个新的类声明,它结合了 final 类和不可变类型的特征。与普通类不同,Record 类不能扩展其他类,并且其成员变量默认为 final 和私有的,不允许对它们进行修改,这也意味着 Record 类不能有 setter 方法。Record 的状态是不可变的,而且是公共可读。

下面是一个简单的 Record 示例:

public record Person(String name, int age) {}

这个示例定义了一个名为 Person 的 Record 类,它有两个实例字段:name 和 age。

使用方法

Record 类提供了多种使用方法,以下是一些常用的方法:

创建 Record 类

我们可以使用 record 关键字创建 Record 类,定义方式与普通类类似。例如:

public record Person(String name, int age) {}

这个类有一个构造器,这种可以自动定义地设置所有实例字段的构造器称为 标准构造器。实现标准构造器的时候可以使用一种简洁的形式,即不需要制定参数列表。

Person(String name, int age)
record Person(String name, int age, String era) {
    Person {
        if (age > 0 && age <= 10) {
            era = "小孩";
        } else if (age > 10 && age <= 20) {
            era = "少年";
        } else if (age > 20 && age <= 30) {
            era = "青年";
        } else {
            era = "中年";
        }
    }
}
public static void main(String[] args) {
    Person person = new Person("张三", 20, "");
    System.out.println(person.era);
}

除了标准构造器,还可以定义自定义构造器,不过这种构造器的第一个语句必须调用另一个构造器。

创建对象

与普通类一样,我们可以使用 new 关键字创建 Record 对象。

Person person = new Person("Tom", 20);

访问实例字段

上面定义的记录会自动定义以下访问器方法:

public String name();
public int age();

注意,这些访问器方法名是 name 和 age,而不是 getName 和 getAge。

自动化生成方法

除了构造器、访问器方法,每个记录有三个自动定义的方法:toString、equals、hashCode。我们可以使用 @Override 注解重写这些方法。

record Person(String name, int age) {
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

自定义方法

record Person(String name, int age) {
    public String hello(String friend) {
        return "hello %s, my name is %s".formatted(friend, name);
    }
}
public static void main(String[] args) {
    Person person = new Person("张三", 23);
    System.out.println(person.hello("李四"));
}

静态字段和静态方法

record Person(String name, int age) {
    public static String LOCATION = "北京";
    public static String location() {
        return "location is %s".formatted(LOCATION);
    }
}
public static void main(String[] args) {
    System.out.println(Person.LOCATION);
    System.out.println(Person.location());
}

注意,不能为记录添加实例字段,比如下面的写法就是错误的!

record Person(String name, int age) {
  private String sex;
}

使用场景

Record 类主要用于简单数据类型和值类型的表示,适合于以下场景:

  • DTO 和 VO 对象:Record 类可以用于表示数据传输对象(DTO)和值对象(VO)。
  • 数据库实体类:Record 类还可以用于表示数据库实体类。
  • 不可变对象:由于 Record 类的成员变量是 final 的,我们无法修改它们的值,因此适合用于不可变对象。

优点

  • 简化代码:Record 类减少了冗余代码,使代码更加简洁明了。
  • 提高可读性:Record 类可以让代码更易读,因为它提供了自动生成的方法和清晰的语法。
  • 更安全:由于 Record 类的成员变量是 final 的,它们不能被修改,从而提高了代码的安全性。

缺点

  • 不支持继承:与普通类不同,Record 类不能扩展其他类,这可能限制。不过 Record 类可以实现接口。
相关文章
|
9月前
|
安全 Java 开发者
Java Record:简化数据载体的新选择
Java Record:简化数据载体的新选择
374 101
|
10月前
|
安全 Java 编译器
Java类型提升与类型转换详解
本文详解Java中的类型提升与类型转换机制,涵盖类型提升规则、自动类型转换(隐式转换)和强制类型转换(显式转换)的使用场景与注意事项。内容包括类型提升在表达式运算中的作用、自动转换的类型兼容性规则,以及强制转换可能引发的数据丢失和运行时错误。同时提供多个代码示例,帮助理解byte、short、char等类型在运算时的自动提升行为,以及浮点数和整型之间的转换技巧。最后总结了类型转换的最佳实践,如避免不必要的转换、使用显式转换提高可读性、金融计算中使用BigDecimal等,帮助开发者写出更安全、高效的Java代码。
564 0
|
10月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
651 143
|
10月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
3669 102
|
8月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
225 7
|
9月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
331 3
|
10月前
|
安全 算法 Java
Java泛型编程:类型安全与擦除机制
Java泛型详解:从基础语法到类型擦除机制,深入解析通配符与PECS原则,探讨运行时类型获取技巧及最佳实践,助你掌握泛型精髓,写出更安全、灵活的代码。
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
919 113
|
存储 传感器 缓存
java变量与数据类型:整型、浮点型与字符类型
### Java数据类型全景表简介 本文详细介绍了Java的基本数据类型和引用数据类型,涵盖每种类型的存储空间、默认值、取值范围及使用场景。特别强调了`byte`、`int`、`long`、`float`、`double`等基本类型在不同应用场景中的选择与优化,如文件流处理、金融计算等。引用数据类型部分则解析了`String`、数组、类对象、接口和枚举的内存分配机制。
588 15