持有人有何作用<T>Java 中的 Do 類?
1. 概述
在本教程中,我們將深入研究 Java 中的Holder<T>
類的主題。雖然不是內置的Java類,但HolderHolder<T>
的強大功能以及它如何增強我們的代碼。
2. 值傳遞語義的局限性
為了理解為什麼我們可能需要Holder<T>
類,讓我們首先考慮一個常見的場景:將一個簡單的Boolean
傳遞給一個方法。我們將創建一個模擬服務方法getSupplierByZipCode()
,期望它修改Boolean
值:
public class SupplierService {
public void getSupplierByZipCode(String zip, Boolean result) {
if (zip.startsWith("9")) {
result = true;
} else {
result = false;
}
}
}
現在,讓我們使用以“ 9
”開頭的zipCode
來測試此服務,期望result
更改為true
:
@Test
public void givenValidZipCode_whenGetSupplierByZipCode_thenTrue() {
SupplierService service = new SupplierService();
Boolean result = false;
String zipCode = "98682";
service.getSupplierByZipCode(zipCode, result);
assertTrue(result);
}
這次測試失敗了!由於 Java 的按值傳遞語義,我們傳遞給getSupplierByZipCode()
的結果Boolean
實際上並沒有被該方法改變。當該方法嘗試修改result
時,它只是修改副本,而原始result
保持不變。
這個限制正是Holder<T>
可以幫助我們克服的。
3. 概念化Holder<T>
我們可以將Holder<T>
視為能夠存儲和管理任何類型T
的對象的通用容器或包裝類。
它的存在主要是為了克服 Java 的按值傳遞語義,提供一種間接的方式來模擬按引用傳遞行為。
T
表示類型參數,意味著任何有效的 Java 引用類型都可以替換它。這使我們能夠擁有一個可以容納任何數據類型的Holder
類。但是,需要注意的是, Holder<T>
不應在每種情況下不加區別地使用。特別是在處理不可變對象時,使用Holder<T>
可能不是最有效或推薦的方法。
4. Holder<T>
類
假設我們有一個簡單的Holder
類,它包裝了T
類型的值。我們可以這樣定義它:
public class Holder<T> {
public T value;
public Holder(T value) {
this.value = value;
}
}
在此示例中, Holder<T>
充當容器來保存和管理任何類型T
的值。
5. 使用Holder<T>
類
現在,讓我們調整我們的SupplierService
,以克服我們之前觀察到的Java 值傳遞語義的限制。我們將使用Holder<T>
類,而不是直接將Boolean
傳遞給getSupplierByZipCode()
方法。這允許該方法修改Holder
的value
,模擬我們需要從方法返回除返回值之外的附加信息的場景。
public class SupplierService {
public void getSupplierByZipCode(String zip, Holder<Boolean> resultHolder) {
if (zip.startsWith("9")) {
resultHolder.value = true;
} else {
resultHolder.value = false;
}
}
}
現在讓我們使用 HolderSupplierService
測試Holder<T>.
@Test
public void givenValidZipCode_whenGetSupplierByZipCode_thenTrue() {
SupplierService service = new SupplierService();
Holder<Boolean> resultHolder = new Holder<>(false);
String zipCode = "98682";
service.getSupplierByZipCode(zipCode, resultHolder);
assertTrue(resultHolder.value);
}
@Test
public void givenInvalidZipCode_whenGetSupplierByZipCode_thenFalse() {
SupplierService service = new SupplierService();
Holder<Boolean> resultHolder = new Holder<>(true);
String zipCode = "12345";
service.getSupplierByZipCode(zipCode, resultHolder);
assertFalse(resultHolder.value);
}
這次,我們的測試通過了。 Holder<T>
類通過提供額外的間接層,允許我們模仿引用傳遞語義的行為,並在getSupplierByZipCode()
方法中修改所需的變量。
六,結論
在本文中,我們看到Holder<T>
類可以作為 Java 中各種編程場景的靈活而強大的工具。儘管它不是內置類,但Holder<T>
概念提供了一種優雅的方式來創建可以處理不同類型的靈活且可重用的代碼。這可以使我們克服Java的按值調用語義在某些情況下的限制。
與往常一樣,這些示例的代碼可在 GitHub 上獲取。