簡評:Java var != JavaScript var匾灶。
Java 10 中引入了新的語法用于局部變量類型推斷,很多開發(fā)者有所疑惑租漂,希望這篇文章能幫到你阶女。
什么是類型推斷
其實(shí)在 Java 中類型推斷早就存在了,看下下面的例子:
public void doSomething() {
final List<String> names = new ArrayList<String>();
// ^^^^^^------- Redundant
...
}
在這個例子中給 ArrayList
定義持有的類型就沒必要了哩治,因?yàn)?List<String>
已經(jīng)定義了我們需要的類型 String
秃踩,在 Java 7 中增加了類型推斷,這時例子可以直接寫成
public void doSomething() {
final List<String> names = new ArrayList<>();
// ^^------ Inferred!
...
}
這兩種寫法是完全合法的业筏,而且最終會形成一樣的字節(jié)碼憔杨。對經(jīng)常使用泛型的開發(fā)者來說,可能早就對上面的類型推斷寫法習(xí)以為常驾孔。
那什么是局部變量類型推斷芍秆?
即能推斷出方法中局部變量的類型,這是 Java 10 中新增的特性翠勉,對應(yīng)關(guān)鍵詞 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 的使用不局限于函數(shù)內(nèi)聲明的變量,同時也可以用于循環(huán)的索引:
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 嗎朽们?不是的怀读,老方法一樣完美支持。
這樣的做法危險嗎骑脱?
一個字:不菜枷。
簡單說它是受限于它們存在的方法(或循環(huán)聲明)的范圍。這意味著除了聲明它們的方法的開發(fā)之外叁丧,人們不編寫依賴于這些類型的代碼啤誊。
還有大家會有一個疑惑,很多語言也是不需要定義類型的拥娄,完全由編譯器搞定蚊锹,以 JavaScript 舉例:
var x = "Todd"
簡單吧,x 是 String
類型的稚瘾,但是在 JS 中能重新定義類型牡昆,比如:
var x = "Todd"
x = 42 // Now it's an int?!
像這種 Java 以后是不是也不用考慮變量類型了?錯摊欠,和JS 不一樣丢烘,Java 中的 var 只能在局部變量使用外,同時是不能重復(fù)賦值的凄硼,就拿上面的例子铅协,會導(dǎo)致編譯錯誤:
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 一點(diǎn)都不危險,Java 也不會因此變成動態(tài)類型分配語言摊沉,這僅僅是對局部變量多了一種定義方式狐史。
總結(jié)下
- Var 是我們的好朋友;
- Java var != JavaScript var说墨;
- Var 解決了你顯示聲明變量的一些麻煩骏全,但他們依然存在;
- Var 聲明的變量和顯示聲明的變量是一模一樣的尼斧;
- Var 類型變量不會影響到你其他的代碼姜贡;
- 多了解一下總不會錯吧!
原文鏈接:Java Developers: var Is Your Friend
推薦閱讀:改進(jìn) GitHub 工作流的 15 個建議