最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 注解@NotNull 和 @NotEmpty區(qū)別深度解析

 更新時(shí)間:2025年09月26日 09:10:12   作者:還航  
本文給大家介紹了Java注解@NotNull和@NotEmpty區(qū)別深度解析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

要理解這兩個(gè) Java 注解的核心區(qū)別與應(yīng)用場(chǎng)景,需從定義來(lái)源、校驗(yàn)邏輯、適用類(lèi)型三個(gè)維度展開(kāi)分析,以下是詳細(xì)解讀:

一、核心信息概覽

首先明確兩個(gè)注解的基礎(chǔ)定位,避免混淆:

對(duì)比維度

javax.validation.constraints.NotNull

org.hibernate.validator.constraints.NotEmpty

所屬框架

JSR 380 標(biāo)準(zhǔn)(Java Validation API)

Hibernate Validator 擴(kuò)展(標(biāo)準(zhǔn)的實(shí)現(xiàn)之一)

核心作用

禁止值為 null

禁止值為 null 禁止 “空內(nèi)容”(如空字符串、空集合)

依賴(lài)關(guān)系

標(biāo)準(zhǔn)注解,所有 Validation 實(shí)現(xiàn)都支持

需額外引入 Hibernate Validator 依賴(lài)

二、關(guān)鍵差異深度解析

1. 校驗(yàn)邏輯:“單一禁止” vs “雙重禁止”

這是兩者最核心的區(qū)別,直接決定了校驗(yàn)范圍:

  • @NotNull:僅校驗(yàn) “是否為 null”

只判斷值是否為 null,不關(guān)心非 null 值的 “內(nèi)容是否為空”。

示例(非 null 但 “空內(nèi)容” 的情況,@NotNull 會(huì)判定為有效):

public class User {
// 允許:值為""(空字符串)、[](空集合)、new Object()(非null對(duì)象)
@NotNull
private String username = "";
@NotNull
private List<String> tags = new ArrayList<>(); // 空集合也會(huì)通過(guò)校驗(yàn)
}
  • @NotEmpty:校驗(yàn) “非 null + 非空內(nèi)容”

是 @NotNull 的增強(qiáng)版,同時(shí)滿(mǎn)足兩個(gè)條件才判定為有效:

public class User {
// 無(wú)效:值為null(違反@NotNull)
@NotEmpty
private String username = null;
// 無(wú)效:值為""(非null,但空字符串,違反@Size(min=1))
@NotEmpty
private String email = "";
// 無(wú)效:值為new ArrayList<>()(非null,但空集合,違反@Size(min=1))
@NotEmpty
private List<String> tags = new ArrayList<>();
}

本質(zhì)上,@NotEmpty 的校驗(yàn)邏輯是通過(guò)組合注解實(shí)現(xiàn)的(從源碼可見(jiàn)):

// @NotEmpty 源碼中組合了 @NotNull 和 @Size(min=1)
@NotNull // 保證非null
@Size(min = 1) // 保證內(nèi)容長(zhǎng)度/大小 ≥1(空內(nèi)容會(huì)觸發(fā)此注解的校驗(yàn)失?。?
public @interface NotEmpty { ... }
    1. 值不能為 null;
    1. 值的 “內(nèi)容” 不能為空(具體 “空內(nèi)容” 的定義隨類(lèi)型變化)。

示例(@NotEmpty 判定為無(wú)效的情況):

2. 適用數(shù)據(jù)類(lèi)型:“通用” vs “限定內(nèi)容型”

兩者適用的字段類(lèi)型不同,@NotEmpty 僅支持 “有內(nèi)容長(zhǎng)度 / 大小” 的類(lèi)型:

數(shù)據(jù)類(lèi)型

@NotNull 是否適用

@NotEmpty 是否適用

說(shuō)明(@NotEmpty 的 “空內(nèi)容” 定義)

基本類(lèi)型包裝類(lèi)

是(如 Integer)

否(無(wú) “內(nèi)容” 概念)

如 Integer age = null:@NotNull 校驗(yàn),@NotEmpty 不支持

String

“空內(nèi)容”= 長(zhǎng)度為 0 的字符串("")

集合 / 數(shù)組(如 List、Set、int [])

“空內(nèi)容”= 長(zhǎng)度 / 大小為 0(如 new ArrayList<>()、new int[0])

Map

“空內(nèi)容”= 鍵值對(duì)數(shù)量為 0(new HashMap<>())

自定義對(duì)象

是(如 User)

否(無(wú) “內(nèi)容” 概念)

僅需判斷對(duì)象是否為 null,用 @NotNull 即可

3. 依賴(lài)與兼容性:“標(biāo)準(zhǔn)” vs “擴(kuò)展”

  • @NotNull:無(wú)額外依賴(lài)

屬于 JSR 380 標(biāo)準(zhǔn)注解(包路徑為 javax.validation.constraints),只要項(xiàng)目引入了任何符合標(biāo)準(zhǔn)的 Validation 實(shí)現(xiàn)(如 Hibernate Validator、Apache BVal),就能直接使用,兼容性強(qiáng)。

  • @NotEmpty:需依賴(lài) Hibernate Validator

是 Hibernate Validator 提供的擴(kuò)展注解(包路徑為 org.hibernate.validator.constraints),并非標(biāo)準(zhǔn) API。若項(xiàng)目未引入 Hibernate Validator(僅用標(biāo)準(zhǔn) API 或其他實(shí)現(xiàn)),使用此注解會(huì)報(bào) “找不到注解” 錯(cuò)誤。

Maven 依賴(lài)示例(需手動(dòng)引入):

<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version> <!-- 版本需與項(xiàng)目兼容 -->
</dependency>

三、使用場(chǎng)景選擇建議

根據(jù)業(yè)務(wù)需求選擇注解,避免 “過(guò)度校驗(yàn)” 或 “校驗(yàn)不足”:

業(yè)務(wù)需求

推薦注解

示例場(chǎng)景

僅需確保值 “存在”(非 null),不關(guān)心內(nèi)容

@NotNull

1. 年齡(Integer age,允許 0 但不允許 null);2. 自定義對(duì)象(User user,只要對(duì)象非 null 即可)

需確保值 “存在且有意義”(非 null + 非空內(nèi)容)

@NotEmpty

1. 用戶(hù)名(String username,不允許 null 或 “”);2. 用戶(hù)標(biāo)簽(List<String> tags,不允許 null 或空集合);3. 地址(String address,不允許 null 或空字符串)

四、常見(jiàn)誤區(qū)提醒

  1. 誤區(qū) 1:@NotNull 能校驗(yàn)空字符串 / 空集合

錯(cuò)誤!@NotNull 只管 “是否為 null”,空字符串("")、空集合(new ArrayList<>())都是非 null 值,會(huì)通過(guò) @NotNull 校驗(yàn)。

  1. 誤區(qū) 2:@NotEmpty 能校驗(yàn)基本類(lèi)型

錯(cuò)誤!基本類(lèi)型(如 int、boolean)無(wú)法為 null(默認(rèn)有初始值,如 int 為 0),且無(wú) “內(nèi)容” 概念,使用 @NotEmpty 會(huì)觸發(fā)編譯錯(cuò)誤。

  1. 誤區(qū) 3:項(xiàng)目中直接用 @NotEmpty 替代 @NotNull

不推薦!@NotEmpty 依賴(lài) Hibernate Validator,若未來(lái)切換 Validation 實(shí)現(xiàn)(如從 Hibernate Validator 改為 Apache BVal),@NotEmpty 會(huì)失效;且部分場(chǎng)景(如基本類(lèi)型包裝類(lèi)、自定義對(duì)象)無(wú)需校驗(yàn) “內(nèi)容”,用 @NotNull 更輕量。

五、總結(jié)

  • 若需標(biāo)準(zhǔn)、通用的 “非 null” 校驗(yàn),且不依賴(lài)具體實(shí)現(xiàn),用 @NotNull;
  • 若需 **“非 null + 非空內(nèi)容” 的增強(qiáng)校驗(yàn) **(如字符串、集合),且項(xiàng)目已引入 Hibernate Validator,用 @NotEmpty;
  • 核心原則:“最小必要校驗(yàn)”—— 只校驗(yàn)業(yè)務(wù)需要的范圍,避免冗余。

到此這篇關(guān)于Java 注解@NotNull 和 @NotEmpty區(qū)別的文章就介紹到這了,更多相關(guān)java @NotNull 和 @NotEmpty區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud配置客戶(hù)端ConfigClient接入服務(wù)端

    SpringCloud配置客戶(hù)端ConfigClient接入服務(wù)端

    這篇文章主要為大家介紹了SpringCloud配置客戶(hù)端ConfigClient接入服務(wù)端,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • SpringBoot靜態(tài)資源的訪(fǎng)問(wèn)方法詳細(xì)介紹

    SpringBoot靜態(tài)資源的訪(fǎng)問(wèn)方法詳細(xì)介紹

    最近在做SpringBoot項(xiàng)目的時(shí)候遇到了“白頁(yè)”問(wèn)題,通過(guò)查資料對(duì)SpringBoot訪(fǎng)問(wèn)靜態(tài)資源做了總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • JAVA設(shè)計(jì)模式----建造者模式詳解

    JAVA設(shè)計(jì)模式----建造者模式詳解

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)建造者模式Builder Pattern,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java 深拷貝與淺拷貝的分析

    Java 深拷貝與淺拷貝的分析

    本文主要介紹java 的深拷貝和淺拷貝,這里通過(guò)實(shí)例代碼對(duì)深拷貝和淺拷貝做了詳細(xì)的比較,希望能幫到有需要的小伙伴
    2016-07-07
  • MyBatis實(shí)現(xiàn)留言板的示例代碼

    MyBatis實(shí)現(xiàn)留言板的示例代碼

    本文主要介紹了MyBatis實(shí)現(xiàn)留言板的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 解讀@ConfigurationProperties使用時(shí)的幾個(gè)常見(jiàn)誤區(qū)

    解讀@ConfigurationProperties使用時(shí)的幾個(gè)常見(jiàn)誤區(qū)

    在Spring Boot中,@ConfigurationProperties注解用于綁定配置文件中的屬性到Java對(duì)象,它支持properties和yml文件格式,并且可以通過(guò)prefix屬性指定配置屬性的前綴,需要注意的是,@PropertySource注解默認(rèn)只支持properties文件,不支持yml文件
    2024-10-10
  • Java螺旋矩陣處理方法詳解

    Java螺旋矩陣處理方法詳解

    螺旋矩陣是指一個(gè)呈螺旋狀的矩陣,它的數(shù)字由第一行開(kāi)始到右邊不斷變大,向下變大,向左變大,向上變大,如此循環(huán)。利用java實(shí)現(xiàn)的螺旋矩陣,當(dāng)輸入N之后,會(huì)自動(dòng)打印出螺旋矩陣
    2022-09-09
  • SpringBoot可以同時(shí)處理多少請(qǐng)求流程分析

    SpringBoot可以同時(shí)處理多少請(qǐng)求流程分析

    SpringBoot默認(rèn)的內(nèi)嵌容器是Tomcat,也就是我們的程序?qū)嶋H上是運(yùn)行在Tomcat里的,所以與其說(shuō)SpringBoot可以處理多少請(qǐng)求,到不如說(shuō)Tomcat可以處理多少請(qǐng)求,這篇文章主要介紹了SpringBoot可以同時(shí)處理多少請(qǐng)求,需要的朋友可以參考下
    2023-02-02
  • 關(guān)于Spring Cloud健康檢查的陷阱

    關(guān)于Spring Cloud健康檢查的陷阱

    這篇文章主要介紹了關(guān)于Spring Cloud健康檢查的陷阱,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 深入學(xué)習(xí)java并發(fā)包ConcurrentHashMap源碼

    深入學(xué)習(xí)java并發(fā)包ConcurrentHashMap源碼

    這篇文章主要介紹了深入學(xué)習(xí)java并發(fā)包ConcurrentHashMap源碼,整個(gè) ConcurrentHashMap 由一個(gè)個(gè) Segment 組成,Segment 代表”部分“或”一段“的意思,所以很多地方都會(huì)將其描述為分段鎖。,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

南平市| 徐闻县| 沙田区| 县级市| 青河县| 闻喜县| 晋城| 平远县| 平阳县| 灵武市| 淮北市| 万山特区| 平度市| 新和县| 都昌县| 万山特区| 桦甸市| 微山县| 苗栗市| 通化市| 新干县| 登封市| 商水县| 洛隆县| 洛川县| 东乡| 门头沟区| 淮北市| 巴彦县| 泰宁县| 上虞市| 东海县| 清徐县| 潞城市| 高尔夫| 富蕴县| 比如县| 阳江市| 昭平县| 旬邑县| 冷水江市|