欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

于是我們也從該開(kāi)源框架中看到了對(duì)于我來(lái)說(shuō)一個(gè)比較陌生的身影—val,于是便開(kāi)始一小波的學(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是用于聲明局部變量的,它會(huì)根據(jù)初始化的表達(dá)式來(lái)對(duì)變量類型進(jìn)行推斷。使用val的局部變量會(huì)被聲明為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就是一種類型推斷的語(yǔ)法糖,在編譯之后會(huì)進(jìn)行desugar的,我們來(lái)看一下以上代碼經(jīng)過(guò)編譯之后變成什么樣子

// 以下是JDK11反編譯出來(lái)的
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)槲覀冊(cè)诜盒椭胁⑽粗付ň唧w的類型,所以類型推斷出來(lái)的就是HashMap<Object,Object>的類型了,我們可以看到在循環(huán)中,也是很正確的推斷出了Entry類型。

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

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

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

在這里插入圖片描述

在這里插入圖片描述

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

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

1.2 lombok.var

還是來(lái)看官方文檔的介紹

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很像,只不過(guò)它標(biāo)記的局部變量并不是final的。

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

2.1 如何使用?

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

還是一樣我們來(lái)看一下源碼和編譯之后的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)類型語(yǔ)言,為啥要推出這么一個(gè)關(guān)鍵字呢?

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

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

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

三、該如何抉擇呢?

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

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

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

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

Reference:

總結(jié)

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

相關(guān)文章

  • Java中的循環(huán)筆記整理(必看篇)

    Java中的循環(huán)筆記整理(必看篇)

    下面小編就為大家?guī)?lái)一篇Java中的循環(huán)筆記整理(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java中數(shù)組的一些常見(jiàn)操作和技巧分析

    Java中數(shù)組的一些常見(jiàn)操作和技巧分析

    這篇文章主要給大家介紹了關(guān)于Java中數(shù)組的一些常見(jiàn)操作和技巧分析的相關(guān)資料,數(shù)組(Array)是Java中的一種引用數(shù)據(jù)類型,是多個(gè)相同類型數(shù)據(jù)一定順序排列的集合,并使用一個(gè)名字命名,并通過(guò)編號(hào)的方式對(duì)這些數(shù)據(jù)進(jìn)行統(tǒng)一管理,需要的朋友可以參考下
    2023-08-08
  • Jmeter工作原理及常見(jiàn)錯(cuò)誤解析

    Jmeter工作原理及常見(jiàn)錯(cuò)誤解析

    這篇文章主要介紹了Jmeter工作原理及常見(jiàn)錯(cuò)誤解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 關(guān)于SpringBoot配置文件加載位置的優(yōu)先級(jí)

    關(guān)于SpringBoot配置文件加載位置的優(yōu)先級(jí)

    這篇文章主要介紹了關(guān)于SpringBoot配置文件加載位置的優(yōu)先級(jí),我們也可以通過(guò)spring.config.location來(lái)改變默認(rèn)的配置文件位置,項(xiàng)目打包好后,我們可以通過(guò)命令行的方式在啟動(dòng)時(shí)指定配置文件的位置,需要的朋友可以參考下
    2023-10-10
  • 初識(shí)Java設(shè)計(jì)模式適配器模式

    初識(shí)Java設(shè)計(jì)模式適配器模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式適配器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 使用@EnableWebMvc輕松配置Spring MVC

    使用@EnableWebMvc輕松配置Spring MVC

    這篇文章主要為大家介紹了使用@EnableWebMvc輕松配置Spring MVC實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 用Java進(jìn)行zip文件壓縮與解壓縮

    用Java進(jìn)行zip文件壓縮與解壓縮

    這篇文章主要介紹了用Java進(jìn)行zip文件壓縮與解壓縮的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • java 分布式與集群的區(qū)別和聯(lián)系

    java 分布式與集群的區(qū)別和聯(lián)系

    本文主要介紹了java分布式與集群的區(qū)別和聯(lián)系,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(概要分析)

    Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(概要分析)

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • SpringBoot2零基礎(chǔ)到精通之?dāng)?shù)據(jù)庫(kù)專項(xiàng)精講

    SpringBoot2零基礎(chǔ)到精通之?dāng)?shù)據(jù)庫(kù)專項(xiàng)精講

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇我們來(lái)學(xué)習(xí)如何連接數(shù)據(jù)庫(kù)進(jìn)行操作
    2022-03-03

最新評(píng)論