首頁 >Java >java教程 >Java 8 中的Optional 如何幫助我避免複雜的getter 鏈中的NullPointerExceptions?

Java 8 中的Optional 如何幫助我避免複雜的getter 鏈中的NullPointerExceptions?

Susan Sarandon
Susan Sarandon原創
2024-10-25 10:03:021009瀏覽

How can Optional in Java 8 help me avoid NullPointerExceptions in complex getter chains?

確保Getter 呼叫鏈中的Null 安全性

為了防止複雜的getter 呼叫鏈中出現NullPointerException,一種常見方法涉及明確null 檢查在每個級別,如提供的程式碼片段所示。

但是,這種方法可能會變得乏味且冗長,特別是在有大量 getter 呼叫的場景中。為了解決這個問題,Java 8 引入了Optional類型,它可以優雅地管理空值並簡化程式碼結構。

利用Optional處理空值

利用Optional,你可以無縫處理 getter 鏈中的 null,而不違反 Demeter 法則。可選的使您能夠連結多個映射操作,從而有效地執行 getter 呼叫。在此框架內自動處理空檢查。

考慮以下範例,其中物件未初始化:

<code class="java">System.out.println("----- Not Initialized! -----");

Optional.ofNullable(new Outer())
        .map(out -> out.getNested())
        .map(nest -> nest.getInner())
        .map(in -> in.getFoo())
        .ifPresent(foo -> System.out.println("foo: " + foo)); //no print</code>

在這種情況下,不會產生任何輸出,因為在執行期間遇到空值getter 呼叫。

現在,讓我們初始化物件:

<code class="java">System.out.println("----- Let's Initialize! -----");

Optional.ofNullable(new OuterInit())
        .map(out -> out.getNestedInit())
        .map(nest -> nest.getInnerInit())
        .map(in -> in.getFoo())
        .ifPresent(foo -> System.out.println("foo: " + foo)); //will print!</code>

這次,程式成功列印了“foo: yes!”,示範了Optional 如何優雅地處理 null 值。

將可選值應用到您的Getter 鏈

對於涉及house.getFloor(0).getWall(WEST).getDoor().getDoorknob() 的特定getter 鏈,您可以透過以下方式利用Optional:

<code class="java">Optional.ofNullable(house)
        .map(house -> house.getFloor(0))
        .map(floorZero -> floorZero.getWall(WEST))
        .map(wallWest -> wallWest.getDoor())
        .map(door -> wallWest.getDoor())</code>

此程式碼片段傳回一個Optional,讓您安全地與門物件交互,而無需擔心空引用。

以上是Java 8 中的Optional 如何幫助我避免複雜的getter 鏈中的NullPointerExceptions?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn