Java中除了class之外,你还知道这个定义类的关键词吗?

公众号程序猿DD

共 2474字,需浏览 5分钟

 ·

2022-05-11 00:52

大家好,我是DD,已经是封闭在家的第52天了!

抑郁之余,继续分享干货!原创不易,文末帮忙点赞、再看、转发支持一下哦~

以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类。

这个record关键词的引入,主要是为了提供一种更为简洁、紧凑的final类的定义方式。下面就来具体了解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(100200);
  log.info(r.toString());

  range r2 = new range(100200);
  log.info(String.valueOf(r.equals(r2)));
}

定义成员函数

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

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

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

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

range r = new range(100200);
r.distance();

如果你还想了解更多关于Java新特性的内容的话,我正在连载一个免费的Java新特性专栏:https://www.didispace.com/java-features/,文档形式看Java新特性,阅读学习体验更佳哦!

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取

推荐阅读

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

点击领取2022最新10000T学习资料
浏览 38
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报