成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 14發(fā)布了,不使用"class"也能定義類了?還順手要干掉Lombok!

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

[[319930]]

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

官方吐槽最為致命

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

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

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

  1. final class Point {  
  2.         public final int x;  
  3.         public final int y;   
  4.         public Point(int x, int y) {  
  5.             this.x = x;  
  6.             this.y = y;  
  7.         }   
  8.         // state-based implementations of equals, hashCode, toString  
  9.         // nothing else  
  10.     } 

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

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

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

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

  1. record Point(int x, int y) { } 

神說要用record,于是就有了

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

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

對于這種簡單的類,這些方法通常是無聊的、重復(fù)的,而且是可以很容易地機械地生成的那種東西(ide通常提供這種功能)。

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

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

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

一言不合反編譯

Records的用法比較簡單,和定義Java類一樣:  

  1. record Person (String firstName, String lastName) {}   

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

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

我們先嘗試對他進行編譯,記得使用--enable-preview參數(shù),因為records功能目前在JDK 14中還是一個預(yù)覽(preview)功能。 

  1. javac --enable-preview --release 14 Person.java  
  2. Note: Person.java uses preview language features.  
  3. Note: Recompile with -Xlint:preview for details. 

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

  1. public final class Person extends java.lang.Record {  
  2.       private final String firstName; 
  3.        private final String lastName;  
  4.       public Person(java.lang.String, java.lang.String);  
  5.       public java.lang.String toString();  
  6.       public final int hashCode();  
  7.       public final boolean equals(java.lang.Object);  
  8.       public java.lang.String firstName();  
  9.       public java.lang.String lastName();  
  10.      }   

通過反編譯得到的類,我們可以得到以下信息:

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

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

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

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

  1. public Person(String firstName, String lastName) {  
  2.         this.firstName = firstName;  
  3.         this.lastName = lastName;  
  4.     }  

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

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

還可以這樣玩

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

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

  1. record Person (String firstName, String lastName) {  
  2.         static int x;  
  3.     }   

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

  1. record Person (String firstName, String lastName) {  
  2.         static int x;     
  3.         public static void doX(){  
  4.             x++;  
  5.         }     
  6.         public String getFullName(){  
  7.             return firstName + " " + lastName;  
  8.         }  
  9.     } 

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

  1. record Person (String firstName, String lastName) {  
  2.         static int x;     
  3.         public Person{  
  4.             if(firstName == null){  
  5.                 throw new IllegalArgumentException( "firstName can not be null !");  
  6.             }  
  7.         }     
  8.         public Person(String fullName){  
  9.             this(fullName.split(" ")[0],this(fullName.split(" ")[1])  
  10.         }  
  11.     }   

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

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

總結(jié)

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

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

那么問題來了,如果你用上了Java 14之后,你還會使用Lombok嗎?哦不,你可能短時間內(nèi)都用不上,因為你可能Java 8都還沒用熟~ 

 

責任編輯:龐桂玉 來源: Hollis
相關(guān)推薦

2020-12-28 13:43:03

MacWindowsSurface

2009-09-18 09:00:56

Ubuntu新版發(fā)布

2012-03-12 12:52:24

JavaDataNucleus

2020-07-07 09:19:01

LombokJava IDE

2018-03-30 09:44:14

iOS 11.3iPhone手機刷卡乘車

2022-05-07 08:23:57

KubernetesDockershim

2019-08-27 09:12:33

iOS 12.4.1漏洞越獄

2010-05-11 09:01:42

Fedora 14

2015-07-13 14:24:48

Kubernetes容器平臺Google

2018-09-06 12:20:22

瀏覽器ChromeChrome 69

2013-07-02 14:45:21

Foxmail 7.1郵件

2019-05-09 10:43:12

微軟蘋果谷歌

2025-04-15 08:50:01

DeepSeek模型AI

2021-07-26 22:23:17

Windows 11Windows微軟

2021-12-17 10:42:39

MozillaWindows瀏覽器

2012-05-30 10:24:56

Fedora 18

2017-12-20 21:12:04

2011-06-07 10:07:06

LibreOffice

2011-08-02 09:15:49

LibreOffice

2011-02-24 09:36:33

LibreOffice
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美成人自拍 | 国产伦精品一区二区三区在线 | 殴美成人在线视频 | 日韩www| 亚洲不卡在线观看 | 亚洲一区黄色 | 日韩中文字幕视频在线观看 | 日本一二区视频 | 日韩精品免费一区二区在线观看 | 黄色免费在线网址 | 成人午夜免费在线视频 | 亚洲精品一区二区三区 | 欧美精品一区二区蜜桃 | 国产乱码精品一区二区三区忘忧草 | 国产在线精品一区二区三区 | 亚洲精品一二三区 | 亚洲精品9999 | 国产精品久久久久免费 | 人人九九| 亚洲激情自拍偷拍 | 亚洲永久| 龙珠z国语版在线观看 | 久久久久国产精品一区二区 | 久久久99国产精品免费 | 精品日本中文字幕 | 91视频久久 | 国产色婷婷精品综合在线播放 | 久久中文一区二区 | 91av视频在线免费观看 | 久久com | 久久毛片| 欧美亚洲视频在线观看 | 久久亚洲欧美日韩精品专区 | 91久久久久 | 黄色一级免费 | 精品无码久久久久久久动漫 | 欧美国产视频 | 久草新在线 | 欧美色综合一区二区三区 | 亚洲国产一区在线 | 人人干人人舔 |