天天看點

JDK10的新特性:本地變量類型var

目錄

  • ​​簡介​​
  • ​​為什麼我們需要var​​
  • ​​var使用在什麼地方​​
  • ​​var不能用在什麼地方​​
  • ​​其他var的特點​​
  • ​​總結​​

簡介

java以面向對象的特性顯著于世并得到了蓬勃的發展。在語言的發展過程中,為了讓java語言更加簡潔和友善使用,JDK也在不斷的進行改進。

今天本文将要介紹一下JDK10中引入的本地變量類型var。

為什麼我們需要var

類型推斷是很多程式設計語言都具有的特性,編譯器可以在我們不指定具體變量類型的情況下推斷出該變量的實際類型。

類型推斷的出現,可以讓程式員的代碼更加靈活,利于維護和編寫。其實我們一直都有使用到類型推斷。

JDK8中引入的lambda表達式就是類型推斷的一個非常有用的例子:

int maxWeight = blocks.stream().filter(b -> b.getColor() == BLUE).mapToInt(Block::getWeight)
.max();      

上面的例子中blocks是一個Stream類型,在filter中使用到的b實際上就沒有指定其類型,它的類型是從Stream中推斷出來的。

再看一個線程池的例子:

ExecutorService executorService= Executors.newSingleThreadExecutor();
Runnable runnable=new Runnable() {
    @Override
    public void run() {
        log.info("inside runnable");
     }
 };
 executorService.submit(runnable);      

很多時候,我們從變量的名字就已經知道了這個變量到底是什麼類型的,那麼上面的例子如果用var來改寫就可以像這樣:

var executorService= Executors.newSingleThreadExecutor();
var runnable=new Runnable() {
    @Override
    public void run() {
         log.info("inside runnable");
     }
 };
executorService.submit(runnable);      

代碼更加簡潔,程式員寫起來也更加友善。

如果上面的例子還不能夠提起你使用var的興趣,那麼下面的例子你一定很樂意使用var了。

假如我們有一個非常非常長的類名:

ItIsAVeryLongNameJavaClass itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();      

寫起來是不是超級麻煩,代碼看起也非常備援,這時候我們就可以将其簡化為:

var itIsAVeryLongNameJavaClass= new ItIsAVeryLongNameJavaClass();      

var使用在什麼地方

首先var代表的是本地變量,是以,隻有本地變量才能夠使用var。

其次var在定義的時候就必須被初始化:

var a;  //Invalid Declaration - - Cannot use 'var' on variable without initializer
var a = 100; //Valid Declaration      

var可以用在for loop中:

for ( var element : elementList){
    //do something for element
}      

或者這種:

for ( var i = 0 ; i < elementList.size(); i++ ){
    System.out.println( elementList.get(i) );
}      

var不能用在什麼地方

因為var是本地變量類型,它不能用在類變量的定義中,不能用在方法變量中,不能用在構造函數中,不能用在方法傳回中,不能用在catch變量定義中。

public class VarIncorrectUsage {
     
    //var user;    //Not allowed as class fields
         
    //public VarIncorrectUsage(var param){    //Not allowed as parameter 
    //}
 
    /*try{
         
    } catch(var exception){    //Not allowed as catch formal 
 
    }*/
 
    /*public var returnMethod(){  //Not allowed in method return type
        return null;
    }*/
 
    /*public Integer parameterMethod( var input ){  //Not allowed in method parameters
        return null;
    }*/
}      

注意,var在JVM無法推斷其類型或者可以有很多類型的情況下不能夠使用:

var ints = {1, 2, 3};
var lambda = a -> a;
var methodReference = String::concat;      

上面例子中數組初始化,lambda表達式和方法引用都是不能用var的。

其他var的特點

var不是關鍵字,是以我們可以使用var來做變量名字:

var var = 2;   //Valid Declaration
         
int var = 2;   //Also valid Declaration      

因為var是JDK10引入的概念,是以不是向下相容的。不能夠用低版本的編譯器來編譯var。

var不會影響性能,因為var是在代碼編譯器進行的類型推斷,是以并不會影響到性能。

總結

var是JDK10中引入的一個新的特性,希望大家可以喜歡。

本文的例子​​https://github.com/ddean2009/

learn-java-base-9-to-20​​

本文作者:flydean程式那些事