最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從lombok的val和var到JDK的var關(guān)鍵字方式

 更新時(shí)間:2024年05月21日 08:54:59   作者:初心繪流年  
這篇文章主要介紹了從lombok的val和var到JDK的var關(guān)鍵字方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

近期因項(xiàng)目中的開源框架版本升級導(dǎo)致項(xiàng)目的整體jdk版本被迫從萬年的java8升級到了java11

于是我們也從該開源框架中看到了對于我來說一個(gè)比較陌生的身影—val,于是便開始一小波的學(xué)習(xí)

在這里插入圖片描述

一、Lombok中的val和var

1.1 lombok.val

首先看官方文檔介紹:

You can use val as the type of a local variable declaration instead of actually writing the type. When you do this, the type will be inferred from the initializer expression. The local variable will also be made final. This feature works on local variables and on foreach loops only, not on fields. The initializer expression is required.

val is actually a ‘type’ of sorts, and exists as a real class in the lombok package. You must import it for val to work (or use lombok.val as the type). The existence of this type on a local variable declaration triggers both the adding of the final keyword as well as copying the type of the initializing expression which overwrites the ‘fake’ val type.

WARNING: This feature does not currently work in NetBeans.

大致的意思就是val是用于聲明局部變量的,它會根據(jù)初始化的表達(dá)式來對變量類型進(jìn)行推斷。使用val的局部變量會被聲明為final的,它可以使用與foreach的循環(huán)中,val不可以用于成員變量,并且它的初始化表達(dá)式是必須的(即必須在聲明的時(shí)候給出初始化的表達(dá)式)。

使用示例:

public static void main(String[] args){
    val map = new HashMap<>();
    map.put("name","dachengcheng");
    map.put("gender","boy");
    map.put("obj", new Object());

    for (val entry:map.entrySet()){
        System.out.println(entry.getKey()+":"+entry.getValue());
    }
}

其實(shí)val就是一種類型推斷的語法糖,在編譯之后會進(jìn)行desugar的,我們來看一下以上代碼經(jīng)過編譯之后變成什么樣子

// 以下是JDK11反編譯出來的
public static void main(String[] args) {
    HashMap<Object, Object> map = new HashMap();
    map.put("name", "dachengcheng");
    map.put("gender", "boy");
    map.put("obj", new Object());
    Iterator var2 = map.entrySet().iterator();

    while(var2.hasNext()) {
        Entry<Object, Object> entry = (Entry)var2.next();
        PrintStream var10000 = System.out;
        ((PrintStream)entry.getKey()).println((String)entry.getValue());
    }

}

因?yàn)槲覀冊诜盒椭胁⑽粗付ň唧w的類型,所以類型推斷出來的就是HashMap<Object,Object>的類型了,我們可以看到在循環(huán)中,也是很正確的推斷出了Entry類型。

上面不是提到val代表的是final類型的局部變量嗎?為啥反編譯出來的沒有看到final的字樣?

這一點(diǎn)其實(shí)我也很疑惑,不知道是不是因?yàn)镮DEA的工具反編譯問題,或者是因?yàn)镴ava8以上的Effective final的特性導(dǎo)致的沒有final修飾,但實(shí)際是final類型呢?

我們降低一下jdk版本(JDK6)試了一下,發(fā)現(xiàn)結(jié)果仍然一樣,資料找了大半圈沒找到一個(gè)人有合適的說法。于是我試了一下直接用final關(guān)鍵字修飾局部變量

在這里插入圖片描述

在這里插入圖片描述

才發(fā)現(xiàn)是局部變量的final并沒有寫入class文件中,至于為什么,大概是優(yōu)化吧,具體的可能得去看看虛擬機(jī)相關(guān)的知識了,此處暫且不深入了。

局部變量以及參數(shù)中的final,同樣不能提升我們的性能,它甚至不會被寫進(jìn)字節(jié)碼中

1.2 lombok.var

還是來看官方文檔的介紹

var works exactly like val, except the local variable is not marked as final.

The type is still entirely derived from the mandatory initializer expression, and any further assignments, while now legal (because the variable is no longer final), aren’t looked at to determine the appropriate type.For example, var x = "Hello"; x = Color.RED; does not work; the type of x will be inferred to be java.lang.String and thus, the x = Color.RED assignment will fail. If the type of x was inferred to be java.lang.Object this code would have compiled, but that’s not howvar works.

大致意思就是varval很像,只不過它標(biāo)記的局部變量并不是final的。

二、Java中的var關(guān)鍵字

2.1 如何使用?

var關(guān)鍵字其實(shí)作用和上面提到的lombok.vallombok.var是一樣的,也是用于局部變量的類型推斷;var修飾的變量是非final的,如果需要final可以加上final修飾符。

還是一樣我們來看一下源碼和編譯之后的class文件內(nèi)容

源碼

public class ValDemo {
    final String bbb ="111";

    public static void main(String[] args){
        var map = new HashMap<String,String>();
        map.put("aaa","dachengcheng");
        var obj = getObj();
    }
    private static List<List<Map<String, List<Map<String,String>>>>> getObj(){
        // 當(dāng)然現(xiàn)實(shí)當(dāng)中這種返回類型容易被打死,此處只是為了效果演示
        return null;
    }
}

反編譯

public class ValDemo {
    final String bbb = "111";

    public ValDemo() {
    }
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap();
        map.put("aaa", "dachengcheng");
        List<List<Map<String, List<Map<String, String>>>>> obj = getObj();
    }
    private static List<List<Map<String, List<Map<String, String>>>>> getObj() {
        return null;
    }
}

2.2 為什么推出var關(guān)鍵字?

Java作為一個(gè)強(qiáng)類型的靜態(tài)類型語言,為啥要推出這么一個(gè)關(guān)鍵字呢?

我們知道在JavaScript這種弱類型的語言中有var關(guān)鍵字,我想大概是因?yàn)?ldquo;偷懶”吧。

我們知道Java代碼存在很多模版化的聲明,如HasMap<String,String> map = new HashMap<String,String>(), 這種寫法雖然給我們帶來了好處的同時(shí),也帶來了一些書寫上的繁瑣,有些人可能覺得花時(shí)間在書寫這種模板代碼上是在浪費(fèi)時(shí)間,為啥Java就不能幫我們完成這個(gè)事呢? 比如上面提到的List<List<Map<String, List<Map<String,String>>>>>返回類型,真正要寫的那可是一長串,有了var關(guān)鍵字之后就簡單多了,直接var obj = getObj();,在這種情況下相對來說代碼更簡單,至于易讀性是相對的,有的時(shí)候提高了可讀性,有的時(shí)候反而不方便。

當(dāng)然官方對于這個(gè)關(guān)鍵字的由來,大概是因?yàn)殛P(guān)于 2016 年有一個(gè) JDK 增強(qiáng)提議(JEP)在 Java 社區(qū)引起了轟動:JEP 286,感興趣的可以去了解一下。

三、該如何抉擇呢?

其實(shí)該使用誰那完全看個(gè)人喜好了,但是呢我們必須得了解清楚他們之間的區(qū)別,比如lombok.val在書寫的時(shí)候,IDE可能還無法識別它的final特性,可以針對該局部變量進(jìn)行修改,只會在編譯或運(yùn)行的時(shí)候發(fā)現(xiàn)報(bào)錯(cuò)。

而且有的團(tuán)隊(duì)可能會比較抵制lombok,理由大概是一人用lombok,所有人都得用,在某種程度上屬于強(qiáng)買強(qiáng)賣。

所以如果在JDK版本允許的情況下(JDK10及以上),我們可以考慮用jdk自帶的var關(guān)鍵字。

如果是萬年java8的話,又想使用這種語法特性,那么就可以使用lombok.val了。

Reference:

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中synchronized的幾種使用方法

    Java中synchronized的幾種使用方法

    本文主要介紹了Java中synchronized的幾種使用方法,synchronized可用于修飾普通方法、靜態(tài)方法和代碼塊,下面詳細(xì)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 從ElasticSearch中刪除數(shù)據(jù)的幾種常見方式

    從ElasticSearch中刪除數(shù)據(jù)的幾種常見方式

    這篇文章主要給大家介紹了關(guān)于從ElasticSearch中刪除數(shù)據(jù)的幾種常見方式,在Elasticsearch中刪除數(shù)據(jù)可以通過刪除索引或刪除文檔兩種方式實(shí)現(xiàn),需要的朋友可以參考下
    2024-10-10
  • java讀取word文檔,提取標(biāo)題和內(nèi)容的實(shí)例

    java讀取word文檔,提取標(biāo)題和內(nèi)容的實(shí)例

    這篇文章主要介紹了java讀取word文檔,提取標(biāo)題和內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java的Collection集合的常用方法詳解

    Java的Collection集合的常用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java的Collection集合的常用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 淺談SpringCloud的微服務(wù)架構(gòu)組件

    淺談SpringCloud的微服務(wù)架構(gòu)組件

    這篇文章主要介紹了淺談SpringCloud的微服務(wù)架構(gòu)組件,Spring Cloud根據(jù)分布式服務(wù)協(xié)調(diào)治理的需求成立了許多子項(xiàng)目,每個(gè)項(xiàng)目通過特定的組件去實(shí)現(xiàn),需要的朋友可以參考下
    2023-04-04
  • 簡單介紹線性表以及如何實(shí)現(xiàn)雙鏈表

    簡單介紹線性表以及如何實(shí)現(xiàn)雙鏈表

    本文先介紹線性表的幾個(gè)基本組成部分:數(shù)組、單向鏈表、雙向鏈表;隨后給出雙向鏈表的C、C++和Java三種語言的實(shí)現(xiàn),需要的朋友可以參考下
    2015-07-07
  • Java中的ArrayList集合源碼解析

    Java中的ArrayList集合源碼解析

    這篇文章主要介紹了Java中的ArrayList集合源碼解析,ArrayList是一種以數(shù)組實(shí)現(xiàn)的List,與數(shù)組相比,它具有動態(tài)擴(kuò)展的能力,因此也可稱之為動態(tài)數(shù)組,需要的朋友可以參考下
    2023-12-12
  • java操作(DOM、SAX、JDOM、DOM4J)xml方式的四種比較與詳解

    java操作(DOM、SAX、JDOM、DOM4J)xml方式的四種比較與詳解

    java中四種操作(DOM、SAX、JDOM、DOM4J)xml方式的比較與詳解
    2008-10-10
  • SpringBoot事件發(fā)布與監(jiān)聽超詳細(xì)講解

    SpringBoot事件發(fā)布與監(jiān)聽超詳細(xì)講解

    今天去官網(wǎng)查看spring boot資料時(shí),在特性中看見了系統(tǒng)的事件及監(jiān)聽章節(jié),所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot事件發(fā)布和監(jiān)聽的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Spring三種方法的注解自動注入問題

    Spring三種方法的注解自動注入問題

    這篇文章主要介紹了Spring三種方法的注解自動注入問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

呼图壁县| 区。| 峨边| 孝义市| 罗江县| 隆尧县| 唐河县| 台湾省| 惠东县| 阜康市| 抚顺县| 西华县| 米脂县| 宁河县| 临江市| 安福县| 滕州市| 靖安县| 城市| 塘沽区| 双流县| 开远市| 陕西省| 巩留县| 明溪县| 虹口区| 定州市| 蒙阴县| 锦州市| 常宁市| 云和县| 扶余县| 罗江县| 图木舒克市| 云梦县| 郑州市| 松阳县| 通城县| 新民市| 永平县| 清丰县|