go语言var 和make_Var和语言设计
go語言var 和make
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 。 它幫助我認識到在特殊情況下排序性很重要,這對于調用者也很重要,因此我不得不將方法的返回類型也更改為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
go語言var 和make
總結
以上是生活随笔為你收集整理的go语言var 和make_Var和语言设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jakarta ee_在等待Jakart
- 下一篇: 男朋友用英语怎么说 如何用英语表达男朋友