日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Java新特性:數據類型可以扔掉了?

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

創(chuàng)新互聯(lián):成立于2013年為各行業(yè)開拓出企業(yè)自己的“網站建設”服務,為上1000+公司企業(yè)提供了專業(yè)的網站設計、成都網站設計、網頁設計和網站推廣服務, 按需搭建網站由設計師親自精心設計,設計的效果完全按照客戶的要求,并適當的提出合理的建議,擁有的視覺效果,策劃師分析客戶的同行競爭對手,根據客戶的實際情況給出合理的網站構架,制作客戶同行業(yè)具有領先地位的。

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

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

1、使用對比

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

場景一:定義字符串

舊寫法: 

 
 
 
 
  1. String str = "Hello, Java."; 

新寫法: 

 
 
 
 
  1. var s = "Hello, Java."; 

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

場景二:數值相加

舊寫法: 

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

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

新寫法: 

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

場景三:集合

舊寫法: 

 
 
 
 
  1. List list = new ArrayList<>();  
  2. list.add("Hello");  
  3. list.add("Java"); 
  4. 新寫法: 

     
     
     
     
    1. var list = new ArrayList<>();  
    2. list.add("Hello");  
    3. list.add("Java"); 

    場景四:循環(huán)

    舊寫法: 

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

    新寫法: 

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

    場景五:配合 Lambda 使用

    舊寫法: 

     
     
     
     
    1. List flist = list.stream().filter(v ->  
    2.                 v.equals("Java")).collect(Collectors.toList());  
    3. System.out.println(flist); 
    4. 新寫法: 

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

      2、優(yōu)點分析

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

      ① 提高了可讀性

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

       
       
       
       
      1. InternationalCustomerOrderProcessor> orderProcessor =   
      2.     createInternationalOrderProcessor(customer, order); 

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

       
       
       
       
      1. var orderProcessor = createInternationalOrderProcessor(customer, order); 

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

      ② 命名對齊

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

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

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

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

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

      3、使用規(guī)則 & 反例

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

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

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

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

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

      反例二:中途類型更改

      反例三:全局變量

      反例四:作為返回值

      4、原理分析

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

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

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

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

      總結

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


      分享題目:Java新特性:數據類型可以扔掉了?
      分享路徑:http://www.5511xx.com/article/ccshsss.html