• Java 16 新特性:record类


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

    下面就来具体了解record类的细节。配套视频教程:Java 16 新特性:使用record声明类

    声明record类

    声明record类的基础语法:

    record range(int start, int end){}
    

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

    1. 单独文件申明:
    public record range(int start, int end){}
    
    1. 在类内部申明:
    public class DidispaceTest {
        public record range(int start, int end){}
    }
    
    1. 函数内申明:
    public class DidispaceTest {
      public void test() {
        public record range(int start, int end){}
      }
    }
    

    record类详解

    在知道了如何申明之后,你一定会想用record申明的就那么点元素,它到底会具备什么能力呢?

    因为record关键词申明类主要是为了简化一些类的申明,所以它本质就是一类特殊的class,或者说是某一个模版的class。

    record申明的类,具备这些特点:

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

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

    public final class range{
        final int start;
        final int end;
    
        public range(int start, int end) {
            this.start = start;
            this.end = end;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            range range = (range) o;
            return start == range.start && end == range.end;
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(start, end);
        }
    
        @Override
        public String toString() {
            return "range{" +
                    "start=" + x +
                    ", end=" + y +
                    '}';
        }
    
        public int start(){
            return start;
        }
    
        public int end(){
            return end;
        }
    }
    

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

    @Test
    public void test() {
      range r = new range(100, 200);
      log.info(r.toString());
    
      range r2 = new range(100, 200);
      log.info(String.valueOf(r.equals(r2)));
    }
    

    定义成员函数

    因为record申明的本质也是类,那么定义成员函数肯定也是可以的。

    比如,我们可以这样在record类中定义成员函数:

    record range(int start, int end){
      int distance(){
        return end - start;
      }
    }
    

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

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

    如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!另外,不要走开,关注我,持续更新Java新特性专栏

    欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

  • 相关阅读:
    语音和噪声相关数据集(持续更新)
    在gstreamer中做线程同步
    《Vue.js+Spring Boot全栈开发实战》简介
    量化INT8模型报错记录及解决方案
    驱动开发:内核监控进程与线程回调
    Python 网络请求模块 urllib 、requests详解
    节点电价形成机制
    计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉
    Android xml布局设置默认隐藏&&通讯
    [Kettle] Excel输入
  • 原文地址:https://www.cnblogs.com/didispace/p/16263870.html