Java 14 3 月发布距现在已经发布 2 个多月,发布了很多新特性,详细的新特性介绍可以看这篇文章:

http://www.javastack.cn/article/2020/java14-has-been-released/

栈长之前也陆续分享过两篇 Java 14 的新特性:

感觉很好玩,今天再来分享一个新特性:

JEP 359: Records (Preview)

https://openjdk.java.net/jeps/359

Java 14 祭出大器啊!!!

背景介绍

我们经常听到一些对 Java 的抱怨,"Java 太冗长啰嗦了",Java 确实经常要写很多低级(low)的代码,比如: constructors, getters, equals(), hashCode(), toString() 方法等,是不是感同身受?

如果开发人员为了偷懒而省略其中的某些方法,甚至会带来问题。

基本介绍

Records 是一种新的类申明形式,和枚举类型一样,它是一种受限制的类(class)。

简单来说,Records 就是一种新的语法糖,目的还是为了简化代码,相当于 Lombok 的 @Data 注解,但又不能完全替代,现在还是个预览特性,在未来可能会有变更。

Lombok介绍及使用:

http://www.javastack.cn/article/2019/lombok-introduce/

Records 的语法是:

record Point(int x, int y) { }

用 record 修饰一个类,括号里面直接带参数,{} 里面是可选的。

到底有啥用呢?

最好理解它的方式就是实践,下面栈长通过一个示例带大家来了解下。

实践分析

怎么安装 Java 14 及环境配置这篇就不说了。

下面是一个示例:

public record Student(String name, int id, int age) {}

没错,一行搞定(public 都可以省略),就是这么简单粗暴!!!

再来看下它的类继承结构图:

我们再通过 IDEA 反编译 class 类的方式来看下它到底做了什么:

看完是不是有点 Lombok 的感觉?

1)生成的类是 final 类型的,并且继承了:java.lang.Record;

2)生成的类成员变量全是 private final 类型的;

3)自动生成了类构造器、toString()、hashCode()、equals(),以及类似 getter 的变量访问方法;

由于工具编译器的问题,上边看到的部分源代码是 /* compiled code */,我们再在 Student 类里面加入 main 方法测试下:

public record Student(String name, int id, int age) {

    public static void main(String[] args) {
Student student1 = new Student("栈长", 1001, 18);
System.out.println(student1.name());
System.out.println(student1.id());
System.out.println(student1.age()); System.out.println(student1); Student student2 = new Student("栈长", 1001, 18);
Student student3 = new Student("栈长", 1003, 18);
System.out.println(student1.equals(student2));
System.out.println(student1.equals(student3));
} }

输出结果:

栈长
1001
18
Student[name=栈长, id=1001, age=18]
true
false

从结果可以得知 toString/ equals 等生成的方法都按照特定的规则重写了,而不是使用内存地址。

可以添加成员变量吗?

不能,Records类里面不能手动加成员变量。

比如,加一个地址成员变量就编译报错了:

可以代替 Lombok 吗?

答案是:不能完全代替!

从上面的结论我们可以得知 Records 类有以下限制:

1)record 类是 final 修饰的,所以不能被其他子类继承;

2)因为 Java 类是单继承,而自身又已经继承了 Record 类,所以不能再继承其他类,但是可以实现接口;

3)成员变量也是 final 类型的,所以其值或者引用不能被更改,如果是引用类型,可以修改对象里面的值。

由于它的这些限制,想完全代替 Lombok 是不可能的,当然,不用纠结这些限制的话,某些场合是可以代替 Lombok 使用的。

总结

Java 14 Records 是一个新的语法糖,是一种 "数据载体",可以告别传统的低效的生成代码模板,现在还是预览特性,栈长我也会持续跟进,公众号第一时间推送,如果你也喜欢研究新技术,有兴趣的可以微信搜索 "Java技术栈" 关注下。

虽然现在也存在诸多限制,至少 Java 正在大步往前走,变得越来越智能、越来越简化了。

可能有些人会说,没卵用,Lombok 足已!

现在来说确实无法反驳,但是我觉得有朝一日 Java 总会干掉 Lombok,因为,Records 有十足的优势,它是 Java 自带的语法,不需要包装插件,Lombok 是团队工具,不一定都会用,你要知道,有些公司是禁止使用 Lombok 插件的。

最后,本文仅供 Java 爱好者了解、学习即可,不能用于生产,出去吹牛逼还是可以的。

有什么问题欢迎留言讨论~

推荐去我的博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

觉得不错,别忘了点赞+转发哦!

Java 14 祭出代码简化大器,Lombok 要被干掉了?的更多相关文章

  1. Java代码简化神器-Lombok

    一.背景 前段时间在开源社区中发现了一个比较牛逼的简化Java代码的神器-Lombok,接着自己写了demo进行测试和练习,感觉真的很不错,特此分享给需要的小伙伴们~ 二.开发之前的准备 1.lomb ...

  2. Java 14 发布了,可以扔掉Lombok了?

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 ...

  3. Java 8 到 Java 14,改变了哪些你写代码的方式?

    前几天,JDK 14 正式发布了,这次发布的新版本一共包含了16个新的特性. 其实,从Java8 到 Java14 ,真正的改变了程序员写代码的方式的特性并不多,我们这篇文章就来看一下都有哪些. La ...

  4. Java 14 可能带来什么新特性?

    JDK/Java 13 在一个月前已经发布,该版本带来了 5 大新特性,笔者观察到其中的 Text Blocks(文本块)特性似乎被讨论最多. 文本块特性与常见的 Python "" ...

  5. JDK/Java 14 发布

    3 月 17 日,JDK/Java 14 正式 GA. 此版本包含的 JEP(Java/JDK Enhancement Proposals,JDK 增强提案)比 Java 12 和 13 加起来的还要 ...

  6. Java 14带来了许多新功能

    本文是作者翻译自java magazine的文章,我也将回持续的关注java的最新消息,即时和大家分享.如有翻译不准确的地方,欢迎大家留言,我将第一时间修改.   Java 14包含比前两个发行版更多 ...

  7. 【机器学习实战】第14章 利用SVD简化数据

    第14章 利用SVD简化数据 SVD 概述 奇异值分解(SVD, Singular Value Decomposition): 提取信息的一种方法,可以把 SVD 看成是从噪声数据中抽取相关特征.从生 ...

  8. Java 14 令人期待的 5 大新特性,打包工具终于要来了

    随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. Java 13刚刚发布给开发人员使用不久,最新版本的JDK于2019年9月发 ...

  9. Java 14 有哪些新特性?

    记录为 Java 提供了一种正确实现数据类的能力,不再需要为实现数据类而编写冗长的代码.下面就来看看 Java 14 中的记录有哪些新特性. 作者 | Nathan Esquenazi 译者 | 弯月 ...

随机推荐

  1. ServerVariables集合

    当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合.这个集合包含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的HTTP报头中的值,另外一种是由服务器在接 ...

  2. 学习笔记之pip的基本使用

    粗略学习了pip的基础知识,便将此作为学习笔记记录下来同样希望分享的能帮到大家! 如果自己电脑没有pip,小澈在此分享如何安装,解决办法很多呢 1.使用easy_install安装: 各种进入到eas ...

  3. SSTI(服务器模板注入)学习

    SSTI(服务器模板注入)学习 0x01 SSTI概念 SSTI看到ss两个字母就会想到服务器,常见的还有SSRF(服务器端请求伪造).SSTI就是服务器端模板注入(Server-Side Templ ...

  4. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  5. Re模块的方法补充

    id_str = input("输入一个身份证号:") import re obj = re.compile(r"^([1-9]\d{16}[0-9x]|[1-9]\d{ ...

  6. 【HBase】通过Bulkload批量加载数据到Hbase表中

    目录 需求 步骤 一.开发MapReduce 二.打成Jar包放到linux执行 三.有两种办法将HFile文件加载到HBase表中 开发代码 Hadoop命令运行 需求 将hdfs上面的这个路径 / ...

  7. 【Hadoop离线基础总结】HDFS详细介绍

    HDFS详细介绍 分布式文件系统设计思路 概述 只有一台机器时的文件查找:hello.txt /export/servers/hello.txt 如果有多台机器时的文件查找:hello.txt nod ...

  8. 使用IR2104S搭建的H桥-机器人队比赛经典版(原作者答疑)

    原理图地址:http://bbs.ednchina.com/BLOG_ARTICLE_3020313.HTM?click_from=8800020962,4950449047,2014-05-01,E ...

  9. python 基础知识4 - 字典

    1.字典增 #字典增 dic = {'name': '大白', 'age': 20} dic['hight'] = 180 #没有键值对,添加 dic['age'] = 18 #有键值对,覆盖 pri ...

  10. 部署SSL站点 IIS+asp.net

    使用SSL必须要有证书,今天我们就使用IIS内置的证书完成SSL的部署. 1.打开MMC证书管理器,文件->添加/删除管理单元->证书,双击->确定 2.找到:个人->证书下有 ...