Java 16 新特性:record類
以前我們定義類都是用class
關鍵詞,但從Java 16開始,我們將多一個關鍵詞record
,它也可以用來定義類。record
關鍵詞的引入,主要是為了提供一種更為簡潔、緊湊的final
類的定義方式。
下面就來具體瞭解record類的細節。配套影片教程:Java 16 新特性:使用record宣告類
宣告record類
宣告record類的基礎語法:
java
record range(int start, int end){}
我們知道class類可以在單獨檔案中生命,也可以在其他類中申明。那麼record類也一樣,它有這幾種申明方式:
- 單獨檔案申明:
java
public record range(int start, int end){}
- 在類內部申明:
java
public class DidispaceTest {
public record range(int start, int end){}
}
- 函式內申明:
java
public class DidispaceTest {
public void test() {
public record range(int start, int end){}
}
}
record類詳解
在知道了如何申明之後,你一定會想用record
申明的就那麼點元素,它到底會具備什麼能力呢?
因為record
關鍵詞申明類主要是為了簡化一些類的申明,所以它本質就是一類特殊的class,或者說是某一個模版的class。
record
申明的類,具備這些特點:
- 它是一個
final
類 - 自動實現
equals
、hashCode
、toString
函式 - 成員變數均為
public
屬性
所以,對於之前寫的range類,它等價於一個這樣的類:
```java public final class range{ final int start; final int end;
public range(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
range range = (range) o;
return start == range.start && end == range.end;
}
@Override
public int hashCode() {
return Objects.hash(start, end);
}
@Override
public String toString() {
return "range{" +
"start=" + x +
", end=" + y +
'}';
}
public int start(){
return start;
}
public int end(){
return end;
}
} ```
因為一些函式是隱藏的,在range定義的時候,我們看不到,所以我們可以嘗試寫這樣一段測試程式碼來驗證一下:
```java @Test public void test() { range r = new range(100, 200); log.info(r.toString());
range r2 = new range(100, 200); log.info(String.valueOf(r.equals(r2))); } ```
定義成員函式
因為record
申明的本質也是類,那麼定義成員函式肯定也是可以的。
比如,我們可以這樣在record
類中定義成員函式:
java
record range(int start, int end){
int distance(){
return end - start;
}
}
然後,就可以這樣呼叫它:
java
range r = new range(100, 200);
r.distance();
如果您學習過程中如遇困難?可以加入我們超高質量的技術交流群,參與交流與討論,更好的學習與進步!另外,不要走開,關注我,持續更新Java新特性專欄!
歡迎關注我的公眾號:程式猿DD。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源
- 如何解決 Spring Cloud 下測試環境路由問題
- Spring官方釋出新成員:Spring GraphQL
- 再見了,我的散裝研發管理平臺;再見了,4臺ECS!
- 淘寶驚現GitHub“愛國套餐”,其實是刷Star
- 求求你們,別再刷 Star 了!這跟“愛國”沒關係!
- 重磅!Spring Cloud 生態再添新套件:Spring Cloud Tencent
- 免申請直接用上 IDEA 新 UI,只需要這三步配置
- 如何設定IntelliJ IDEA的記憶體和啟動引數
- spring-configuration-metadata.json檔案是做啥的?
- JetBrains IDE全新UI預覽版來了,要做簡潔與強大兼顧的IDE
- 注意:Spring Boot 2.7開始spring.factories不推薦使用了,接下來這麼玩...
- Spring Boot整合Swagger時PatternsRequestCondition.getPatterns()報錯:"this.condition" is null
- Spring Boot Starter配置spring.factories的自動生成神器:mica-auto
- Stream.toList()和Collectors.toList()的效能比較
- Java Stream轉List的幾種方法
- Java中如何快捷的建立不可變集合
- 一文學會Java的互動式程式設計環境jshell
- Gitee倉庫開源要稽核為什麼被噴?
- Java 15 新特性:隱藏類
- Java 17 新特性:switch的模式匹配(Preview)