var 是 Java 開發的好朋友啊!

簡評:Java var != JavaScript var。

Java 10 中引入了新的語法用於局部變量類型推斷,不少開發者有所疑惑,但願這篇文章能幫到你。java

什麼是類型推斷

其實在 Java 中類型推斷早就存在了,看下下面的例子:函數

public void doSomething() {
    final List<String> names = new ArrayList<String>();
                                         //  ^^^^^^------- Redundant
    ...
}

在這個例子中給 ArrayList 定義持有的類型就不必了,由於 List<String> 已經定義了咱們須要的類型 String ,在 Java 7 中增長了類型推斷,這時例子能夠直接寫成post

public void doSomething() {
    final List<String> names = new ArrayList<>();
                                         // ^^------ Inferred!
    ...
}

這兩種寫法是徹底合法的,並且最終會造成同樣的字節碼。對常常使用泛型的開發者來講,可能早就對上面的類型推斷寫法習覺得常。this

那什麼是局部變量類型推斷?

即能推斷出方法中局部變量的類型,這是 Java 10 中新增的特性,對應關鍵詞 var,看個例子 :code

public void doSomething() {
    final ??? name = "Todd";
}

name 是什麼類型,很明顯是 String,而 Java 10 就可讓編譯器幫咱們判斷其類型,咱們只要寫成下面的形式:索引

public void doSomething() {
    final var name = "Todd";   // name is inferred as a String!
}

var 的使用不侷限於函數內聲明的變量,同時也能夠用於循環的索引:ip

final List<String> names = new ArrayList<>();

public void doSomething() {
    for(var name: names) {
        System.out.println("Name: " + name);
    }
    for(var i = 0; i < names.size(); i++) {
        System.out.println("Name: " + names.get(i));
    }
}

我必須使用 var 嗎?不是的,老方法同樣完美支持。開發

這樣的作法危險嗎?

一個字:不。get

簡單說它是受限於它們存在的方法(或循環聲明)的範圍。這意味着除了聲明它們的方法的開發以外,人們不編寫依賴於這些類型的代碼。編譯器

還有你們會有一個疑惑,不少語言也是不須要定義類型的,徹底由編譯器搞定,以 JavaScript 舉例:

var x = "Todd"

簡單吧,x 是 String 類型的,可是在 JS 中能從新定義類型,好比:

var x = "Todd"
x = 42  // Now it's an int?!

像這種 Java 之後是否是也不用考慮變量類型了?錯,和JS 不同,Java 中的 var 只能在局部變量使用外,同時是不能重複賦值的,就拿上面的例子,會致使編譯錯誤:

public void doSomething() {
    var x = "Todd";
    x = 42;    // Compiler fails on this line: 
               // Error: java: incompatible types: int cannot be converted to java.lang.String
}

因此 var 一點都不危險,Java 也不會所以變成動態類型分配語言,這僅僅是對局部變量多了一種定義方式。

總結下

  1. Var 是咱們的好朋友;
  2. Java var != JavaScript var;
  3. Var 解決了你顯示聲明變量的一些麻煩,但他們依然存在;
  4. Var 聲明的變量和顯示聲明的變量是如出一轍的;
  5. Var 類型變量不會影響到你其餘的代碼;
  6. 多瞭解一下總不會錯吧!
原文連接: Java Developers: var Is Your Friend • Todd Ginsberg​todd.ginsberg.com
相關文章
相關標籤/搜索