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 类可以实现接口。
相关文章
|
1月前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
76 2
|
1月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList&lt;Integer&gt;` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
46 2
|
2月前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
260 5
|
2月前
|
设计模式 Java
Java“不能转换的类型”解决
在Java编程中,“不能转换的类型”错误通常出现在尝试将一个对象强制转换为不兼容的类型时。解决此问题的方法包括确保类型间存在继承关系、使用泛型或适当的设计模式来避免不安全的类型转换。
301 7
|
2月前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
2月前
|
安全 Java
Java“不兼容类型” 错误怎么查找解决
在 Java 中遇到“不兼容类型”错误时,首先理解错误信息,它表明试图将一种类型赋给不兼容的类型。检查代码中类型不匹配的赋值、方法调用参数类型不匹配、表达式类型不兼容及泛型类型不匹配等问题。解决方法包括进行类型转换、修改代码逻辑、检查方法参数和返回类型以及处理泛型类型不匹配。通过这些步骤,可以有效解决“不兼容类型”错误,确保代码类型兼容性良好。
509 9
|
3月前
|
存储 Java Windows
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java中的char类型可以存储一个中文字符,因为它占用两个字节。转义字符允许在代码中使用特殊字符,例如`\n`表示换行,`\t`表示制表符,`\\`表示反斜杠,`\'`表示单引号,`\"`表示双引号。可以使用`\u`后跟Unicode编码来表示特定的字符。
82 2
java基础(9)数据类型中的char类型以及涉及到的转义字符
|
2月前
|
Java 程序员 编译器
Java中的异常类型
Java中的异常类型
25 3
|
2月前
|
Java 开发者
Java“类 Y 中的方法 X 不能应用于给定类型”解决
在Java中遇到“类Y中的方法X无法应用于给定类型”的错误时,通常是因为方法调用时的参数类型与定义不符。解决此问题需检查方法签名,确保传递的参数类型正确无误,或使用显式类型转换以匹配方法所需的参数类型。这种错误提示帮助开发者及时修正类型不匹配的问题。
121 1