djano 字段不重复_Java 14 发布了,不使用quot;classquot;也能定义类了?还顺手要干掉Lombok!...

dabb7f4550df03d0a9cf0a9e4665e919.png

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

官方吐槽最为致命

早在2019年2月份,Java 语言架构师 Brian Goetz,曾经写过一篇文章(http://cr.openjdk.java.net/~briangoetz/amber/datum.html ),详尽的说明了并吐槽了Java语言,他和很多程序员一样抱怨“Java太啰嗦”或有太多的“繁文缛节”,他提到:开发人员想要创建纯数据载体类(plain data carriers)通常都必须编写大量低价值、重复的、容易出错的代码。如:构造函数、getter/setter、equals()、hashCode()以及toString()等。

以至于很多人选择使用IDE的功能来自动生成这些代码。还有一些开发会选择使用一些第三方类库,如Lombok等来生成这些方法,从而会导致了令人吃惊的表现(surprising behavior)和糟糕的可调试性(poor debuggability)。

那么,Brian Goetz 大神提到的纯数据载体到底指的是什么呢。他举了一个简单的例子:

final 

这里面的Piont其实就是一个纯数据载体,他表示一个"点"中包含x坐标和y坐标,并且只提供了构造函数,以及一些equals、hashCode等方法。

于是,BrianGoetz大神提出一种想法,他提到,Java完全可以对于这种纯数据载体通过另外一种方式表示。

其实在其他的面向对象语言中,早就针对这种纯数据载体有单独的定义了,如Scala中的case、Kotlin中的data以及C#中的record。这些定义,尽管在语义上有所不同,但是它们的共同点是类的部分或全部状态可以直接在类头中描述,并且这个类中只包含了纯数据而已。

于是,他提出Java中是不是也可以通过如下方式定义一个纯数据载体呢?

record Point(int x, int y) { }

神说要用record,于是就有了

就像大神吐槽的那样,我们通常需要编写大量代码才能使类变得有用。如以下内容:

  • toString()方法

  • hashCode() and equals()方法

  • Getter 方法

  • 一个共有的构造函数

对于这种简单的类,这些方法通常是无聊的、重复的,而且是可以很容易地机械地生成的那种东西(ide通常提供这种功能)。

当你阅读别人的代码时,可能会更加头大。例如,别人可能使用IDE生成的hashCode()和equals()来处理类的所有字段,但是如何才能在不检查实现的每一行的情况下确定他写的对呢?如果在重构过程中添加了字段而没有重新生成方法,会发生什么情况呢?

大神Brian Goetz提出了使用record定义一个纯数据载体的想法,于是,Java 14 中便包含了一个新特性:EP 359: Records ,作者正是 Brian Goetz

e6b4d0a0e90d113f9f04dbc1c6a92658.png

Records的目标是扩展Java语言语法,Records为声明类提供了一种紧凑的语法,用于创建一种类中是“字段,只是字段,除了字段什么都没有”的类。通过对类做这样的声明,编译器可以通过自动创建所有方法并让所有字段参与hashCode()等方法。这是JDK 14中的一个预览特性。

一言不合反编译

Records的用法比较简单,和定义Java类一样:

record Person (String firstName, String lastName) {}

如上,我们定义了一个Person记录,其中包含两个组件:firstName和lastName,以及一个空的类体。

那么,这个东西看上去也是个语法糖,那他到底是怎么实现的那?

我们先尝试对他进行编译,记得使用--enable-preview参数,因为records功能目前在JDK 14中还是一个预览(preview)功能。

14 Person.java

如前所述,Record只是一个类,其目的是保存和公开数据。让我们看看用javap进行反编译,将会得到以下代码:

public 

通过反编译得到的类,我们可以得到以下信息:

1、生成了一个final类型的Person类(class),说明这个类不能再有子类了。

2、这个类继承了java.lang.Record类,这个我们使用enum创建出来的枚举都默认继承java.lang.Enum有点类似

3、类中有两个private final 类型的属性。所以,record定义的类中的属性都应该是private final类型的。

4、有一个public的构造函数,入参就是两个主要的属性。如果通过字节码查看其方法体的话,其内容就是以下代码,你一定很熟悉:

public Person(String firstName, String lastName) {

5、有两个getter方法,分别叫做firstName和lastName。这和JavaBean中定义的命名方式有区别,或许大神想通过这种方式告诉我们record定义出来的并不是一个JavaBean吧。

6、还帮我们自动生成了toString(), hashCode() 和 equals()方法。值得一提的是,这三个方法依赖invokedynamic来动态调用包含隐式实现的适当方法。

还可以这样玩

前面的例子中,我们简单的创建了一个record,那么,record中还能有其他的成员变量和方法吗?我们来看下。

1、我们不能将实例字段添加到record中。但是,我们可以添加静态字段。

record Person (String firstName, String lastName) {

2、我们可以定义静态方法和实例方法,可以操作对象的状态。

record Person (String firstName, String lastName) {

3、我们还可以添加构造函数。

record Person (String firstName, String lastName) {

所以,我们是可以在record中添加静态字段/方法的,但是问题是,我们应该这么做吗?

请记住,record推出背后的目标是使开发人员能够将相关字段作为单个不可变数据项组合在一起,而不需要编写冗长的代码。这意味着,每当您想要向您的记录添加更多的字段/方法时,请考虑是否应该使用完整的类来代替它。

总结

record 解决了使用类作为数据包装器的一个常见问题。纯数据类从几行代码显著地简化为一行代码。

但是,record目前是一种预览语言特性,这意味着,尽管它已经完全实现,但在JDK中还没有标准化。

那么问题来了,如果你用上了Java 14之后,你还会使用Lombok吗?哦不,你可能短时间内都用不上,因为你可能Java 8都还没用熟~

PS:最近Java 14发布了很多新功能,很多特性还是比较有意思的,这个是本系列的第一篇文章,欢迎大家关注公众号:Java之道,后续文章写好后会第一时间发出。

参考资料:

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

https://dzone.com/articles/a-first-look-at-records-in-java-14

https://aboullaite.me/java-14-records/

http://cr.openjdk.java.net/~briangoetz/amber/datum.html

关于作者Hollis,一个对Coding有着独特追求的人,现任阿里巴巴技术专家,个人技术博主,技术文章全网阅读量数千万,《程序员的三门课》联合作者。

推荐阅读:

接口默认方法是什么鬼

HTTPS 的 7 次握手以及 9 倍时延

Java堆内存是线程共享的!面试官:你确定吗?

2020年3月全国程序员工资统计,平均工资13820元

6d8993aa2329d5d1d261a409fea8da3d.png喜欢我可以给我设为星标哦6d8993aa2329d5d1d261a409fea8da3d.png

028bcb63c5079338f4911d9eca1973f2.pnga0706784cb0623640d99cdb50627cc30.png

好文章,我 在看 

d3c32d773a8f7930b1027e9f214f5fef.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java队列_java集合入门和深入学习(详解),看这篇就差不多了

一、集合入门总结集合框架:Java中的集合框架大类可分为Collection和Map;两者的区别:1、Collection是单列集合;Map是双列集合2、Collection中只有Set系列要求元素唯一;Map中键需要唯一,值可以重复3、Collect…

oracle课程小结,Oracle 数据库优化实战心得总结

一般情况下,对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化;对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。3.充分利用内存,优化sga、pga等(11g已经实现了sgapga自动化,但有的时…

苹果公司的企业文化_百度、苹果、脉脉等互联网大厂的企业文化衫还能这么潮?...

转眼2020年就已经到年中啦,很多企业已经敲锣打鼓,筹备着年中的会议团建了,有趣的,好玩的,有创意的,体面的,大场面的,国际范儿的,到底怎么样的年中策划才是最NICE的呢&…

命名空间跟作用域是什么关系_魏如萱许光汉首次合唱新歌《什么跟什么有什么关系》_娱乐频道...

近日,许光汉与新晋金曲奖歌后魏如萱合作的最新单曲《什么跟什么有什么关系》已经上线。歌曲由金曲奖最佳作词人李焯雄作词,魏如萱作曲,陈建骐担当制作,魏如萱和许光汉共同演唱。单曲收录于十一音乐的年度限定合作企划“不完美人生…

二级域名是否可以随意设定_新老域名是否影响SEO优化收录排名?企业需要多域名做网站吗?...

(文/守护袁昆)各互联网平台想免费做营销推广变得比较困难,而大多数中小企业又没什么资金方面的营销预算,所以付费推广广告也没法做。建立自己的企业官网貌似是不错的方式。传统企业在互联网上玩了一圈,发现还是自己的企业官网最靠谱。那么问题…

oracle pr,PRMSCAN ORACLE碎片扫描合并工具

prmscan 是诗檀软件独立研发的ORACLE数据块碎片扫描合并工具,其适用于以下的场景:误手动删除了文件系统(任意文件系统 NTFS、FAT、EXT、UFS、JFS等)或ASM上的数据文件文件系统损坏,导致数据文件大小变成0 bytes即数据文件被清零文件系统损坏&…

win10启动修复_以安全模式启动win10的4种方法,简单高效,修复电脑故障必用技巧...

在安全模式下启动Windows7只是小菜一碟,你所要做的就是按下Shift8来中断启动过程,然而,在安全模式下启动windows 10的过程并不是那么简单。一些用户甚至认为Windows 10无法使用安全模式,但事实并非如此,有很多方法可以…

usb接口供电不足_Win7系统下电脑USB供电不足的解决方法

关注奕奇科技,学习更多小妙招,工作效率加倍小妙招,值得收藏笔记本主板USB供电不足的现象可以解释成两种情况:第一种是笔记本使用电池的时候会自动切换到较低的功耗,最大的电流标准是500mA,电压是5V&#xf…

php memcached 队列,redis获取所有队列_memcached

scrapy-redis实现分布式中, 获取redis队列中的612x230 - 24KB - PNGscrapy动态的从redis队列中获取源,并启动spid558x462 - 128KB - PNGRedis实现消息队列700x365 - 36KB - JPEGRedis实现简单消息队列 - 滚动_【北京联盟】677x441 - 9KB - PNGRedis实现简单消息队列 - 滚动_【北…

BP算法和RNN_模型CNN-RNN-LSTM和GRU简介

深度学习自从2006年以后已经“火”了十多年了,目前大家看到的,最普遍的应用成果是在计算机视觉、语音识别和自然语言处理(NLP)。最近工业界也在努力地扩展它的应用场景,比如游戏、内容推荐和广告匹配等等。深度模型架构…

电脑向linux服务器传输文件,windows如何通过ssh工具向linux服务器上传和下载文件?...

这个是很简单的。我用win10和kali给你举例子。kali自带了ssh,只不过我们需要开启它。kali下运行ps -e | grep ssh,你会发现已经有了ssh。只是没有启动,启动方法是/etc/init.d/ ssh start。如果你的linux机器不是kali,就先apt-get …

python bar图_python使用matplotlib绘图 — barChart | 学步园

matplotlib是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。它的文档相当完备,并且Gallery页面中有上百幅缩略图,打开之…

python random randint_python中random.randint(1,100)随机数中包不包括1和100

展开全部 在python中的random.randint(a,b)用于生成一个2113指定范围内的整数。5261其中参数a是下4102限&#xff0c;1653参数b是上限&#xff0c;生成的随机数n: a < n < b。 print random.randint(12, 20) #生成的随机数n: 12 < n < 20 print random.randint(20,…

curaengine linux编译,CuraEngine开源程序解读

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;meshmesh中主要定义了关于三角形网格三个类和这三个类的一些成员函数&#xff0c;分别是MeshVertex&#xff0c;MeshFace以及Mesh。全局变量const int类型的全局变…

python docx库安装_详解python中docx库的安装过程

python中docx库的简介 python-docx包&#xff0c;这是一个很强大的包&#xff0c;可以用来创建docx文档&#xff0c;包含段落、分页符、表格、图片、标题、样式等几乎所有的word文档中能常用的功能都包含了&#xff0c;这个包的主要功能便是用来创建文档&#xff0c;相对来说用…

创新固定资产管理方式:易点易动集成企业微信的全新解决方案

在当今竞争激烈的商业环境中&#xff0c;高效的固定资产管理对于企业的成功至关重要。然而&#xff0c;传统的资产管理方式往往繁琐、容易出错&#xff0c;并且缺乏实时性和准确性。为了解决这些挑战&#xff0c;易点易动与企业微信进行了集成合作&#xff0c;推出了一种全新的…

python删除重复元素_Python-删除列表中重复元素的方法

原博文 2017-12-21 17:07 − 1.set()方法 x [1,2,3,4,5,1] y list(set(x)) print(y) [1, 2, 3, 4, 5] 2. x [b,c,d,b,c,a,a] y {}.fromkeys(x).ke... 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设计语言&#xff0c;是一种面向对象的动态类型语…

linux内核提取ret2usr,Linux内核漏洞利用技术详解 Part 2

前言在上一篇文章中&#xff0c;我们不仅为读者详细介绍了如何搭建环境&#xff0c;还通过一个具体的例子演示了最简单的内核漏洞利用技术&#xff1a;ret2usr。在本文中&#xff0c;我们将逐步启用更多的安全防御机制&#xff0c;即SMEP、KPTI和SMAP&#xff0c;并逐一解释它们…

raid5坏了一块盘怎么办_机械硬盘的坏道处理——屏蔽之

分享一次处理硬盘坏道的经历。打算写的让小白也能照着葫芦画葫芦。机械硬盘的阿喀琉斯之踵无疑是坏道。倘若一块硬盘出现了坏道怎么办&#xff1f;当然是即刻备份资料更换新硬盘。毫无疑问&#xff0c;二手硬盘几乎都是被榨干的状态&#xff0c;活生生地一副论斤卖的样子。当然…

linux 嵌入式 交叉 环境搭建 实验原理,实验三 嵌入式Linux开发环境的搭建

南京邮电大学通达学院实 验 报 告实验 实验三题目 嵌入式Linux开发环境的搭建 课程名称 嵌入式驱动开发实验 学院 专业 班 实验者学号同做者学号 08002210 姓名 毛骏超 同做者学号 08002225 姓名 陈超/ 嵌入式应用开发实验成绩 评定一、实验目的1.掌握嵌入式交叉编译环境的搭建…