亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java 14 發(fā)布了,你還會(huì)使用Lombok?

 更新時(shí)間:2020年04月14日 11:34:37   作者:dearfulan  
2020年3月17日發(fā)布,Java正式發(fā)布了JDK 14 ,目前已經(jīng)可以開(kāi)放下載。在JDK 14中,共有16個(gè)新特性,本文主要來(lái)介紹其中的一個(gè)特性:JEP 359: Records,需要的朋友可以參考下

2020年3月17日發(fā)布,Java正式發(fā)布了JDK 14 ,目前已經(jīng)可以開(kāi)放下載。在JDK 14中,共有16個(gè)新特性,本文主要來(lái)介紹其中的一個(gè)特性:JEP 359: Records

官方吐槽最為致命

早在2019年2月份,Java 語(yǔ)言架構(gòu)師 Brian Goetz,曾經(jīng)寫(xiě)過(guò)一篇文章(http://cr.openjdk.java.net/~briangoetz/amber/datum.html ),詳盡的說(shuō)明了并吐槽了Java語(yǔ)言,他和很多程序員一樣抱怨“Java太啰嗦”或有太多的“繁文縟節(jié)”,他提到:開(kāi)發(fā)人員想要?jiǎng)?chuàng)建純數(shù)據(jù)載體類(lèi)(plain data carriers)通常都必須編寫(xiě)大量低價(jià)值、重復(fù)的、容易出錯(cuò)的代碼。如:構(gòu)造函數(shù)、getter/setter、equals()、hashCode()以及toString()等。

以至于很多人選擇使用IDE的功能來(lái)自動(dòng)生成這些代碼。還有一些開(kāi)發(fā)會(huì)選擇使用一些第三方類(lèi)庫(kù),如Lombok等來(lái)生成這些方法,從而會(huì)導(dǎo)致了令人吃驚的表現(xiàn)(surprising behavior)和糟糕的可調(diào)試性(poor debuggability)。

那么,Brian Goetz 大神提到的純數(shù)據(jù)載體到底指的是什么呢。他舉了一個(gè)簡(jiǎn)單的例子:

final class Point {
 public final int x;
 public final int y;
 
 public Point(int x, int y) {
  this.x = x;
  this.y = y;
 }
 
 // state-based implementations of equals, hashCode, toString
 // nothing else
 }

這里面的Piont其實(shí)就是一個(gè)純數(shù)據(jù)載體,他表示一個(gè)"點(diǎn)"中包含x坐標(biāo)和y坐標(biāo),并且只提供了構(gòu)造函數(shù),以及一些equals、hashCode等方法。

于是,BrianGoetz大神提出一種想法,他提到,Java完全可以對(duì)于這種純數(shù)據(jù)載體通過(guò)另外一種方式表示。

其實(shí)在其他的面向?qū)ο笳Z(yǔ)言中,早就針對(duì)這種純數(shù)據(jù)載體有單獨(dú)的定義了,如Scala中的case、Kotlin中的data以及C#中的record。這些定義,盡管在語(yǔ)義上有所不同,但是它們的共同點(diǎn)是類(lèi)的部分或全部狀態(tài)可以直接在類(lèi)頭中描述,并且這個(gè)類(lèi)中只包含了純數(shù)據(jù)而已。

于是,他提出Java中是不是也可以通過(guò)如下方式定義一個(gè)純數(shù)據(jù)載體呢?

record Point(int x, int y) { }

神說(shuō)要用record,于是就有了

就像大神吐槽的那樣,我們通常需要編寫(xiě)大量代碼才能使類(lèi)變得有用。如以下內(nèi)容:

  • toString()方法
  • hashCode() and equals()方法
  • Getter 方法
  • 一個(gè)共有的構(gòu)造函數(shù)

對(duì)于這種簡(jiǎn)單的類(lèi),這些方法通常是無(wú)聊的、重復(fù)的,而且是可以很容易地機(jī)械地生成的那種東西(ide通常提供這種功能)。

當(dāng)你閱讀別人的代碼時(shí),可能會(huì)更加頭大。例如,別人可能使用IDE生成的hashCode()和equals()來(lái)處理類(lèi)的所有字段,但是如何才能在不檢查實(shí)現(xiàn)的每一行的情況下確定他寫(xiě)的對(duì)呢?如果在重構(gòu)過(guò)程中添加了字段而沒(méi)有重新生成方法,會(huì)發(fā)生什么情況呢?

大神Brian Goetz提出了使用record定義一個(gè)純數(shù)據(jù)載體的想法,于是,Java 14 中便包含了一個(gè)新特性:EP 359: Records ,作者正是 Brian Goetz

Records的目標(biāo)是擴(kuò)展Java語(yǔ)言語(yǔ)法,Records為聲明類(lèi)提供了一種緊湊的語(yǔ)法,用于創(chuàng)建一種類(lèi)中是“字段,只是字段,除了字段什么都沒(méi)有”的類(lèi)。通過(guò)對(duì)類(lèi)做這樣的聲明,編譯器可以通過(guò)自動(dòng)創(chuàng)建所有方法并讓所有字段參與hashCode()等方法。這是JDK 14中的一個(gè)預(yù)覽特性。

一言不合反編譯

Records的用法比較簡(jiǎn)單,和定義Java類(lèi)一樣:

record Person (String firstName, String lastName) {}

如上,我們定義了一個(gè)Person記錄,其中包含兩個(gè)組件:firstName和lastName,以及一個(gè)空的類(lèi)體。

那么,這個(gè)東西看上去也是個(gè)語(yǔ)法糖,那他到底是怎么實(shí)現(xiàn)的那?

我們先嘗試對(duì)他進(jìn)行編譯,記得使用--enable-preview參數(shù),因?yàn)閞ecords功能目前在JDK 14中還是一個(gè)預(yù)覽(preview)功能。

javac --enable-preview --release 14 Person.java

Note: Person.java uses preview language features.

Note: Recompile with -Xlint:preview for details.

如前所述,Record只是一個(gè)類(lèi),其目的是保存和公開(kāi)數(shù)據(jù)。讓我們看看用javap進(jìn)行反編譯,將會(huì)得到以下代碼:

public final class Person extends java.lang.Record {
 private final String firstName;
 private final String lastName;
 public Person(java.lang.String, java.lang.String);
 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();
 }

通過(guò)反編譯得到的類(lèi),我們可以得到以下信息:

1、生成了一個(gè)final類(lèi)型的Person類(lèi)(class),說(shuō)明這個(gè)類(lèi)不能再有子類(lèi)了。

2、這個(gè)類(lèi)繼承了java.lang.Record類(lèi),這個(gè)我們使用enum創(chuàng)建出來(lái)的枚舉都默認(rèn)繼承java.lang.Enum有點(diǎn)類(lèi)似

3、類(lèi)中有兩個(gè)private final 類(lèi)型的屬性。所以,record定義的類(lèi)中的屬性都應(yīng)該是private final類(lèi)型的。

4、有一個(gè)public的構(gòu)造函數(shù),入?yún)⒕褪莾蓚€(gè)主要的屬性。如果通過(guò)字節(jié)碼查看其方法體的話(huà),其內(nèi)容就是以下代碼,你一定很熟悉:

public Person(String firstName, String lastName) {
 this.firstName = firstName;
 this.lastName = lastName;
 }

5、有兩個(gè)getter方法,分別叫做firstName和lastName。這和JavaBean中定義的命名方式有區(qū)別,或許大神想通過(guò)這種方式告訴我們r(jià)ecord定義出來(lái)的并不是一個(gè)JavaBean吧。

6、還幫我們自動(dòng)生成了toString(), hashCode() 和 equals()方法。值得一提的是,這三個(gè)方法依賴(lài)invokedynamic來(lái)動(dòng)態(tài)調(diào)用包含隱式實(shí)現(xiàn)的適當(dāng)方法。

還可以這樣玩

前面的例子中,我們簡(jiǎn)單的創(chuàng)建了一個(gè)record,那么,record中還能有其他的成員變量和方法嗎?我們來(lái)看下。

1、我們不能將實(shí)例字段添加到record中。但是,我們可以添加靜態(tài)字段。

record Person (String firstName, String lastName) {
 static int x;
 }

2、我們可以定義靜態(tài)方法和實(shí)例方法,可以操作對(duì)象的狀態(tài)。

record Person (String firstName, String lastName) {
 static int x;
 
 public static void doX(){
  x++;
 }
 
 public String getFullName(){
  return firstName + " " + lastName;
 }
 }

3、我們還可以添加構(gòu)造函數(shù)。

record Person (String firstName, String lastName) {
 static int x;
 
 public Person{
  if(firstName == null){
  throw new IllegalArgumentException( "firstName can not be null !");
  }
 }
 
 public Person(String fullName){
  this(fullName.split(" ")[0],this(fullName.split(" ")[1])
 }
 }

所以,我們是可以在record中添加靜態(tài)字段/方法的,但是問(wèn)題是,我們應(yīng)該這么做嗎?

請(qǐng)記住,record推出背后的目標(biāo)是使開(kāi)發(fā)人員能夠?qū)⑾嚓P(guān)字段作為單個(gè)不可變數(shù)據(jù)項(xiàng)組合在一起,而不需要編寫(xiě)冗長(zhǎng)的代碼。這意味著,每當(dāng)您想要向您的記錄添加更多的字段/方法時(shí),請(qǐng)考慮是否應(yīng)該使用完整的類(lèi)來(lái)代替它。

總結(jié)

record 解決了使用類(lèi)作為數(shù)據(jù)包裝器的一個(gè)常見(jiàn)問(wèn)題。純數(shù)據(jù)類(lèi)從幾行代碼顯著地簡(jiǎn)化為一行代碼。

但是,record目前是一種預(yù)覽語(yǔ)言特性,這意味著,盡管它已經(jīng)完全實(shí)現(xiàn),但在JDK中還沒(méi)有標(biāo)準(zhǔn)化。

那么問(wèn)題來(lái)了,如果你用上了Java 14之后,你還會(huì)使用Lombok嗎?哦不,你可能短時(shí)間內(nèi)都用不上,因?yàn)槟憧赡躂ava 8都還沒(méi)用熟~

參考資料:

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

到此這篇關(guān)于Java 14 發(fā)布了,終于可以扔掉Lombok了?的文章就介紹到這了,更多相關(guān)java14 lombok內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的collection集合類(lèi)型總結(jié)

    Java中的collection集合類(lèi)型總結(jié)

    Java的集合類(lèi)型都是對(duì)java.util包中Collection接口的繼承,這里我們主要介紹依賴(lài)于collection的一些主分支,一起來(lái)看一下Java中的collection集合類(lèi)型總結(jié)
    2016-05-05
  • Spring配置中transactionAttributes的使用方法介紹

    Spring配置中transactionAttributes的使用方法介紹

    這篇文章主要介紹了Spring配置中transactionAttributes的使用方法介紹的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼

    Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼

    這篇文章主要介紹了Java利用Redis實(shí)現(xiàn)高并發(fā)計(jì)數(shù)器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼

    java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)波雷費(fèi)密碼算法示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Gradle構(gòu)建基本的Web項(xiàng)目結(jié)構(gòu)

    Gradle構(gòu)建基本的Web項(xiàng)目結(jié)構(gòu)

    這篇文章主要為大家介紹了Gradle創(chuàng)建Web項(xiàng)目基本的框架結(jié)構(gòu)搭建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java中的十個(gè)大類(lèi)總結(jié)

    java中的十個(gè)大類(lèi)總結(jié)

    java.lang.string字符串類(lèi)將是無(wú)可爭(zhēng)議的冠軍在任何一天的普及和不可以否認(rèn)。這是最后一個(gè)類(lèi),用來(lái)創(chuàng)建操作不可變字符串字面值
    2013-10-10
  • SpringCloud OpenFeign概述與使用

    SpringCloud OpenFeign概述與使用

    OpenFeign源于Netflix的Feign,是http通信的客戶(hù)端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開(kāi)發(fā),讓開(kāi)發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成
    2023-01-01
  • 2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境的過(guò)程

    2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境的過(guò)程

    這篇文章主要介紹了2024.1.2 安裝JDK和Eclipse并配置java編譯環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Spring Boot+maven打war包的方法

    Spring Boot+maven打war包的方法

    這篇文章主要介紹了Spring Boot+maven打war包的方法,本文通過(guò)實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2018-05-05
  • Java 封裝的使用詳解

    Java 封裝的使用詳解

    在面向?qū)ο蟪淌皆O(shè)計(jì)方法中,封裝(英語(yǔ):Encapsulation)是指一種將抽象性函式接口的實(shí)現(xiàn)細(xì)節(jié)部分包裝、隱藏起來(lái)的方法。封裝可以被認(rèn)為是一個(gè)保護(hù)屏障,防止該類(lèi)的代碼和數(shù)據(jù)被外部類(lèi)定義的代碼隨機(jī)訪(fǎng)問(wèn)。要訪(fǎng)問(wèn)該類(lèi)的代碼和數(shù)據(jù),必須通過(guò)嚴(yán)格的接口控制
    2021-11-11

最新評(píng)論