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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java枚举返回字符串_Java新特性:数据类型可以扔掉了?

發布時間:2023/12/10 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java枚举返回字符串_Java新特性:数据类型可以扔掉了? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關注“腳本之家”,與百萬開發者在一起

作者 | 王磊

來源 | Java中文社群(ID:javacn666)

在很久很久以前,我們寫代碼時要慎重的考慮變量的數據類型,比如下面這些:

枚舉:盡管在 JDK 5 中增加了枚舉類型,但是 Class 文件常量池的 CONSTANT_Class_info 類型常量并沒有發生任何語義變化,仍然是代表一個類或接口的符號引用,沒有加入枚舉,也沒有增加過“CONSTANT_Enum_info”之類的“枚舉符號引用”常量。所以使用 enum 關鍵字定義常量,盡管從 Java 語法上看起來與使用 class 關鍵字定義類、使用 interface 關鍵字定義接口是同一層次的,但實際上這是由 Javac 編譯器做出來的假象,從字節碼的角度來看,枚舉僅僅是一個繼承于 java.lang.Enum、自動生成了 values() 和 valueOf() 方法的普通 Java 類而已,因此枚舉也歸為引用類型了

然而到了 JDK 10 時,我們就有了新的選擇,JDK 10 中新增了?var?局部變量推斷的功能,使用它我們可以很 happy 的忘記數據類型這件事了,那它是如何使用的呢?接下來我們一起來看。

1、使用對比

接下來我們就使用對比的方式,來體會一下?var?的作用。

場景一:定義字符串

舊寫法:

"Hello,?Java.";

新寫法:

var?s?=?

PS:這里的舊寫法指的是 JDK 10 之前的版本,而新寫法指的是 JDK 10 以后(包含 JDK 10)的版本。

場景二:數值相加

舊寫法:

int?num1?=?

PS:當遇到不同類型相加時(int+?double)會發生數據類型向上轉型,因此?num3?就會升級為?double?類型。

新寫法:

var?n1?=?

場景三:集合

舊寫法:

List?list?=?new?ArrayList<>();
list.add("Hello");
list.add("Java");

新寫法:

var?list?=?

場景四:循環

舊寫法:

for?(Object?item?:?list)?{

新寫法:

for?(

場景五:配合 Lambda 使用

舊寫法:

List?flist?=?list.stream().filter(v?->
????????????????v.equals("Java")).collect(Collectors.toList());
System.out.println(flist);

新寫法:

var?flist?=?list.stream().filter(v?->

2、優點分析

通過上面的示例我們可以看出,?var?具備兩個明顯的優點:提高了代碼的可讀性和命名對齊

① 提高了可讀性

我們在沒有使用?var?之前,如果類型的名稱很長就會出現下面的這種情況:

InternationalCustomerOrderProcessor>?orderProcessor?=?
????createInternationalOrderProcessor(customer,?order);

當限定每行不能超過 150 個字符的話,變量名就會被推到下一行顯示,這樣整個代碼的可讀性就變得很低。但當我們使用了?var?之后,代碼就變成了這樣:

var?orderProcessor?=?createInternationalOrderProcessor(customer,?order);

從上述的代碼可以看出,當類型越長時,var(可讀性)的價值就越大。

② 命名對齊

在不使用?var?時,當遇到下面這種情況,代碼就是這樣的:

//?顯式類型

在使用了?var?之后,代碼是這樣的:

var?no?=?

從上述代碼可以看出使用了?var?之后,命名對齊了,整個代碼也變得更優雅了。

3、使用規則 & 反例

var?的實現來自于 JEP 286 (改善提議 286),詳情地址 :http://openjdk.java.net/jeps/286

從 JEP 286 的標題“局部變量類型推斷”可以看出,var?只能用于局部變量聲明,也就是說?var?必須滿足以下條件:

  • 它只能用于局部變量上;
  • 聲明時必須初始化;
  • 不能用作方法參數和全局變量(類變量)。

PS:因為?var?的實現必須根據等會右邊的代碼進行類型推斷,因此它不能被賦值 null 或不被初始化。

反例一:未初始化和賦值 null

反例二:中途類型更改

反例三:全局變量


反例四:作為返回值


4、原理分析

經過前面的使用我們對?var?已經有了初步的認識,但?var?的實現原理是什么呢?

為了搞清楚它的原理,我們對下面的代碼進行了編譯(使用命令?javac MainTest.java):

然后我們再用反編譯工具打開被編譯的類發現:var?竟然被替換成一個個確定的數據類型了,如下圖所示:

由此我們可以得出結論:var?關鍵字的實現和它的名字密切相關,?var?只是局部類型推斷,它只會在 Java 編碼期和編譯期有效,當類被編譯為 class 文件時,var?就會變成一個個確定的數據類型(通過推斷得出)。?所以我們可以把?var?通俗的理解為 Java 的語法糖,使用它可以讓我們快速優雅的實現業務代碼,但?var?在字節碼層面是不存在的。

總結

本文我們介紹了?var(局部類型推斷)的使用,它可以用在局部變量、?for、Lambda?的變量聲明中,但不能用在全局變量的聲明中,也不能用它作為方法的返回值,并且在聲明時一定要進行初始化(也不能賦值為 null)。使用?var?可以有效的提高代碼的可讀性和命名對齊,它的實現原理,是在編譯期通過等號右側的代碼進行類型推斷,然后再將?var?替換成確定的數據類型。

推薦閱讀:

你見過最爛的Java代碼長什么樣子?JDK/Java 15發布1.6 萬字長文帶你讀懂 Java IO

每日打卡贏積分兌換書籍入口

👇🏻👇🏻👇🏻

總結

以上是生活随笔為你收集整理的java枚举返回字符串_Java新特性:数据类型可以扔掉了?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。