Java中Optional.of()方法及源碼解析(非常詳細(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)鍵部分解析如下:
EMPTY
:Optional
類的一個(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)文章
MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決
在使用MyBatis編寫Mapper XML時(shí),有時(shí)會遇到比較操作符需要進(jìn)行轉(zhuǎn)義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉(zhuǎn)義問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Java?Mybatis的初始化之Mapper.xml映射文件的詳解
這篇文章主要介紹了Java?Mybatis的初始化之Mapper.xml映射文件的詳解,解析完全局配置文件后接下來就是解析Mapper文件了,它是通過XMLMapperBuilder來進(jìn)行解析的2022-08-08SpringMVC中事務(wù)是否可以加在Controller層的問題
這篇文章主要介紹了SpringMVC中事務(wù)是否可以加在Controller層的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Spring事件監(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