亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中Optional.of()方法及源碼解析(非常詳細(xì)!)

 更新時(shí)間:2024年06月08日 08:55:43   作者:c137范特西  
這篇文章主要給大家介紹了關(guān)于Java中Optional.of()方法及源碼解析的相關(guān)資料,Java中java.util .Optional類的of()方法用于獲得該Optional類中具有指定類型的指定值的一個(gè)實(shí)例,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在Java中,Optional.of() 方法是 Optional 類中用于創(chuàng)建包含非空值的 Optional 對象的靜態(tài)方法。在本文中,我們將深入解析 Optional.of() 的語法、使用場景,并通過多個(gè)示例詳細(xì)說明。

方法解析

1. Optional.of() 方法的語法

public static <T> Optional<T> of(T value)
  • 參數(shù): 非空的值 value。
  • 返回值: 包含指定值的 Optional 對象。

2. 使用示例

2.1 創(chuàng)建包含字符串的 Optional 對象

Optional<String> optional = Optional.of("Hello, World!");

上述代碼創(chuàng)建了一個(gè)包含字符串 “Hello, World!” 的 Optional 對象。由于傳入的值是非空的,因此不會引發(fā) NullPointerException。

2.2 創(chuàng)建包含自定義對象的 Optional 對象

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Person person = new Person("John Doe");
Optional<Person> optionalPerson = Optional.of(person);

這個(gè)示例中,我們定義了一個(gè) Person 類,并使用 Optional.of() 創(chuàng)建了一個(gè)包含 Person 對象的 Optional 對象。

2.3 注意事項(xiàng)

Optional<String> optional = Optional.of(null); // 會拋出 NullPointerException

Optional.of() 要求傳入的值不能為 null,否則會拋出 NullPointerException。在上述示例中,傳入了 null 值,導(dǎo)致拋出異常。

3. 使用場景

Optional.of() 適用于確定值不為空的情況,提供了一種安全的方式來包裝非空值,避免了空指針異常。但需要注意確保傳入的值非空,否則會引發(fā)異常。

源碼解析

1. Optional.of() 方法的源碼

public static <T> Optional<T> of(T value) {
    return new Optional<>(Objects.requireNonNull(value));
}

上述源碼顯示了 Optional.of() 方法的實(shí)現(xiàn)。以下是對源碼的解析:

  • public static <T> Optional<T> of(T value) {: 這是一個(gè)靜態(tài)方法聲明,返回類型是 Optional<T>,其中 <T> 是泛型參數(shù),表示 Optional 包含的值的類型。參數(shù) value 是需要包裝的非空值。

  • return new Optional<>(Objects.requireNonNull(value));: 在方法體內(nèi),首先使用 Objects.requireNonNull(value) 確保傳入的值不為 null。如果傳入的值為 null,Objects.requireNonNull 方法會拋出 NullPointerException

    然后,通過 new Optional<>(...) 創(chuàng)建一個(gè)新的 Optional 對象,將傳入的非空值包裝在其中。

2. 源碼解析總結(jié)

  • Optional.of() 方法通過 Objects.requireNonNull 確保傳入的值非空,否則拋出 NullPointerException。
  • 創(chuàng)建了一個(gè)新的 Optional 對象,并將傳入的非空值包裝在其中。

3. 注意事項(xiàng)

在使用 Optional.of() 時(shí),一定要確保傳入的值不為 null,否則會導(dǎo)致異常。如果不能確定值是否為 null,建議使用 Optional.ofNullable() 方法。

4. Optional 類的基本結(jié)構(gòu)

在深入解析 Optional.of() 的源碼之前,我們先了解一下 Optional 類的基本結(jié)構(gòu)。Optional 類的核心思想是包裝可能為 null 的值,提供了一些方法來處理這種情況。

public final class Optional<T> {

    private static final Optional<?> EMPTY = new Optional<>();

    private final T value;

    private Optional() {
        this.value = null;
    }

    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

    public static <T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    public boolean isPresent() {
        return value != null;
    }

    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

    // 其他方法省略...
}

上述是 Optional 類的簡化版本,其中包含了 of() 方法的源碼。關(guān)鍵部分解析如下:

  • EMPTYOptional 類的一個(gè)靜態(tài)常量,表示空的 Optional 對象。
  • value:私有字段,用于保存包裝的值。
  • of(T value):靜態(tài)工廠方法,用于創(chuàng)建包含非空值的 Optional 對象。
  • ofNullable(T value):靜態(tài)工廠方法,用于創(chuàng)建包含可能為 null 值的 Optional 對象。
  • empty():靜態(tài)工廠方法,用于創(chuàng)建空的 Optional 對象。
  • isPresent():判斷 Optional 對象是否包含值。
  • get():獲取 Optional 對象中的值,如果值為空則拋出 NoSuchElementException。

6. Optional.of() 源碼解析

現(xiàn)在我們來看一下 Optional.of() 方法的源碼:

public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}

這個(gè)方法非常簡單,它直接調(diào)用 Optional 類的私有構(gòu)造函數(shù) private Optional(T value) 來創(chuàng)建一個(gè)新的 Optional 對象,并將傳入的值包裝在其中。

private Optional(T value) {
    this.value = Objects.requireNonNull(value);
}

在構(gòu)造函數(shù)中,首先通過 Objects.requireNonNull(value) 確保傳入的值非空,否則拋出 NullPointerException。然后將非空值保存在 value 字段中。

這就是 Optional.of() 方法的基本邏輯??傮w來說,Optional 類提供了一種安全地處理可能為 null 值的方式,而 Optional.of() 則是其中的一個(gè)關(guān)鍵方法,用于創(chuàng)建包含非空值的 Optional 對象。

4. 總結(jié)

Optional.of() 是創(chuàng)建包含非空值的 Optional 對象的方法。通過深入解析其語法、使用示例以及注意事項(xiàng),我們更好地理解了該方法的作用和適用場景。在使用時(shí),確保傳入的值非空,以保證安全使用 Optional。在不確定值是否為空的情況下,建議使用 Optional.ofNullable() 方法。

附:Optional.of()和Optional.ofNullable()區(qū)別

Optional.of()或者Optional.ofNullable():創(chuàng)建Optional對象,差別在于of不允許參數(shù)是null,而ofNullable則無限制。

// 參數(shù)不能是null,是null拋異常
Optional<Integer> optional1 = Optional.of(1);
 
// 參數(shù)可以是null
Optional<Integer> optional2 = Optional.ofNullable(null);
 
// 參數(shù)可以是非null
Optional<Integer> optional3 = Optional.ofNullable(2);

空指針異常是導(dǎo)致Java應(yīng)用程序失敗的最常見原因。以前,為了解決空指針異常,Google公司著名的Guava項(xiàng)目引入了Optional類,Guava通過使用檢查空值的方式來防止代碼污染,它鼓勵(lì)程序員寫更干凈的代碼。受到Google Guava的啟發(fā),Optional類已經(jīng)成為Java 8類庫的一部分。Optional實(shí)際上是個(gè)容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測。

通過of(T value)函數(shù)所構(gòu)造出的Optional對象,當(dāng)Value值為空時(shí),依然會報(bào)NullPointerException。

到此這篇關(guān)于Java中Optional.of()方法及源碼解析的文章就介紹到這了,更多相關(guān)Java Optional.of()方法源碼解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 帶大家深入了解Spring事務(wù)

    帶大家深入了解Spring事務(wù)

    Spring框架提供統(tǒng)一的事務(wù)抽象,通過統(tǒng)一的編程模型使得應(yīng)用程序可以很容易地在不同的事務(wù)框架之間進(jìn)行切換. 在學(xué)習(xí)Spring事務(wù)前,我們先對數(shù)據(jù)庫事務(wù)進(jìn)行簡單的介紹。,需要的朋友可以參考下
    2021-05-05
  • MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決

    MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決

    在使用MyBatis編寫Mapper XML時(shí),有時(shí)會遇到比較操作符需要進(jìn)行轉(zhuǎn)義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java?Mybatis的初始化之Mapper.xml映射文件的詳解

    Java?Mybatis的初始化之Mapper.xml映射文件的詳解

    這篇文章主要介紹了Java?Mybatis的初始化之Mapper.xml映射文件的詳解,解析完全局配置文件后接下來就是解析Mapper文件了,它是通過XMLMapperBuilder來進(jìn)行解析的
    2022-08-08
  • SpringMVC中事務(wù)是否可以加在Controller層的問題

    SpringMVC中事務(wù)是否可以加在Controller層的問題

    這篇文章主要介紹了SpringMVC中事務(wù)是否可以加在Controller層的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java工廠模式定義與用法實(shí)例分析

    Java工廠模式定義與用法實(shí)例分析

    這篇文章主要介紹了Java工廠模式定義與用法,結(jié)合具體實(shí)例形式分析了java工廠模式定義、使用相關(guān)操作技巧,并總結(jié)了類圖原理,需要的朋友可以參考下
    2019-07-07
  • Java死鎖的產(chǎn)生原因及解決方法總結(jié)

    Java死鎖的產(chǎn)生原因及解決方法總結(jié)

    Java中的死鎖是指多個(gè)線程同時(shí)占用一些共享資源且彼此相互等待,從而導(dǎo)致所有的線程都被阻塞,不能繼續(xù)執(zhí)行程序的情況,本文小編給大家介紹了Java死鎖的產(chǎn)生原因及解決方法總結(jié),需要的朋友可以參考下
    2023-11-11
  • Spring事件監(jiān)聽機(jī)制之@EventListener實(shí)現(xiàn)方式詳解

    Spring事件監(jiān)聽機(jī)制之@EventListener實(shí)現(xiàn)方式詳解

    這篇文章主要介紹了Spring事件監(jiān)聽機(jī)制之@EventListener實(shí)現(xiàn)方式詳解,ApplicationContext的refresh方法還是初始化了SimpleApplicationEventMulticaster,發(fā)送事件式還是先獲取ResolvableType類型,再獲取發(fā)送監(jiān)聽列表,需要的朋友可以參考下
    2023-12-12
  • 淺談Java中Spring Boot的優(yōu)勢

    淺談Java中Spring Boot的優(yōu)勢

    在本篇文章中小編給大家分析了Java中Spring Boot的優(yōu)勢以及相關(guān)知識點(diǎn)內(nèi)容,興趣的朋友們可以學(xué)習(xí)參考下。
    2018-09-09
  • Java的Semaphore信號量使用及原理解讀

    Java的Semaphore信號量使用及原理解讀

    這篇文章主要介紹了Java的Semaphore信號量使用及原理解讀,Semaphore(信號量)是Java中一個(gè)并發(fā)控制工具,用于控制對共享資源的訪問,它基于計(jì)數(shù)器的原理,可以限制同時(shí)訪問某個(gè)資源的線程數(shù)量,需要的朋友可以參考下
    2023-12-12
  • java hashtable實(shí)現(xiàn)代碼

    java hashtable實(shí)現(xiàn)代碼

    這篇文章介紹了java hashtable實(shí)現(xiàn)代碼,有需要的朋友可以參考一下
    2013-10-10

最新評論