Java 14 3 月發佈距現在已經發布 2 個多月,發佈了很多新特性。之前也陸續分享過兩篇 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 及環境配置這篇就不説了。
下面是一個示例:
publicrecord Student(String name, intid, intage) {}
沒錯,一行搞定(public 都可以省略),就是這麼簡單粗暴!!!
再來看下它的類繼承結構圖:
我們再通過 IDEA 反編譯 class 類的方式來看下它到底做了什麼:
看完是不是有點 Lombok 的感覺?
1)生成的類是 final 類型的,並且繼承了:java.lang.Record;
2)生成的類成員變量全是 private final 類型的;
3)自動生成了類構造器、toString()、hashCode()、equals(),以及類似 getter 的變量訪問方法;
由於工具編譯器的問題,上邊看到的部分源代碼是 /* compiled code */,我們再在 Student 類裏面加入 main 方法測試下:
輸出結果: 從結果可以得知 toString/ equals 等生成的方法都按照特定的規則重寫了,而不是使用內存地址。 不能,Records類裏面不能手動加成員變量。 比如,加一個地址成員變量就編譯報錯了: 答案是:不能完全代替! 從上面的結論我們可以得知 Records 類有以下限制: 1)record 類是 final 修飾的,所以不能被其他子類繼承; 2)因為 Java 類是單繼承,而自身又已經繼承了 Record 類,所以不能再繼承其他類,但是可以實現接口; 3)成員變量也是 final 類型的,所以其值或者引用不能被更改,如果是引用類型,可以修改對象裏面的值。 由於它的這些限制,想完全代替 Lombok 是不可能的,當然,不用糾結這些限制的話,某些場合是可以代替 Lombok 使用的。 Java 14 Records 是一個新的語法糖,是一種 "數據載體",可以告別傳統的低效的生成代碼模板,現在還是預覽特性。 雖然現在也存在諸多限制,至少 Java 正在大步往前走,變得越來越智能、越來越簡化了。 可能有些人會説,沒卵用,Lombok 足已! 現在來説確實無法反駁,但是我覺得有朝一日 Java 總會幹掉 Lombok,因為,Records 有十足的優勢,它是 Java 自帶的語法,不需要包裝插件,Lombok 是團隊工具,不一定都會用,你要知道,有些公司是禁止使用 Lombok 插件的。publicrecord Student(String name, intid, intage) {
棧長