中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java新特性使用實例分析

發布時間:2022-02-24 10:58:10 來源:億速云 閱讀:139 作者:iii 欄目:開發技術

這篇文章主要介紹“Java新特性使用實例分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java新特性使用實例分析”文章能幫助大家解決問題。

枚舉:盡管在 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 的作用。

場景一:定義字符串

舊寫法:

String str = "Hello, Java.";

新寫法:

var s = "Hello, Java.";

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

場景二:數值相加

舊寫法:

int num1 = 111;
double num2 = 555.666d;
double num3 = num1 + num2;
System.out.println(num3);

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

新寫法:

var n1 = 111L;
var n2 = 555.666;
var n3 = n1 + n2;
System.out.println(n3);

場景三:集合

舊寫法:

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

新寫法:

var list = new ArrayList();
list.add("Hello");
list.add("Java");

場景四:循環

舊寫法:

for (Object item : list) {
    System.out.println("item:" + item);
}
for (int i = 0; i < 10; i++) {
    // do something...
}

新寫法:

for (var item : list) {
    System.out.println("item:" + item);
}
for (var i = 0; i < 10; i++) {
    // do something...
}

場景五:配合 Lambda 使用

舊寫法:

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

新寫法:

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

2、優點分析

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

① 提高了可讀性

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

InternationalCustomerOrderProcessor orderProcessor = 
    createInternationalOrderProcessor(customer, order);

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

var orderProcessor = createInternationalOrderProcessor(customer, order);

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

② 命名對齊

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

// 顯式類型
No no = new No();
AmountIncrease more = new BigDecimalAmountIncrease();
HorizontalConnection jumping =
  new HorizontalLinePositionConnection();
Variable variable = new Constant(6);
List names = List.of("Java", "中文社群");

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

var no = new No();
var more = new BigDecimalAmountIncrease();
var jumping = new HorizontalLinePositionConnection();
var variable = new Constant(6);
var names = List.of("Java", "中文社群");

從上述代碼可以看出使用了 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 在字節碼層面是不存在的。

關于“Java新特性使用實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彭山县| 来凤县| 司法| 碌曲县| 泰来县| 介休市| 灵寿县| 桐梓县| 辰溪县| 新巴尔虎右旗| 兰西县| 无锡市| 安西县| 常熟市| 三台县| 和林格尔县| 肃南| 临清市| 衡南县| 治多县| 丰城市| 会东县| 定西市| 疏勒县| 宁远县| 全州县| 米林县| 含山县| 镇康县| 延川县| 石台县| 辉南县| 五河县| 称多县| 巴东县| 平罗县| 荥经县| 威信县| 彭山县| 台东县| 蓬安县|