日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK14的新特性:Lombok的终结者record

發(fā)布時間:2024/2/28 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK14的新特性:Lombok的终结者record 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 新的Record類型
  • 探討Record的秘密
  • record擴(kuò)展
  • 總結(jié)

JDK 14的新特性:Lombok的終結(jié)者record

簡介

自從面向?qū)ο螽a(chǎn)生之后,程序界就開始了新的變化,先是C發(fā)展到了C++,后面java橫空出世,大有一統(tǒng)江湖的趨勢。

面向?qū)ο髴{借其結(jié)構(gòu)化的特點(diǎn)和在大型項(xiàng)目中的優(yōu)勢,一路蓬勃發(fā)展到今。面向?qū)ο蟛皇遣缓?#xff0c;但是太繁瑣。

比如我們要定義一個簡單的存儲數(shù)據(jù)的結(jié)構(gòu),比如說User。除了要定義其內(nèi)部的具體字段以外,我們還要定義get set方法,定義構(gòu)造函數(shù),equals(), hashCode(), toString()等。

為了解決這個問題,也產(chǎn)生了很多解決方案,比如Lombok,可以通過注解就自動生成特定的存取方法和構(gòu)造函數(shù)。但是Lombok生成的代碼看不到,在代碼調(diào)試方面有一定的劣勢。

終于JDK 14為我們帶來了record,雖然還是預(yù)覽特性,但是今天我們一覽為快。

新的Record類型

Record是一種輕量級的class,可以看做是數(shù)據(jù)結(jié)構(gòu)體。和scala中的case有點(diǎn)相似。

舉個自定義User的例子看一下Record是怎么用的:

public record Address(String addressName,String city ) { } public record CustUser(String firstName,String lastName,Address address,int age ) {}

上面我們定義了兩個類,CustUser和Address。CustUser中引用了Address。

Record和普通的類的區(qū)別就在于Record多了一個括號括起來的定義的字段。

Record類默認(rèn)是final的,里面的字段默認(rèn)是private final的。

探討Record的秘密

要想知道Record到底是怎么工作的,我們可以使用javap來對編譯好的class文件反編譯,運(yùn)行javap CustUser,可以得到下面的結(jié)果:

警告: 二進(jìn)制文件CustUser包含com.flydean.records.CustUser Compiled from "CustUser.java" public final class com.flydean.records.CustUser extends java.lang.Record {public com.flydean.records.CustUser(java.lang.String, java.lang.String, com.flydean.records.Address, int);public java.lang.String toString();public final int hashCode();public final boolean equals(java.lang.Object);public java.lang.String firstName();public java.lang.String lastName();public com.flydean.records.Address address();public int age(); }

上面可以看到final class CustUser繼承自java.lang.Record。

并且自動添加了默認(rèn)帶有所有字段的構(gòu)造函數(shù)。各個自動的獲取方法,并實(shí)現(xiàn)了toString,hashCode和equals方法。

天啦,太完美了,我們想要的它居然都有。

如果上面的javap還不是很清楚的話,大家可以借助IDE的反編譯功能,打開CustUser.class文件看一看:

public final class CustUser extends java.lang.Record {private final java.lang.String firstName;private final java.lang.String lastName;private final com.flydean.records.Address address;private final int age;public CustUser(java.lang.String firstName, java.lang.String lastName, com.flydean.records.Address address, int age) { /* compiled code */ }public java.lang.String toString() { /* compiled code */ }public final int hashCode() { /* compiled code */ }public final boolean equals(java.lang.Object o) { /* compiled code */ }public java.lang.String firstName() { /* compiled code */ }public java.lang.String lastName() { /* compiled code */ }public com.flydean.records.Address address() { /* compiled code */ }public int age() { /* compiled code */ } }

注意,上面的反編譯我們可以看到,record中的所有字段都是final的,只能在初始化的時候設(shè)置。并且方法里面也沒有提供其他可以改變字段內(nèi)容的方法。

所以我們得出了一個震世驚俗的結(jié)論:record是immutable的。

record擴(kuò)展

上面的例子中我們只使用了小括號里面的內(nèi)容,大括號還是空的呀。可不可以像其他正常的類一樣,添加點(diǎn)方法或者構(gòu)造函數(shù)進(jìn)去呢?

答案是肯定的。

先看一個整體的方案:

public record CustUserWithBody(String firstName,String lastName,Address address,int age ) {public String fullName(){return firstName+ lastName;}public CustUserWithBody{if (age < 18) {throw new IllegalArgumentException( "男大當(dāng)婚,女大當(dāng)嫁,18歲未到,不許出嫁!");}} }

我們在record的主題中,定義了一個方法和一個構(gòu)造函數(shù)。

先看這個方法,在方法中我們可以訪問到record中定義的變量,但是千萬不要嘗試去修改他們,因?yàn)樗麄兪莊inal的,你會得到一個變異錯誤。

再看這個構(gòu)造函數(shù),這個構(gòu)造函數(shù)沒有小括號,只有大括號,這種構(gòu)造函數(shù)叫做Compact constructor。你無法在record中定義正常的構(gòu)造函數(shù),因?yàn)闀玫揭粋€編譯錯誤。

在這個Compact constructor中,我們可以對定義的字段進(jìn)行數(shù)據(jù)校驗(yàn)。如上所述。

總結(jié)

record是個好東西,希望能夠出現(xiàn)在JDK的正式版本中。

最后,很多人可能有個疑問,JDK14聲勢這么浩大,怎么感覺大的顛覆性的更新也沒有太多。

那么我以一個過來人的身份來回答一下這個問題:第一,JDK肯定要保持穩(wěn)定,新特性都是次要的,穩(wěn)定壓倒一切。所以6個月說長不長說短不短的時間里面注定不會有大的更新。第二,歐美公司的通病,在歐美公司工作不要太瀟灑,不但可以不打卡,在家上班,上班也是大大小小的會議開個不停,最后留下來寫程序的時間自然不會很多。牛人大神有很多,渾水摸魚的也不少。效率的話自然比不了國內(nèi)的996+857了。

本文的例子https://github.com/ddean2009/learn-java-base-9-to-20

更多精彩內(nèi)容且看:

  • 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級賬本,以太坊,Libra,比特幣等持續(xù)更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
  • java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程

歡迎關(guān)注我的公眾號:程序那些事,更多精彩等著您!
更多內(nèi)容請訪問 www.flydean.com

總結(jié)

以上是生活随笔為你收集整理的JDK14的新特性:Lombok的终结者record的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。