var 是 Java 開發的好朋友啊!
阿新 • • 發佈:2018-11-21
簡評: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 也不會因此變成動態型別分配語言,這僅僅是對區域性變數多了一種定義方式。
總結下
- Var 是我們的好朋友;
- Java var != JavaScript var;
- Var 解決了你顯示宣告變數的一些麻煩,但他們依然存在;
- Var 宣告的變數和顯示宣告的變數是一模一樣的;
- Var 型別變數不會影響到你其他的程式碼;
- 多瞭解一下總不會錯吧!
原文連結: Java Developers: var Is Your Friend • Todd Ginsbergtodd.ginsberg.com