1. 程式人生 > >var 是 Java 開發的好朋友啊!

var 是 Java 開發的好朋友啊!

簡評:Java var != JavaScript var。

Java 10 中引入了新的語法用於區域性變數型別推斷,很多開發者有所疑惑,希望這篇文章能幫到你。

什麼是型別推斷

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

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

在這個例子中給 ArrayList

 定義持有的型別就沒必要了,因為 List<String> 已經定義了我們需要的型別 String ,在 Java 7 中增加了型別推斷,這時例子可以直接寫成

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

這兩種寫法是完全合法的,而且最終會形成一樣的位元組碼。對經常使用泛型的開發者來說,可能早就對上面的型別推斷寫法習以為常。

那什麼是區域性變數型別推斷?

即能推斷出方法中區域性變數的型別,這是 Java 10 中新增的特性,對應關鍵詞 var,看個例子 :

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

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

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

var 的使用不侷限於函式內宣告的變數,同時也可以用於迴圈的索引:

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 嗎?不是的,老方法一樣完美支援。

這樣的做法危險嗎?

一個字:不。

簡單說它是受限於它們存在的方法(或迴圈宣告)的範圍。這意味著除了宣告它們的方法的開發之外,人們不編寫依賴於這些型別的程式碼。

還有大家會有一個疑惑,很多語言也是不需要定義型別的,完全由編譯器搞定,以 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