Java
以前定义类都是用class关键词,但从Java 16开始,将多一个关键词record,它也可以用来定义类。
这个record关键词的引入,主要是为了提供一种更为简洁、紧凑的final类的定义方式。下面就来具体了解record类的细节。

声明record

声明record类的基础语法:

  1. record range(int start, int end){}

class类可以在单独文件中生命,也可以在其他类中申明。那么record类也一样,它有这几种申明方式:

单独文件申明

  1. public record range(int start, int end){}

在类内部申明

  1. public class DidispaceTest {
  2. public record range(int start, int end){}
  3. }

函数内申明

  1. public class DidispaceTest {
  2. public void test() {
  3. public record range(int start, int end){}
  4. }
  5. }

record类详解

在知道了如何申明之后,一定会想用record申明的就那么点元素,它到底会具备什么能力呢?
因为record关键词申明类主要是为了简化一些类的申明,所以它本质就是一类特殊的class,或者说是某一个模版的class。
record申明的类,具备这些特点:

  1. 它是一个final
  2. 自动实现equalshashCodetoString函数
  3. 成员变量均为public属性

所以,对于之前写的range类,它等价于一个这样的类:

  1. public final class range{
  2. final int start;
  3. final int end;
  4. public range(int start, int end) {
  5. this.start = start;
  6. this.end = end;
  7. }
  8. @Override
  9. public boolean equals(Object o) {
  10. if (this == o) return true;
  11. if (o == null || getClass() != o.getClass()) return false;
  12. range range = (range) o;
  13. return start == range.start && end == range.end;
  14. }
  15. @Override
  16. public int hashCode() {
  17. return Objects.hash(start, end);
  18. }
  19. @Override
  20. public String toString() {
  21. return "range{" +
  22. "start=" + x +
  23. ", end=" + y +
  24. '}';
  25. }
  26. public int start(){
  27. return start;
  28. }
  29. public int end(){
  30. return end;
  31. }
  32. }

因为一些函数是隐藏的,在range定义的时候,看不到,所以可以尝试写这样一段测试代码来验证一下:

  1. @Test
  2. public void test() {
  3. range r = new range(100, 200);
  4. log.info(r.toString());
  5. range r2 = new range(100, 200);
  6. log.info(String.valueOf(r.equals(r2)));
  7. }

定义成员函数

因为record申明的本质也是类,那么定义成员函数肯定也是可以的。
比如,可以这样在record类中定义成员函数:

  1. record range(int start, int end){
  2. int distance(){
  3. return end - start;
  4. }
  5. }

然后,就可以这样调用它:

  1. range r = new range(100, 200);
  2. r.distance();