安全地導航容易出現空值的“Get”呼叫鏈
在複雜的程式碼庫中,連結多個“get”呼叫可能成為滋生地對於空指標異常。為了防止潛在的 null 值,開發人員經常對每個中間物件進行詳細的 null 檢查。
但有沒有更優雅、更有效的方法來處理這種情況?
可選鏈
透過Java 8的Optional類,我們有一個優雅的解決方案,稱為可選鏈。可選包裝允許我們透過返回Optional
可選鏈可讓您無縫執行一系列get調用,將每個調用映射到一個可選值。空檢查在內部處理,確保僅當前面的操作返回非空值時才執行後續操作。
例如,考慮以下「get」呼叫鏈:
house。 getFloor(0).getWall(WEST).getDoor().getDoorknob();
為了避免NullPointerExceptions,您可以使用以下null 檢查:
if (house != null && house.getFloor(0) != null && house.getFloor(0).getWall(WEST) != null && house.getFloor(0).getWall(WEST).getDoor() != null) ...
但是,使用可選鏈,您可以將其簡化為:
Optional.ofNullable(house) .map(h -> h.getFloor(0)) .map(floor -> floor.getWall(WEST)) .map(wall -> wall.getDoor()) .map(door -> door.getDoorknob());
範例用法
讓我們用一個例子來說明可選鏈的威力:
System.out.println("----- Not Initialized! -----"); Optional.ofNullable(new Outer()) ... // Omitted chain of optional maps .ifPresent(foo -> System.out.println("foo: " foo)); //no print System.out.println("----- Let's Initialize! -----"); Optional.ofNullable(new OuterInit()) ... // Omitted chain of optional maps .ifPresent(foo -> System.out.println("foo: " foo)); //will print!
在此範例中,當初始化物件時,可選鏈會優雅地處理空值,從而成功列印。如果沒有可選鏈,就會發生 NullPointerException。
可選鏈不僅簡化了 null 處理,還提高了程式碼的可讀性和可維護性。透過利用Optional
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3