欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java優(yōu)雅實(shí)現(xiàn)判空方法(結(jié)合實(shí)際案例)

 更新時(shí)間:2025年06月02日 09:38:40   作者:清風(fēng)拂山感  
相信寫過(guò)代碼的朋友們都會(huì)進(jìn)行一個(gè)非空判斷,但是各種非空判斷中,那種才是最優(yōu)雅,最高效的呢,這篇文章主要介紹了Java優(yōu)雅實(shí)現(xiàn)判空方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

在 Java 開(kāi)發(fā)中,頻繁的 if (obj != null) 判空代碼會(huì)導(dǎo)致代碼冗余、可讀性差,且容易遺漏判空導(dǎo)致 NullPointerException。以下從 語(yǔ)言特性、設(shè)計(jì)模式、工具類 和 編碼規(guī)范 四個(gè)維度,結(jié)合實(shí)際案例,詳解如何優(yōu)雅處理空值問(wèn)題。

一、利用 Java 8+ 的 Optional 類

Optional 是函數(shù)式編程的容器類,顯式表達(dá)可能為空的值,強(qiáng)制開(kāi)發(fā)者處理空邏輯。

1. 案例:鏈?zhǔn)教幚砬短讓?duì)象

傳統(tǒng)判空代碼(易出錯(cuò)且冗長(zhǎng)):

public String getUserCity(User user) {
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            return address.getCity();
        }
    }
    return "Unknown";
}

使用 Optional 優(yōu)化:

public String getUserCity(User user) {
    return Optional.ofNullable(user)
        .map(User::getAddress)     // 若user為null,直接跳過(guò)
        .map(Address::getCity)     // 若address為null,跳過(guò)
        .orElse("Unknown");        // 最終兜底值
}

2. 關(guān)鍵方法

3. 注意事項(xiàng)

  • 避免濫用 Optional:不要用它替代所有 null,如方法參數(shù)、字段或集合。
  • 性能影響:在高頻調(diào)用場(chǎng)景(如循環(huán)體內(nèi)部),Optional 的創(chuàng)建可能帶來(lái)輕微性能損耗。

二、工具類封裝判空邏輯

通過(guò)工具類集中處理空值,減少重復(fù)代碼。

1. 使用 Objects 類(Java 7+)

import java.util.Objects;

// 參數(shù)校驗(yàn)(若input為null,拋出NPE)
public void process(String input) {
    Objects.requireNonNull(input, "Input must not be null");
    // 后續(xù)邏輯
}

2. Apache Commons Lang3

import org.apache.commons.lang3.StringUtils;

// 判空并處理字符串
if (StringUtils.isNotBlank(str)) {
    System.out.println(str.trim());
}

// 通用對(duì)象判空
if (ObjectUtils.isNotEmpty(list)) {
    list.forEach(System.out::println);
}

3. Guava 的 Preconditions

import com.google.common.base.Preconditions;

public void process(String input) {
    Preconditions.checkArgument(input != null, "Input must not be null");
    // 后續(xù)邏輯
}

三、通過(guò)設(shè)計(jì)模式規(guī)避空指針

1. Null Object 模式

場(chǎng)景:需要避免返回 null 的業(yè)務(wù)邏輯。

案例:訂單系統(tǒng)中的客戶信息查詢:

public interface Customer {
    String getName();
    boolean isAnonymous();
}

// 真實(shí)客戶對(duì)象
public class RealCustomer implements Customer {
    private String name;
    public String getName() { return name; }
    public boolean isAnonymous() { return false; }
}

// 空對(duì)象(代替null)
public class NullCustomer implements Customer {
    public String getName() { return "Anonymous User"; }
    public boolean isAnonymous() { return true; }
}

// 使用
public Customer findCustomerById(String id) {
    Customer customer = db.query(id);
    return customer != null ? customer : new NullCustomer();
}

// 客戶端無(wú)需判空
customer.getName(); // 永遠(yuǎn)有值

2. 返回空集合而非 null

錯(cuò)誤示例:

public List<String> getOrders() {
    if (noOrders) {
        return null;  // 導(dǎo)致客戶端必須判空
    }
    return orders;
}

正確實(shí)踐:

public List<String> getOrders() {
    return orders != null ? orders : Collections.emptyList();
}

// Java 9+ 可使用 List.of()
public List<String> getOrders() {
    return orders != null ? orders : List.of();
}

四、靜態(tài)代碼分析與注解

通過(guò) @Nullable 和 @NonNull 注解,結(jié)合 IDE 或靜態(tài)分析工具(如 Checker Framework、SpotBugs)在編譯時(shí)檢查空值。

1. 使用 Spring 的注解

import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

public void process(@NonNull String input) { // 標(biāo)記參數(shù)不可為null
    System.out.println(input.length());
}

@Nullable
public String findNameById(Long id) { // 明確返回值可能為null
    return nameService.query(id);
}

2. 集成 IDE 檢查

  • IntelliJ IDEA:內(nèi)置支持 @Nullable 注解,自動(dòng)提示可能的空指針。
  • Eclipse:通過(guò) @NonNullByDefault 配置全局非空約束。

五、Lombok 的 @NonNull

自動(dòng)生成判空代碼,適合簡(jiǎn)化方法參數(shù)校驗(yàn)。

import lombok.NonNull;

public void process(@NonNull String input) { 
    // Lombok 自動(dòng)生成:if (input == null) throw NPE
    System.out.println(input.length());
}

六、綜合案例分析

場(chǎng)景:訂單服務(wù)中獲取用戶地址

傳統(tǒng)代碼:

public String getOrderAddress(Order order) {
    if (order != null) {
        User user = order.getUser();
        if (user != null) {
            Address address = user.getAddress();
            if (address != null) {
                return address.getFullAddress();
            }
        }
    }
    return "Address not found";
}

優(yōu)化方案:

public String getOrderAddress(Order order) {
    return Optional.ofNullable(order)
        .map(Order::getUser)
        .map(User::getAddress)
        .map(Address::getFullAddress)
        .orElse("Address not found");
}

進(jìn)一步優(yōu)化(結(jié)合設(shè)計(jì)模式):

/ 定義 NullAddress 對(duì)象
public class NullAddress implements Address {
    public String getFullAddress() {
        return "Address not found";
    }
}

// 修改 User 類的 getAddress 方法
public Address getAddress() {
    return address != null ? address : new NullAddress();
}

// 最終代碼
public String getOrderAddress(Order order) {
    return Optional.ofNullable(order)
        .map(Order::getUser)
        .map(User::getAddress)
        .map(Address::getFullAddress)
        .orElse("Address not found"); // 或直接返回空對(duì)象的邏輯
}

總結(jié):何時(shí)使用哪種方案?

終極原則:

  • 不要返回 null:用空集合、空對(duì)象或 Optional 代替。

  • 防御式編程:公共方法的參數(shù)顯式校驗(yàn)。

  • 文檔化:在方法簽名或注釋中明確是否可能返回 null。

  • 靜態(tài)分析:通過(guò)工具提前發(fā)現(xiàn)潛在的空指針問(wèn)題。

通過(guò)以上方法,可顯著減少 if (obj != null) 的顯式判空,提升代碼的安全性和可維護(hù)性。

到此這篇關(guān)于Java優(yōu)雅實(shí)現(xiàn)判空方法的文章就介紹到這了,更多相關(guān)Java優(yōu)雅判空方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Java代碼重用之功能與上下文重用

    Java代碼重用之功能與上下文重用

    代碼重用通常使得程序開(kāi)發(fā)更加快速,并使得 BUG 減少。一旦一段代碼被封裝和重用,那么只需要檢查很少的一段代碼即可確保程序的正確性。接下來(lái)通過(guò)本文給大家介紹Java代碼重用之功能與上下文重用的相關(guān)知識(shí),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • JDK安裝方法和Linux常見(jiàn)設(shè)置詳細(xì)版教程

    JDK安裝方法和Linux常見(jiàn)設(shè)置詳細(xì)版教程

    這篇文章主要給大家介紹了關(guān)于JDK安裝方法和Linux常見(jiàn)設(shè)置的相關(guān)資料,文章詳細(xì)介紹了如何在Linux系統(tǒng)中設(shè)置靜態(tài)IP、用戶名和主機(jī)名,配置防火墻,安裝JDK以及如何創(chuàng)建系統(tǒng)快照,需要的朋友可以參考下
    2024-11-11
  • Java中的注解、元注解詳細(xì)解析

    Java中的注解、元注解詳細(xì)解析

    這篇文章主要介紹了Java中的注解、元注解詳細(xì)解析,注解也叫元數(shù)據(jù),與類、接口、枚舉是在同一個(gè)層次,它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來(lái)對(duì)這些元素進(jìn)行說(shuō)明,注釋,需要的朋友可以參考下
    2023-11-11
  • springboot-curd基于mybatis項(xiàng)目搭建

    springboot-curd基于mybatis項(xiàng)目搭建

    這篇文章主要介紹了springboot-curd基于mybatis項(xiàng)目搭建,圍繞相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,希望對(duì)正在學(xué)習(xí)的你有所幫助,需要的小伙伴也可以參考一下
    2022-01-01
  • SpringBoot+VUE實(shí)現(xiàn)數(shù)據(jù)表格的實(shí)戰(zhàn)

    SpringBoot+VUE實(shí)現(xiàn)數(shù)據(jù)表格的實(shí)戰(zhàn)

    本文將使用VUE+SpringBoot+MybatisPlus,以前后端分離的形式來(lái)實(shí)現(xiàn)數(shù)據(jù)表格在前端的渲染,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • Java實(shí)現(xiàn)在線語(yǔ)音識(shí)別

    Java實(shí)現(xiàn)在線語(yǔ)音識(shí)別

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)在線語(yǔ)音識(shí)別功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解

    Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解

    本篇文章主要介紹了Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java多線程中Thread.currentThread()和this的區(qū)別詳解

    Java多線程中Thread.currentThread()和this的區(qū)別詳解

    這篇文章主要介紹了Java多線程中Thread.currentThread()和this的區(qū)別詳解,Thread.currentThread()方法返回的是對(duì)當(dāng)前正在執(zhí)行的線程對(duì)象的引用,this代表的是當(dāng)前調(diào)用它所在函數(shù)所屬的對(duì)象的引用,需要的朋友可以參考下
    2023-08-08
  • java利用java.net.URLConnection發(fā)送HTTP請(qǐng)求的方法詳解

    java利用java.net.URLConnection發(fā)送HTTP請(qǐng)求的方法詳解

    如何通過(guò)Java(模擬瀏覽器)發(fā)送HTTP請(qǐng)求是我們?cè)谌粘=?jīng)常會(huì)遇到的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于java利用java.net.URLConnection發(fā)送HTTP請(qǐng)求的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-05-05
  • 在java的Map集合中,如何更改value的值

    在java的Map集合中,如何更改value的值

    這篇文章主要介紹了在java的Map集合中,如何更改value的值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論