Java中Optional.of()方法及源碼解析(非常詳細!)
前言
在Java中,Optional.of() 方法是 Optional 類中用于創(chuàng)建包含非空值的 Optional 對象的靜態(tài)方法。在本文中,我們將深入解析 Optional.of() 的語法、使用場景,并通過多個示例詳細說明。
方法解析
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)建了一個包含字符串 “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);
這個示例中,我們定義了一個 Person 類,并使用 Optional.of() 創(chuàng)建了一個包含 Person 對象的 Optional 對象。
2.3 注意事項
Optional<String> optional = Optional.of(null); // 會拋出 NullPointerException
Optional.of() 要求傳入的值不能為 null,否則會拋出 NullPointerException。在上述示例中,傳入了 null 值,導致拋出異常。
3. 使用場景
Optional.of() 適用于確定值不為空的情況,提供了一種安全的方式來包裝非空值,避免了空指針異常。但需要注意確保傳入的值非空,否則會引發(fā)異常。
源碼解析
1. Optional.of() 方法的源碼
public static <T> Optional<T> of(T value) {
return new Optional<>(Objects.requireNonNull(value));
}
上述源碼顯示了 Optional.of() 方法的實現(xiàn)。以下是對源碼的解析:
public static <T> Optional<T> of(T value) {: 這是一個靜態(tài)方法聲明,返回類型是Optional<T>,其中<T>是泛型參數(shù),表示Optional包含的值的類型。參數(shù)value是需要包裝的非空值。return new Optional<>(Objects.requireNonNull(value));: 在方法體內,首先使用Objects.requireNonNull(value)確保傳入的值不為null。如果傳入的值為null,Objects.requireNonNull方法會拋出NullPointerException。然后,通過
new Optional<>(...)創(chuàng)建一個新的Optional對象,將傳入的非空值包裝在其中。
2. 源碼解析總結
Optional.of()方法通過Objects.requireNonNull確保傳入的值非空,否則拋出NullPointerException。- 創(chuàng)建了一個新的
Optional對象,并將傳入的非空值包裝在其中。
3. 注意事項
在使用 Optional.of() 時,一定要確保傳入的值不為 null,否則會導致異常。如果不能確定值是否為 null,建議使用 Optional.ofNullable() 方法。
4. Optional 類的基本結構
在深入解析 Optional.of() 的源碼之前,我們先了解一下 Optional 類的基本結構。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() 方法的源碼。關鍵部分解析如下:
EMPTY:Optional類的一個靜態(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);
}
這個方法非常簡單,它直接調用 Optional 類的私有構造函數(shù) private Optional(T value) 來創(chuàng)建一個新的 Optional 對象,并將傳入的值包裝在其中。
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
在構造函數(shù)中,首先通過 Objects.requireNonNull(value) 確保傳入的值非空,否則拋出 NullPointerException。然后將非空值保存在 value 字段中。
這就是 Optional.of() 方法的基本邏輯??傮w來說,Optional 類提供了一種安全地處理可能為 null 值的方式,而 Optional.of() 則是其中的一個關鍵方法,用于創(chuàng)建包含非空值的 Optional 對象。
4. 總結
Optional.of() 是創(chuàng)建包含非空值的 Optional 對象的方法。通過深入解析其語法、使用示例以及注意事項,我們更好地理解了該方法的作用和適用場景。在使用時,確保傳入的值非空,以保證安全使用 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);
空指針異常是導致Java應用程序失敗的最常見原因。以前,為了解決空指針異常,Google公司著名的Guava項目引入了Optional類,Guava通過使用檢查空值的方式來防止代碼污染,它鼓勵程序員寫更干凈的代碼。受到Google Guava的啟發(fā),Optional類已經成為Java 8類庫的一部分。Optional實際上是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
通過of(T value)函數(shù)所構造出的Optional對象,當Value值為空時,依然會報NullPointerException。
到此這篇關于Java中Optional.of()方法及源碼解析的文章就介紹到這了,更多相關Java Optional.of()方法源碼解析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MyBatis Mapper XML中比較操作符轉義問題解決
在使用MyBatis編寫Mapper XML時,有時會遇到比較操作符需要進行轉義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉義問題解決,具有一定的參考價值,感興趣的可以了解一下2024-01-01
Java?Mybatis的初始化之Mapper.xml映射文件的詳解
這篇文章主要介紹了Java?Mybatis的初始化之Mapper.xml映射文件的詳解,解析完全局配置文件后接下來就是解析Mapper文件了,它是通過XMLMapperBuilder來進行解析的2022-08-08
SpringMVC中事務是否可以加在Controller層的問題
這篇文章主要介紹了SpringMVC中事務是否可以加在Controller層的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Spring事件監(jiān)聽機制之@EventListener實現(xiàn)方式詳解
這篇文章主要介紹了Spring事件監(jiān)聽機制之@EventListener實現(xiàn)方式詳解,ApplicationContext的refresh方法還是初始化了SimpleApplicationEventMulticaster,發(fā)送事件式還是先獲取ResolvableType類型,再獲取發(fā)送監(jiān)聽列表,需要的朋友可以參考下2023-12-12

