Java中Optional.of()方法及源碼解析(非常詳細(xì)!)
前言
在Java中,Optional.of() 方法是 Optional 類中用于創(chuàng)建包含非空值的 Optional 對(duì)象的靜態(tài)方法。在本文中,我們將深入解析 Optional.of() 的語法、使用場(chǎng)景,并通過多個(gè)示例詳細(xì)說明。
方法解析
1. Optional.of() 方法的語法
public static <T> Optional<T> of(T value)
- 參數(shù): 非空的值
value。 - 返回值: 包含指定值的
Optional對(duì)象。
2. 使用示例
2.1 創(chuàng)建包含字符串的 Optional 對(duì)象
Optional<String> optional = Optional.of("Hello, World!");
上述代碼創(chuàng)建了一個(gè)包含字符串 “Hello, World!” 的 Optional 對(duì)象。由于傳入的值是非空的,因此不會(huì)引發(fā) NullPointerException。
2.2 創(chuàng)建包含自定義對(duì)象的 Optional 對(duì)象
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 對(duì)象的 Optional 對(duì)象。
2.3 注意事項(xiàng)
Optional<String> optional = Optional.of(null); // 會(huì)拋出 NullPointerException
Optional.of() 要求傳入的值不能為 null,否則會(huì)拋出 NullPointerException。在上述示例中,傳入了 null 值,導(dǎo)致拋出異常。
3. 使用場(chǎng)景
Optional.of() 適用于確定值不為空的情況,提供了一種安全的方式來包裝非空值,避免了空指針異常。但需要注意確保傳入的值非空,否則會(huì)引發(fā)異常。
源碼解析
1. Optional.of() 方法的源碼
public static <T> Optional<T> of(T value) {
return new Optional<>(Objects.requireNonNull(value));
}
上述源碼顯示了 Optional.of() 方法的實(shí)現(xiàn)。以下是對(duì)源碼的解析:
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方法會(huì)拋出NullPointerException。然后,通過
new Optional<>(...)創(chuàng)建一個(gè)新的Optional對(duì)象,將傳入的非空值包裝在其中。
2. 源碼解析總結(jié)
Optional.of()方法通過Objects.requireNonNull確保傳入的值非空,否則拋出NullPointerException。- 創(chuàng)建了一個(gè)新的
Optional對(duì)象,并將傳入的非空值包裝在其中。
3. 注意事項(xiàng)
在使用 Optional.of() 時(shí),一定要確保傳入的值不為 null,否則會(huì)導(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 類的簡(jiǎn)化版本,其中包含了 of() 方法的源碼。關(guān)鍵部分解析如下:
EMPTY:Optional類的一個(gè)靜態(tài)常量,表示空的Optional對(duì)象。value:私有字段,用于保存包裝的值。of(T value):靜態(tài)工廠方法,用于創(chuàng)建包含非空值的Optional對(duì)象。ofNullable(T value):靜態(tài)工廠方法,用于創(chuàng)建包含可能為null值的Optional對(duì)象。empty():靜態(tài)工廠方法,用于創(chuàng)建空的Optional對(duì)象。isPresent():判斷Optional對(duì)象是否包含值。get():獲取Optional對(duì)象中的值,如果值為空則拋出NoSuchElementException。
6. Optional.of() 源碼解析
現(xiàn)在我們來看一下 Optional.of() 方法的源碼:
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
這個(gè)方法非常簡(jiǎn)單,它直接調(diào)用 Optional 類的私有構(gòu)造函數(shù) private Optional(T value) 來創(chuàng)建一個(gè)新的 Optional 對(duì)象,并將傳入的值包裝在其中。
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 對(duì)象。
4. 總結(jié)
Optional.of() 是創(chuàng)建包含非空值的 Optional 對(duì)象的方法。通過深入解析其語法、使用示例以及注意事項(xiàng),我們更好地理解了該方法的作用和適用場(chǎng)景。在使用時(shí),確保傳入的值非空,以保證安全使用 Optional。在不確定值是否為空的情況下,建議使用 Optional.ofNullable() 方法。
附:Optional.of()和Optional.ofNullable()區(qū)別
Optional.of()或者Optional.ofNullable():創(chuàng)建Optional對(duì)象,差別在于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)行空值檢測(cè)。
通過of(T value)函數(shù)所構(gòu)造出的Optional對(duì)象,當(dāng)Value值為空時(shí),依然會(huì)報(bào)NullPointerException。
到此這篇關(guān)于Java中Optional.of()方法及源碼解析的文章就介紹到這了,更多相關(guān)Java Optional.of()方法源碼解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索
這篇文章主要介紹了向量數(shù)據(jù)庫之如何使用Elasticsearch實(shí)現(xiàn)向量數(shù)據(jù)存儲(chǔ)與搜索,在向量函數(shù)的計(jì)算過程中,會(huì)對(duì)所有匹配的文檔進(jìn)行線性掃描,因此,查詢預(yù)計(jì)時(shí)間會(huì)隨著匹配文檔的數(shù)量線性增長(zhǎng),本文給大家講解的非常詳細(xì),需要的朋友參考下吧2023-06-06
Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)實(shí)例代碼
Java實(shí)現(xiàn)單鏈表反轉(zhuǎn),遞歸和非遞歸兩種形式。接下來通過本文給大家分享Java實(shí)現(xiàn)單鏈表翻轉(zhuǎn)實(shí)例代碼,需要的的朋友參考下2017-03-03
一文掌握J(rèn)ava 數(shù)據(jù)結(jié)構(gòu)超詳細(xì)筆記(收藏版)
本文給大家介紹Java數(shù)據(jù)結(jié)構(gòu),包括數(shù)組、鏈表、List、Set、Map及迭代器,對(duì)比了其內(nèi)存特性、操作效率和應(yīng)用場(chǎng)景,并介紹了哈希及沖突解決方法,感興趣的朋友跟隨小編一起看看吧2025-09-09
Spring使用注解進(jìn)行對(duì)象裝配(DI)的操作
獲取Bean對(duì)象也叫做對(duì)象裝配,就是把對(duì)象取出來放到某個(gè)類中,有時(shí)候也叫對(duì)象注入,這篇文章主要介紹了Spring使用注解進(jìn)行對(duì)象裝配(DI),需要的朋友可以參考下2023-07-07

