java枚舉返回字符串_Java新特性:數據類型可以扔掉了?

e6904425c26cb6dbbb4989d82a65c626.gif?關注“腳本之家”,與百萬開發者在一起

d288d74adbd51cf2c29d44376e8a17ba.png

作者 | 王磊

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

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

710919f055361aed664a4494d32cf474.png

枚舉:盡管在 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

34ced6337937998adc6d531b298d60a0.png

1db8d287301a58e7f4f18b1ab628011e.png

反例二:中途類型更改

94bf62c163a37de586fb9a6aa5dd059c.png

反例三:全局變量

c67c3903f2b1889318e4cbf4468c7cf0.png


反例四:作為返回值

d83cbf9d3ecd7f85a07d68d3bf415ba8.png


4、原理分析

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

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

284bf4a0f7d043eb9f9cab16f0a12e78.png

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

81fe9c2aa618aacbdea5186bd1a727dc.png

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

總結

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

推薦閱讀:

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

4ae1a8efa1bb52e1b6119d3d43d568e7.png

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

👇🏻👇🏻👇🏻1a88f1a13e9d3a2c0fae6a2c7142427e.png

49520c97cb8b9e91a2e0530093e305aa.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea查看類和方法的結構圖

查看類的結構圖 1.選中需要查看的類或者方法 2.點擊右鍵選中【Diagrams】 效果如下,綠色的是接口,藍色的是類

OC中的點語法

main.m // 點語法-編譯器特性&#xff0c;編譯器遇到點語法會自動展開成相應的 //語法 //為了讓其他語言的程序員能快速入手OC加入了點語法 //點語法的本質還是方法調用&#xff0c;不是訪問成員變量 //&#xff08;區別java&#xff0c;java的點語法是訪問成員變量 //OC里面就…

華為新出的鴻蒙,華為發出新計劃:2021年完成3億鴻蒙用戶,你會給你手機嘗試嗎...

隨著2020年的首批內測結束&#xff0c;華為目前支持鴻蒙系統的機型再度擴大&#xff0c;在2021年3月份&#xff0c;舉辦的線下鴻蒙開發者論壇上&#xff0c;華為方負責人也明確表示&#xff0c;2021年是鴻蒙操作系統的起始。先來看一下鴻蒙系統的發展史&#xff0c;以及目前開發…

程序語言基礎:解釋程序基本原理筆記

1、解釋程序的概念 解釋程序是在運行用戶程序時&#xff0c;直接執行源程序或源程序的中間表示。解釋程序不產生源程序的目標程序。 解釋程序實現高級語法的三種方式如下圖&#xff1a; 方式A&#xff1a;直接對整個源程序進行逐個字符的檢查、進行詞法、語法分析和語義分析后就…

微軟登錄界面加載不出_微軟要硬了,做出這個目前最好用的瀏覽器

眾所周知&#xff0c;微軟能打造出一個全球通用的系統&#xff0c;但就是做不出一個能用的瀏覽器。IE 瀏覽器的黑歷史就不提了&#xff0c;即使后來洗心革面&#xff0c;推出了基于 Win 10 的 Edge 瀏覽器&#xff0c;也還是難以挽尊市場份額甚至不如老前輩 IE。Edge 雖然功能比…

阻塞隊列(BlockingQueue)

阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作是&#xff1a;在隊列為空時&#xff0c;獲取元素的線程會等待隊列變為非空。當隊列滿時&#xff0c;存儲元素的線程會等待隊列可用。阻塞隊列常用于生產者和消費者的場景&#xff0c;生產者是往隊列里添…

一維數組對象轉成二維數組

一、關于PHP把裝著item為對象的一維數組轉成二維數組的疑問 背景&#xff1a;新增帖子的時候&#xff0c;選擇標簽時&#xff0c;可以選擇多個&#xff0c;后端接口是需要傳入的是一個二維數組。 /*** Title 修改精選內容* Params $id 記錄ID* Params $tags …

android自定義控件是一個 內部類 如何在xml中引用,android?自定義view屬性

android自定義view屬性一個完美的自定義控件也可以添加xml來配置屬性和風格。要實現這一點&#xff0c;可按照下列步驟來做&#xff1a;1) 添加自定義屬性到xml文件中2) 在xml的中&#xff0c;指定屬性的值3) 在view中獲取xml中的值4) 將獲取的值應用到view中下面繼續舉例說明&…

電腦操作系統維護10條基礎知識!

電腦操作系統是電腦的核心&#xff0c;我們平時如何維護電腦操作系統?下面是小編分享是電腦系統維護基礎知識&#xff0c;一起來看一下吧。1、經常進行“磁盤清理”和磁盤碎片整理”當硬盤用久了&#xff0c;無數次的新增、更改和刪除程序和文件后&#xff0c;就會造成很多斷斷…

光子瀏覽器_煙臺招聘信息煙臺光子信息科技有限公司招聘(五險一金,餐補)...

↑煙臺招聘信息網點擊關注哦匯集煙臺市招聘信息&#xff0c;含蓋煙臺人才網&#xff0c;煙臺招聘會&#xff0c;煙臺招聘網、煙臺優秀企業、事業單位等優質工作崗位及招聘信息&#xff0c;煙臺求職找工作和煙臺兼職資訊平臺… 【溫馨提示】&#xff1a;因網絡詐騙現象較多&…

DES加密

DES采用了64位的分組長度和56位的密鑰長度&#xff0c;是對稱加密的一種。 DES的理論進化主線是 1945年Shannon大神提出的交替使用混淆&#xff08;使密文與密鑰的統計關系變復雜&#xff09;和擴散&#xff08;使明文與密文的統計關系變復雜&#xff09;的乘積密碼&#xff08…

計算機系統基礎:輸入輸出技術知識筆記

1、內存與接口的編址方式 1.1 內存和接口地址獨立編址方法 內存地址和接口地址是兩個完全獨立和相互隔離的地址空間。訪問數據的指令也不同&#xff0c;接口只有讀寫指令&#xff0c;其余都是內存指令。 特點&#xff1a;接口和內存指令容易區分&#xff0c;但接口指令太少、功…

小米max2 android p,這就是小米Max2?6.4英寸超大屏幕配置大升級

標簽&#xff1a;小米手機(3463)小米(3233)雖說今年上半年小米6的重磅機型會是小米6&#xff0c;但隨著小米Max在官方商城的下架&#xff0c;這款巨屏手機的更新換代產品已經在網絡上浮出水面。根據知名圖形測試網站GFXBench最新公布的信息顯示&#xff0c;一款代號為Oxygen的小…

winform直接控制云臺_速學指南,2分鐘學會Feiyu pocket口袋云臺的隱藏功能操作

上周三&#xff0c;Feiyu pocket口袋云臺相機正式發布&#xff0c;重量僅115g&#xff0c;單手可持&#xff0c;可拍攝 4K/60fps高清畫面&#xff1b;6軸混合防抖技術加持&#xff0c;賦予軌跡延時、全域模式、慢動作、全跟隨等模式更專業、高效的拍攝體驗。Feiyu pocket口袋云…

Python中處理DataFrame,R繪圖

IN Pythonfrom pandas import DataFrame,Seriesimport pandas as pdimport numpy as npdata pd.read_csv(rC:\Users\lxy\Desktop\工作相關\工作報告KPI\pydata-book-master\ch06\ex5.csv)data.index.namexdata.to_csv(D:\df.csv)IN R> library(ggplot2)> df <- read.…

ThreadPoolTaskExecutor和ThreadPoolExecutor區別

初學者很容易看錯&#xff0c;如果沒有看到spring或者JUC源碼的人肯定是不太了解的。 ThreadPoolTaskExecutor是spring core包中的&#xff0c;而ThreadPoolExecutor是JDK中的JUC。ThreadPoolTaskExecutor是對ThreadPoolExecutor進行了封裝處理。 ThreadPoolExecutor ThreadP…

電腦技巧:如何解決大部分的電腦防彈窗廣告

相信很多人都有這種情況&#xff0c;打開電腦,電腦上全部各種廣告彈窗,或者在辦公、追劇的時候,電腦突然就彈出了一條&#xff0c;是不是很煩人&#xff0c;這幾招不用借助軟件&#xff0c;就能解決彈窗的方法不防一試。 方法一&#xff1a; 第一種方法&#xff0c;可以對付部分…

c 跨平臺android,Unity 使用C/C++ 跨平臺終極解決方式(PC,iOS,Android,以及支持C/C++的平臺)...

PC的事實上根本不用說&#xff0c;畢竟C#和C交互的文章已經夠多了&#xff0c;當然我自覺得經過幾次折騰后。差點兒全部游戲須要到的操作我都掌握了(各種傳參方法&#xff0c;各種坑&#xff0c;不懂的能夠留言問。盡管基本上沒人看。哈哈)廢話不多說&#xff0c;我們主要來講兩…

hades武器第四形態解鎖_凱多的第四個技能預告——冰凍!

在《海賊王》中&#xff0c;四皇凱多被譽為“海陸空最強生物”&#xff0c;能夠變成神龍&#xff0c;如果不出意外的話&#xff0c;凱多應該是動物系幻獸種神龍果實的能力者。畢竟凱多的海賊團就叫做“百獸海賊團”&#xff0c;手下也都是動物系果實能力者&#xff0c;能夠降服…