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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Var和语言设计

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Var和语言设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java中的var是什么

Java 10中引入的var預定義類型使您可以在為變量分配值時聲明局部變量,而無需指定變量的類型。 當您為變量分配值時,表達式的類型已經定義了變量的類型,因此沒有理由在行的左側再次鍵入類型。 例如,當您有一些帶有許多泛型的復雜長類型時,這特別好

HashMap<String,TreeMap<Integer,String> myMap = mapGenerator();

您可以在先前的Java版本中繼承的泛型類型,但是現在您只需鍵入

var myMap = mapGenerator();

這比以前的版本更簡單,并且大多數時候可讀性更高。 var的目的主要是可讀性。 重要的是要了解,以這種方式聲明的變量將具有類型,并且此新的預定義類型(不是關鍵字)的引入不會使Java成為動態語言。 您可以通過某些方式做到這一點,這是您以前無法做到的,或者只能以更冗長的方式做到。 例如,當您將匿名類的實例分配給變量時,可以通過var聲明的變量調用該類中的聲明方法。 例如:

var m = new Object{ void z(){} } mz();

您可以調用方法z()但代碼

Object m = new Object{ void z(){} } mz();

無法編譯。 您可以這樣做,因為匿名類實際上在其誕生時就有一個名稱,因此當實例分配給聲明為Object類型的變量時,它們只會丟失名稱。

var關鍵字有一些陰暗的部分。 這樣,我們違反了實例化具體類的一般規則,但是將變量聲明為接口。 這是一個通常在Java中通常遵循的通用抽象規則。 創建返回HashMap的方法時,通常將返回值聲明為Map 。 這是因為HashMap是返回值的實現,因此與調用者無關。 我在返回類型中聲明的是我返回實現Map接口的東西。 我的工作方式是我自己的責任。 同樣,如果可能的話,我們通常將類中的字段聲明為某種接口類型。 局部變量也應遵循相同的規則。 幾次,當我聲明要Set的局部變量但對實際值是TreeSet然后鍵入代碼時,對我很有幫助。 然后我意識到我使用的不是Set而是SortedSet某些功能。 它幫助我意識到sorting-ness在特殊情況下很重要,并且對于調用者也很重要,因此我不得不將方法的返回類型也更改為SortedSet 。 請注意,此示例中的SortedSet仍然是接口,而不是實現類。

通過使用var我們將失去它,并且獲得了稍微簡單一些的源代碼。 一如既往,這是一個折衷。 在使用局部變量的情況下,就源代碼而言,該變量的使用與聲明很接近,因此開發人員可以一目了然地看到什么是正在發生的事情,因此這種折衷的“壞”方面是可以接受的。 在方法返回值或字段的情況下,無法進行相同的折衷。 這些類成員的使用可以在不同的類,不同的模塊中。 看到這些值的所有用法不僅很困難,而且也可能是不可能的,因此,這里我們仍然沿用舊的方式:聲明類型。

var的未來(只是想法)

在某些情況下,甚至不能將var用于局部變量。 很多時候,我們有以下編碼模式:

final var variable; // this does not work in Java 11 if ( some condition ) { variable = expression_1 // do something here } else { variable = expression_2 // do something here }

在這里我們不能使用var因為在聲明本身上沒有分配變量的表達式。 但是,編譯器可以擴展。 從現在開始,我所談論的不是Java,而是現在。 這就是我想象的將來的版本。

如果結構簡單并且“在這里做某事”為空,則可以將結構轉換為三元運算符:

final var variable = some condition ? ( expression_1 ) : (expression_2) var variable = some condition ? ( expression_1 ) : (expression_2)

在這種情況下,即使我們使用Java的舊版本,例如Java 11,也可以使用var聲明。但是,請小心!

var h = true ? 1L : ? 1L : 3.3 ;

在此示例中,變量h的實際類型是什么? Number ? 三元運算符具有復雜且特殊的類型強制規則,由于兩個表達式彼此靠近,通常不會引起任何問題。 如果我們讓上述結構使用類似的類型強制,則表達式彼此之間的距離并不那么緊密。 到目前為止,Java的距離足夠遠,不允許使用var類型定義。 我個人的觀點是,應在將來的某個時候擴展var聲明,以允許使用上述結構,但僅當兩個(或兩個或更復雜的結構)表達式具有完全相同的類型時才可以。 否則,我們可能最終得到一個表達式,該表達式導致一個int ,另一個表達式導致一個String ,那么變量的類型將是什么? 回答前請勿偷看圖片!

(這個很好的例子是Nicolai Parlog給出的。)

我還可以想象,將來我們將擁有類似于Scala val東西,它是Java 11中的final var 。我不喜歡var vs. val命名。 這是極度性感和怪異的,但很容易將一個人誤認為另一個人。 但是,如果我們有一個以final關鍵字開頭的局部變量聲明,那么為什么之后需要var關鍵字呢?

最后,我確實相信var是Java 11中的一個很棒的工具,但是我也希望它的作用將來會得到擴展。

翻譯自: https://www.javacodegeeks.com/2019/03/var-language-design.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Var和语言设计的全部內容,希望文章能夠幫你解決所遇到的問題。

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