精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

瞧瞧別人家的判空,那叫一個優雅!

開發 前端
我們在日常開發中的entity對象,一般會使用Lombok框架中的注解,來實現getter/setter方法。

一、傳統判空的血淚史

某互聯網金融平臺因費用計算層級的空指針異常,導致凌晨產生9800筆錯誤交易。

DEBUG日志顯示問題出現在如下代碼段:

// 錯誤示例
BigDecimal amount = user.getWallet().getBalance().add(new BigDecimal("100"));

此類鏈式調用若中間環節出現null值,必定導致NPE。

初級階段開發者通常寫出多層嵌套式判斷:

if(user != null){
    Wallet wallet = user.getWallet();
    if(wallet != null){
        BigDecimal balance = wallet.getBalance();
        if(balance != null){
            // 實際業務邏輯
        }
    }
}

這種寫法既不優雅又影響代碼可讀性。

那么,我們該如何優化呢?

二、Java 8+時代的判空革命

Java8之后,新增了Optional類,它是用來專門判空的。

能夠幫你寫出更加優雅的代碼。

1. Optional黃金三板斧

// 重構后的鏈式調用
BigDecimal result = Optional.ofNullable(user)
    .map(User::getWallet)
    .map(Wallet::getBalance)
    .map(balance -> balance.add(new BigDecimal("100")))
    .orElse(BigDecimal.ZERO);

高級用法:條件過濾

Optional.ofNullable(user)
    .filter(u -> u.getVipLevel() > 3)
    .ifPresent(u -> sendCoupon(u)); // VIP用戶發券

2. Optional拋出業務異常

BigDecimal balance = Optional.ofNullable(user)
    .map(User::getWallet)
    .map(Wallet::getBalance)
    .orElseThrow(() -> new BusinessException("用戶錢包數據異常"));

3. 封裝通用工具類

public class NullSafe {
    
    // 安全獲取對象屬性
    public static <T, R> R get(T target, Function<T, R> mapper, R defaultValue) {
        return target != null ? mapper.apply(target) : defaultValue;
    }
    
    // 鏈式安全操作
    public static <T> T execute(T root, Consumer<T> consumer) {
        if (root != null) {
            consumer.accept(root);
        }
        return root;
    }
}

// 使用示例
NullSafe.execute(user, u -> {
    u.getWallet().charge(new BigDecimal("50"));
    logger.info("用戶{}已充值", u.getId());
});

三、現代化框架的判空銀彈

4. Spring實戰技巧

Spring中自帶了一些好用的工具類,比如:CollectionUtils、StringUtils等,可以非常有效的進行判空。

具體代碼如下:

// 集合判空工具
List<Order> orders = getPendingOrders();
if (CollectionUtils.isEmpty(orders)) {
    return Result.error("無待處理訂單");
}

// 字符串檢查
String input = request.getParam("token");
if (StringUtils.hasText(input)) {
    validateToken(input); 
}

5. Lombok保駕護航

我們在日常開發中的entity對象,一般會使用Lombok框架中的注解,來實現getter/setter方法。

其實,這個框架中也提供了@NonNull等判空的注解。

比如:

@Getter
@Setter
public class User {
    @NonNull // 編譯時生成null檢查代碼
    private String name;
    
    private Wallet wallet;
}

// 使用構造時自動判空
User user = new User(@NonNull "張三", wallet);

四、工程級解決方案

6. 空對象模式

public interface Notification {
    void send(String message);
}

// 真實實現
public class EmailNotification implements Notification {
    @Override
    public void send(String message) {
        // 發送郵件邏輯
    }
}

// 空對象實現
public class NullNotification implements Notification {
    @Override
    public void send(String message) {
        // 默認處理
    }
}

// 使用示例
Notification notifier = getNotifier();
notifier.send("系統提醒"); // 無需判空

7. Guava的Optional增強

其實Guava工具包中,給我們提供了Optional增強的功能。

比如:

import com.google.common.base.Optional;

// 創建攜帶缺省值的Optional
Optional<User> userOpt = Optional.fromNullable(user).or(defaultUser);

// 鏈式操作配合Function
Optional<BigDecimal> amount = userOpt.transform(u -> u.getWallet())
                                    .transform(w -> w.getBalance());

Guava工具包中的Optional類已經封裝好了,我們可以直接使用。

五、防御式編程進階

8. Assert斷言式攔截

其實有些Assert斷言類中,已經做好了判空的工作,參數為空則會拋出異常。

這樣我們就可以直接調用這個斷言類。

例如下面的ValidateUtils類中的requireNonNull方法,由于它內容已經判空了,因此,在其他地方調用requireNonNull方法時,如果為空,則會直接拋異常。

我們在業務代碼中,直接調用requireNonNull即可,不用寫額外的判空邏輯。

例如:

public class ValidateUtils {
    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null) {
            throw new ServiceException(message);
        }
        return obj;
    }
}

// 使用姿勢
User currentUser = ValidateUtils.requireNonNull(
    userDao.findById(userId), 
    "用戶不存在-ID:" + userId
);

9. 全局AOP攔截

我們在一些特殊的業務場景種,可以通過自定義注解 + 全局AOP攔截器的方式,來實現實體或者字段的判空。

例如:

@Aspect
@Component
public class NullCheckAspect {
    
    @Around("@annotation(com.xxx.NullCheck)")
    public Object checkNull(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if (arg == null) {
                throw new IllegalArgumentException("參數不可為空");
            }
        }
        return joinPoint.proceed();
    }
}

// 注解使用
public void updateUser(@NullCheck User user) {
    // 方法實現
}

六、實戰場景對比分析

場景1:深層次對象取值

// 舊代碼(4層嵌套判斷)
if (order != null) {
    User user = order.getUser();
    if (user != null) {
        Address address = user.getAddress();
        if (address != null) {
            String city = address.getCity();
            // 使用city
        }
    }
}

// 重構后(流暢鏈式)
String city = Optional.ofNullable(order)
    .map(Order::getUser)
    .map(User::getAddress)
    .map(Address::getCity)
    .orElse("未知城市");

場景2:批量數據處理

List<User> users = userService.listUsers();

// 傳統寫法(顯式迭代判斷)
List<String> names = new ArrayList<>();
for (User user : users) {
    if (user != null && user.getName() != null) {
        names.add(user.getName());
    }
}

// Stream優化版
List<String> nameList = users.stream()
    .filter(Objects::nonNull)
    .map(User::getName)
    .filter(Objects::nonNull)
    .collect(Collectors.toList());

七、性能與安全的平衡藝術

上面介紹的這些方案都可以使用,但除了代碼的可讀性之外,我們還需要考慮一下性能因素。

下面列出了上面的幾種在CPU消耗、內存只用和代碼可讀性的對比:

方案

CPU消耗

內存占用

代碼可讀性

適用場景

多層if嵌套



★☆☆☆☆

簡單層級調用

Java Optional



★★★★☆

中等復雜度業務流

空對象模式



★★★★★

高頻調用的基礎服務

AOP全局攔截



★★★☆☆

接口參數非空驗證

黃金法則

  • Web層入口強制參數校驗
  • Service層使用Optional鏈式處理
  • 核心領域模型采用空對象模式

八、擴展技術

除了,上面介紹的常規判空之外,下面再給大家介紹兩種擴展的技術。

Kotlin的空安全設計

雖然Java開發者無法直接使用,但可借鑒其設計哲學:

val city = order?.user?.address?.city ?: "default"

JDK 14新特性預覽

// 模式匹配語法嘗鮮
if (user instanceof User u && u.getName() != null) {
    System.out.println(u.getName().toUpperCase());
}

總之,優雅判空不僅是代碼之美,更是生產安全底線。

本文分享了代碼判空的10種方案,希望能夠幫助你編寫出既優雅又健壯的Java代碼。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2025-05-30 08:20:54

2024-11-12 08:20:31

2025-04-08 08:20:33

2024-10-24 08:21:33

2024-12-02 00:59:30

Spring

2025-04-22 08:20:51

2022-12-12 08:14:47

2025-02-28 08:21:00

2025-07-14 00:00:00

接口重試MQTT冪等性

2025-03-11 08:20:58

2025-08-19 10:01:43

2020-11-03 16:00:33

API接口微服務框架編程語言

2017-11-12 21:32:52

戴爾

2015-09-24 09:22:16

nodejs頁面始末

2016-01-08 09:49:19

DockerDocker案例云應用開發

2020-11-17 09:34:31

API接口后端

2017-09-22 13:22:59

大數據南京大學宿舍

2023-12-30 20:04:51

MyBatis框架數據

2021-07-14 06:31:08

京東互聯網加薪

2021-01-20 05:42:27

RabbitMQMQ vhost
點贊
收藏

51CTO技術棧公眾號

黄色av小说在线观看| 精品亚洲乱码一区二区 | 国产精品久久久久久妇女6080| 国产精品99久久久久久www | 亚洲综合在线第一页| 精品亚洲欧美日韩| 91精品国产乱码久久久久| 欧美午夜在线| 中文精品99久久国产香蕉| japan高清日本乱xxxxx| 欧美xxx网站| 日韩一区欧美小说| 免费一区二区三区| 国产草草影院ccyycom| 性久久久久久| 欧美国产精品va在线观看| 国产午夜福利一区| 日韩深夜福利| 日韩一区二区三区免费观看| 日韩人妻精品无码一区二区三区| 黄色av电影在线观看| 99精品视频一区二区三区| 91久久国产精品91久久性色| 国产成人无码一区二区在线播放| 一区二区三区四区日韩| 亚洲精品丝袜日韩| 亚洲天堂2024| 国产日本亚洲| 精品视频全国免费看| 国模无码视频一区二区三区| 婷婷丁香在线| 日韩理论片网站| 午夜精品一区二区在线观看的| 韩国av永久免费| 国产呦萝稀缺另类资源| 国产精品极品美女粉嫩高清在线| 三级黄色在线视频| 欧美日韩影院| 久精品免费视频| 日本一级特级毛片视频| 成人在线免费观看视频| 亚洲欧美日韩久久久久久| 荫蒂被男人添免费视频| aiai久久| 亚洲国产精品久久久久秋霞蜜臀| 亚洲一区二区三区三州| 亚洲欧美一级| 欧美精品久久天天躁| www.99av.com| 久久人人视频| 欧美日韩在线亚洲一区蜜芽| www.激情小说.com| jvid一区二区三区| 欧美性猛交xxxx久久久| 国产中文字幕免费观看| 天堂8中文在线最新版在线| 天天综合色天天综合| 99在线精品免费视频| 国产欧洲在线| 欧美午夜女人视频在线| 国产在线青青草| 国产精欧美一区二区三区蓝颜男同| 欧美日韩国产专区| 欧美激情成人网| 日本一区二区三区视频在线| 欧美在线一二三四区| 三上悠亚av一区二区三区| 日韩综合久久| 日韩欧美国产一区二区三区 | 亚洲啊啊啊啊啊| 色婷婷在线播放| 亚洲v中文字幕| 日韩手机在线观看视频| 日韩电影免费观看高清完整版在线观看| 欧美日韩国产片| 中文字幕无码毛片免费看| 国产精品久久久网站| 亚洲人成网站免费播放| 91视频免费看片| 91不卡在线观看| 久久免费精品视频| 日韩电影在线观看一区二区| 久久er99热精品一区二区| 国产99视频精品免费视频36| 午夜国产在线视频| 国产精品美女一区二区三区 | 天堂一区二区在线免费观看| 国产精品一区二区三| 精品久久久无码中文字幕| caoporm超碰国产精品| 欧美日韩在线精品| 国产在线观看免费麻豆| 精品国产91久久久| 国产91色在线观看| 国产成人av毛片| 亚洲日本中文字幕| 久久久国产成人| 日本午夜精品一区二区三区电影| 国产一区欧美二区三区| 熟妇人妻一区二区三区四区| 国产精品无圣光一区二区| 国产成人艳妇aa视频在线 | 色av成人天堂桃色av| 一级日本黄色片| 国产精品午夜一区二区三区| 欧美国产精品va在线观看| 一级黄色在线视频| 成人精品视频一区二区三区 | www.一区二区三区| 电影av一区| 亚洲成人免费av| www.久久91| 尤物tv在线精品| 欧美极品美女电影一区| 亚洲熟妇无码久久精品| 99久久国产综合精品麻豆| 国产成年人在线观看| 欧美极品影院| 亚洲国产小视频| 欧美又粗又大又长| 麻豆精品视频在线观看视频| 精品国产乱码久久久久久108| av软件在线观看| 欧美色窝79yyyycom| av在线网站观看| 激情欧美亚洲| 99久久无色码| 超鹏97在线| 91精品福利在线一区二区三区| 欧美另类z0zx974| 亚洲在线国产日韩欧美| 国产精品中出一区二区三区| 青草影视电视剧免费播放在线观看| 欧美午夜免费电影| 久久视频精品在线观看| 麻豆91精品| 欧美日韩在线观看一区| 天堂√8在线中文| 亚洲国产一区自拍| 日本中文字幕网| 不卡视频在线观看| 国产www免费| 国产96在线亚洲| 韩国19禁主播vip福利视频| 国产福利小视频| 亚洲免费电影在线| 奇米777在线| 在线电影一区二区| 成人av男人的天堂| 99在线视频影院| 亚洲韩国青草视频| 精品不卡一区二区| 国产婷婷色一区二区三区| 欧洲熟妇精品视频| 成人直播大秀| 国产色综合天天综合网| 女女色综合影院| 91.麻豆视频| 青草影院在线观看| 成人黄色一级视频| 日韩在线视频在线观看| 国产aⅴ精品一区二区三区久久| 国产精品精品视频一区二区三区| 日本欧美在线视频免费观看| 欧美一区二区在线不卡| 99精品久久久久| av成人动漫在线观看| 欧美极品欧美精品欧美图片| 欧美日韩水蜜桃| 成人黄色在线免费| 电影k8一区二区三区久久| 精品呦交小u女在线| 日本欧美www| 亚洲天堂福利av| 蜜臀视频在线观看| 久久电影一区| 亚洲午夜在线观看| 欧美久久亚洲| 欧美一级成年大片在线观看| 成人综合影院| 日韩亚洲欧美成人一区| 亚洲综合一二三| 国产欧美精品一区二区三区四区 | 色综合伊人色综合网| 国产理论视频在线观看| 一区二区三区日韩欧美| 亚洲专区区免费| 国产综合久久久久影院| a级黄色一级片| 久久免费大视频| 国产伦精品一区| 欧美成人一二区| 久久久久久久久久久免费 | 538国产精品一区二区在线| 成年人在线免费观看| 欧美成va人片在线观看| 中文字幕一区二区人妻电影| 成人欧美一区二区三区白人| 国产伦精品一区三区精东| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美无砖专区免费| 日韩精品久久久久久久电影99爱| 国产精品亚洲不卡a| 久久天天久久| 欧美在线观看网站| 日本高清在线观看| 在线亚洲午夜片av大片| 蜜臀久久99精品久久久| 欧美网站一区二区| 欧美三级韩国三级日本三斤在线观看| 国产精品国产自产拍高清av| 日韩aaaaa| 国产乱子轮精品视频| 日本老熟妇毛茸茸| 亚洲日本免费| 国产91porn| 色偷偷综合网| 日本在线免费观看一区| 国产精品zjzjzj在线观看| 国产欧美在线视频| 97人人做人人爽香蕉精品| 欧美综合一区第一页| 国产盗摄精品一区二区酒店| 色噜噜国产精品视频一区二区| 天堂影院在线| 精品av久久707| 国产日韩在线观看一区| 欧美视频一区二区三区在线观看| av网站中文字幕| 午夜视频一区二区| 久久精品免费在线| 一区二区三区中文免费| 国产一区二区播放| 国产精品成人一区二区艾草| 国产人妻大战黑人20p| 91丨九色丨蝌蚪丨老版| 亚洲精品国产成人av在线| 国产91精品久久久久久久网曝门| 999久久久精品视频| 久久99精品久久久久久久久久久久 | 亚洲综合第一页| 99tv成人影院| 91亚洲一区精品| 久久在线观看| 99re6热在线精品视频播放速度| 国产高清视频一区二区| 亚洲精品免费一区二区三区| 久久综合偷偷噜噜噜色| 99re在线观看| 久久午夜影院| 精品一区二区三区免费毛片| 久久久伦理片| 久久艳妇乳肉豪妇荡乳av| 九九精品在线| 视频在线99| 五月天综合网站| 久久久亚洲午夜电影| 国产日韩视频一区| 99久久99久久精品免费看蜜桃| 亚洲av成人片无码| 久久久久久久综合色一本| 天天躁夜夜躁狠狠是什么心态| 欧美激情一区二区| 欧美特黄一级片| 一区二区三区在线免费观看| 欧美日韩在线观看成人| 亚洲电影第三页| 在线能看的av| 91福利社在线观看| 92久久精品一区二区| 日韩丝袜美女视频| 偷拍精品一区二区三区| 精品夜色国产国偷在线| av在线免费一区| 欧美另类精品xxxx孕妇| free性欧美| 国产福利精品av综合导导航| 国产精品美女午夜爽爽| 亚洲自拍在线观看| 蜜桃a∨噜噜一区二区三区| 午夜一区二区三区| 国内自拍一区| 亚洲国产精品三区| 日本亚洲三级在线| 欧美激情 亚洲| 日本一区二区三区久久久久久久久不 | 日韩中文在线字幕| 一本色道精品久久一区二区三区 | 风流少妇一区二区| 免费观看av网站| 亚洲欧美另类小说| 麻豆成人免费视频| 日韩一本二本av| 国产一区二区影视| 欧美二区乱c黑人| 成人涩涩视频| 国产色综合一区二区三区| 欧美在线色图| 阿v天堂2017| 国产美女久久久久| 性猛交娇小69hd| 亚洲va韩国va欧美va| 国产一区二区在线视频聊天| 日韩精品极品视频| av毛片在线免费看| 国产精品国模在线| 欧美a大片欧美片| 懂色av一区二区三区四区五区| 久久精品麻豆| 日韩av手机在线播放| 亚洲三级电影网站| 亚洲成人av网址| 亚洲国产精品va在线看黑人| 黄色动漫在线观看| 国产欧美在线播放| 国产欧美高清视频在线| 久草免费福利在线| 国产精品自拍一区| 毛片久久久久久| 欧美性猛交xxxx乱大交蜜桃| 性生交生活影碟片| 久久久国产视频| 成人精品高清在线视频| 欧美日韩精品中文字幕一区二区| 一区在线免费观看| 日本成人xxx| 成人欧美一区二区三区1314| 欧美另类高清videos的特点| 日韩精品一二三四区| aa视频在线观看| 成人欧美一区二区三区在线观看| 国产精品毛片一区二区在线看| 日本久久久久久久久久久久| 国产午夜精品久久久久久久| 亚洲AV无码成人精品区东京热| 亚洲福利小视频| av日韩国产| 国产伦一区二区三区色一情| 欧美视频二区| 中文字幕在线播放一区二区| 亚洲欧美国产77777| 99热这里只有精| 九九九久久国产免费| 国产视频一区二| 日本国产中文字幕| 国产激情视频一区二区三区欧美 | 欧美黄色大片网站| 欧美熟妇另类久久久久久多毛| 亚洲人成精品久久久久| av中文字幕第一页| 久久99久国产精品黄毛片入口| 国产精品一级在线观看| 日韩不卡视频一区二区| 国产精品亚洲一区二区三区妖精| 动漫性做爰视频| 欧美岛国在线观看| 美女扒开腿让男人桶爽久久软| 久久久亚洲综合网站| 久久最新视频| 妖精视频在线观看免费| 欧美理论电影在线| aa在线视频| 久久99精品久久久久久青青日本| 久久亚洲二区| 午夜国产福利视频| 欧美www视频| 国产日韩电影| 在线播放 亚洲| 粉嫩蜜臀av国产精品网站| 国产在线精品观看| 亚洲人成在线一二| 日韩av黄色| 欧美久久久久久久久久久久久| 91麻豆国产福利在线观看| 正在播放亚洲精品| 欧美精品免费在线观看| 亚洲丁香日韩| 亚洲精品mv在线观看| 精品久久久一区| 亚洲乱亚洲乱妇| 国产视频精品网| 丝袜诱惑亚洲看片| 欧美成人国产精品高潮| 亚洲精品国产综合区久久久久久久| 性高爱久久久久久久久| mm131午夜| 26uuu另类欧美| 99国产精品99| 欧美在线xxx| 欧美精品一线| x88av在线| 亚洲精品一区二区精华| 日韩精品免费观看视频| 国产精品久久国产| 中文字幕五月欧美| 青青视频在线观| 国产激情美女久久久久久吹潮| 日韩电影在线观看电影| 国产一级中文字幕| 色狠狠久久aa北条麻妃|