Spring 5 core 中的 @NonNull 是個什麼鬼?!

如夢技術發表於2019-04-14

說明

Spring 5的 spring-core jar包中新增了 jsr-305 相關注解。在 Spring 原始碼中已經被大量使用。如下圖:

spring-jsr305

JSR-305介紹

諸如 FindBugs、IntelliJ、Checkstyle 和 PMD 這樣的靜態分析工具在 Java 開發中得到了廣泛應用。這些工具都很強大,但是有一些共同的問題它們都很難解決。在 API 的設計中,有一些決策是不言而喻的,比如何時值可以為 null,或者何時數字值不能為負。完備的 API 會將這些設計細節記錄在 JavaDoc 之中,但是分析工具卻無法發現類似細節,從而有可能將其忽略或是導致錯誤的檢測結果。

為了解決這些問題,有些靜態分析工具開發人員試圖使用註解來定義相關細節。比如 FindBugs 和 IntelliJ 都定義了自己的註解,以表示方法何時返回 null。不過,這兩個工具使用的註解有細微不同,也因此有了標準化的需求。由 FindBugs 建立人 Bill Pugh 帶領制定的 JSR-305 標準,試圖建立一套標準註解供分析工具使用,同時希望允許開發人員根據自己的需要新增額外的註解。當前提案中包括供判斷是否為空、正負號、開發語言和執行緒等方面的眾多註解。

更多jsr-305介紹請檢視,JSR-305:供檢查軟體缺陷用的註解

使用場景

由上文的介紹,我們知曉了 jsr-305 的目標:供檢查軟體缺陷用。方便靜態程式碼檢查工具及時查詢出潛在的 bug。所以這些註解特別適合基礎元件和工具包,增強 IDE 提示,減少潛在 bug

lutool 1.x 中複製了spring 5中的 jsr-305 相關注解到原始碼中,到 mica - Spring boot 微服務開發核心包 由於依賴的 Spring boot 2.1.x,則直接使用 spring core 中的註解。

使用

新增包級規則

  1. @NonNullFields表示Field不為null。

  2. @NonNullApi表示方法引數返回值不為null。

  3. 對於不想使用包級別不為null,可直接使用@NonNull,使用方式同下文@Nullable

在包下新增package-info.java,內容如下。

@NonNullApi
@NonNullFields
package net.dreamlu.mica.core.utils;

import org.springframework.lang.NonNullApi;
import org.springframework.lang.NonNullFields;
複製程式碼

新增完該註解後編寫程式碼時編輯器會給出提示,如下圖:

idea方法提示1

idea方法提示2

@Nullable

對於部分可為空的Field方法引數返回值需要使用@Nullable進行標示。

引數可為null

public static boolean isBlank(@Nullable final CharSequence cs) {
    return !StringUtils.hasText(cs);
}
複製程式碼

返回值可為null

@Nullable
public static String getCookieVal(HttpServletRequest request, String name) {
    Cookie cookie = getCookie(request, name);
    return cookie != null ? cookie.getValue() : null;
}
複製程式碼

屬性可為null

@Nullable
private String msg;
複製程式碼

開源推薦

關注我們

如夢技術-公眾號.jpg

掃描上面二維碼,更多精彩內容每天推薦!

相關文章