不用层层判空,这个Java参数断言工具类有13个方法
## 📋 目录 - 一、工具类功能 - 二、所需环境 - 三、方法与调用示例(按需调用) - 四、工具类源码(可直接复制) ## 一、工具类功能 方法入口处一行断言替掉层层判空:对象非 null、字符串非空白、集合与 Map 与数组非空、布尔成立、数值在闭区间、长度在范围内;校验通过就把值原样返回,能直接写进赋值和链式调用。 ## 二、所需环境 JDK 17或以上 ## 三、方法与调用示例(按需调用) 🔢 **方法序号**:1 🎯 **方法用途**: - 断言对象不为 null,通过时把原对象返回,可以直接写进赋值语句 - 构造器注入、字段赋值这类「进来就得有值」的入口用它替掉一层判空 🧩 **方法定义**:`public static T notNull(T object, String message)` 🗣️ **入参解释**:`public static T notNull(待校验对象, 自定义消息)` 📤 **返回值解释**:`T`,就是传进来的那个对象,不做拷贝 💡 **边界口径**: - 失败抛 `IllegalArgumentException`,消息完全用调用方传入的文案 - 返回的是同一个引用,不是新建对象 - 只判 null,空串与纯空白要用 `notEmpty`、`notBlank` - 想省掉消息用单参版,消息走默认文案 🧪 **方法示例**: - `notNull(" tom ", "buyer 不能为null").length()` 拿到 `7`,值被直接接走 - 断言通过时返回的就是原对象,`notNull("abc", "不该抛")` 拿到 `true` - 传 null 抛 `IllegalArgumentException`,消息是自定义的那句 --- 🔢 **方法序号**:2 🎯 **方法用途**: - 判 null 的简写版,不传消息,失败时用固定文案 - 内部代码、消息不需要给前端看的场合用它少敲一个参数 🧩 **方法定义**:`public static T notNull(T object)` 🗣️ **入参解释**:`public static T notNull(待校验对象)` 📤 **返回值解释**:`T`,传进来的对象本身 💡 **边界口径**: - 默认消息是 `参数不能为null`,不带参数名,对外提示不如两参版清楚 - 口径与两参版完全一致,内部就是转调 🧪 **方法示例**: - `notNull("order-service")` 拿到 `order-service` - `notNull(null)` 抛 `参数不能为null` --- 🔢 **方法序号**:3 🎯 **方法用途**: - 拦 null 与全空白字符串,原值返回且不做 trim - 用户名、备注这类「不能是空白但内容原样保留」的入参校验 🧩 **方法定义**:`public static String notBlank(String str, String message)` 🗣️ **入参解释**:`public static String notBlank(字符串, 自定义消息)` 📤 **返回值解释**:`String`,校验通过的原字符串,前后空白不会被去掉 💡 **边界口径**: - 判的是「null 或全空白」,空格、制表符、全角空格都算空白 - 返回原值不 trim,需要干净值自己再调 `trim` - 与 `notEmpty(String, String)` 的差别就在纯空白能不能过 - 失败抛 `IllegalArgumentException`,消息用传入文案 🧪 **方法示例**: - `notBlank(" tom ", "买家名不能为空白")` 拿到 `[ tom ]`,两侧空格原样留着 - `notBlank(" ", "买家名不能为空白")` 抛 `买家名不能为空白` --- 🔢 **方法序号**:4 🎯 **方法用途**: - 只拦 null 与空串的字符串断言,纯空白串视为有内容 - 允许填空格、但不允许完全不填的字段用它,别误用 `notBlank` - 集合、Map、数组的非空断言是同名重载,口径见方法5 到方法7 🧩 **方法定义**:`public static String notEmpty(String str, String message)` 🗣️ **入参解释**:`public static String notEmpty(字符串, 自定义消息)` 📤 **返回值解释**:`String`,原字符串 💡 **边界口径**: - 判的是 `null` 或长度为 0,`" "` 这种一个空格的串能过 - 与字符串入参的集合、Map、数组重载共用一个名字,传 `null` 字面量时要显式转型,例如 `notEmpty((String) value, "msg")` - 失败抛 `IllegalArgumentException` 🧪 **方法示例**: - `notEmpty(" ", "不能为空串")` 拿到 `[ ]`,纯空白串过了 - `notEmpty((String) null, "备注不能为空")` 抛 `备注不能为空` --- 🔢 **方法序号**:5 🎯 **方法用途**: - 断言集合非 null 且至少有一个元素,通过时返回同一个集合 - 购物车、明细列表这类「不能空着提交」的入参用它挡在门口 🧩 **方法定义**:`public static > C notEmpty(C collection, String message)` 🗣️ **入参解释**:`public static > C notEmpty(集合, 自定义消息)` 📤 **返回值解释**:`C`,原集合,保留具体类型 💡 **边界口径**: - 只看 `isEmpty()`,元素本身可以是 null - 返回的是同一个实例,后续改动会互相看见 - null 与空集合都按失败处理,抛 `IllegalArgumentException` 🧪 **方法示例**: - `notEmpty(items, "购物车不能空")` 拿到 `2 个元素`,且返回的就是那个原集合 - `notEmpty(new ArrayList(), "购物车不能空")` 抛 `购物车不能空` - `notEmpty((List) null, "列表不能为空")` 抛 `列表不能为空` --- 🔢 **方法序号**:6 🎯 **方法用途**: - 断言 Map 非 null 且至少有一个条目,返回原 Map - 配置表、价格表这类不能空着传进来的字典参数用这一版 🧩 **方法定义**:`public static > M notEmpty(M map, String message)` 🗣️ **入参解释**:`public static > M notEmpty(Map, 自定义消息)` 📤 **返回值解释**:`M`,原 Map,保留具体类型 💡 **边界口径**: - 判的是 `isEmpty()`,值为 null 的条目算有条目 - null 与空 Map 都抛 `IllegalArgumentException` - 与集合、数组重载同名,传 null 字面量要转型 🧪 **方法示例**: - `notEmpty(prices, "价格表不能为空")` 拿到 `{手机=4999}` - `notEmpty(new HashMap(), "配置不能为空")` 抛 `配置不能为空` --- 🔢 **方法序号**:7 🎯 **方法用途**: - 断言对象数组非 null 且长度大于 0,返回原数组 - 变参、批量券码这类以数组形态进来的参数用这一版 🧩 **方法定义**:`public static T[] notEmpty(T[] array, String message)` 🗣️ **入参解释**:`public static T[] notEmpty(对象数组, 自定义消息)` 📤 **返回值解释**:`T[]`,原数组 💡 **边界口径**: - 只收对象数组,`int[]` 等基本类型数组不是 `Object[]` 的子类型,编不过 - 基本类型数组要判空就直接写 `array.length == 0`,或先包成集合 - null 与长度 0 都抛 `IllegalArgumentException` 🧪 **方法示例**: - `notEmpty(coupons, "优惠券数组不能为空").length` 拿到 `1 张券` - `notEmpty(new String[0], "券码不能为空")` 抛 `券码不能为空` --- 🔢 **方法序号**:8 🎯 **方法用途**: - 断言布尔表达式为真,为假就抛出,返回 `void` - 库存够不够、状态能不能改这类业务前置条件用它是现成的 🧩 **方法定义**:`public static void isTrue(boolean expression, String message)` 🗣️ **入参解释**:`public static void isTrue(布尔表达式, 自定义消息)` 📤 **返回值解释**:`void`,本类里唯二不返回值的方法之一,通过就无声返回 💡 **边界口径**: - 消息由调用方给,工具类不猜业务语义 - 条件为真时不做任何事,没有返回值可以链式用 - 抛的是 `IllegalArgumentException`,不是自定义业务异常,需要特定异常类型就自己 `if` 抛 🧪 **方法示例**: - `isTrue(stock > 0, "库存不足,无法下单")` 无声通过,日志里还是 `库存 8` - `isTrue(stock == 0, "库存不足,无法下单")` 抛 `库存不足,无法下单` --- 🔢 **方法序号**:9 🎯 **方法用途**: - 断言布尔表达式为假,为真就抛出,返回 `void` - 「不能重复提交」「必须未支付」这类否定条件用它,省去取反 🧩 **方法定义**:`public static void isFalse(boolean expression, String message)` 🗣️ **入参解释**:`public static void isFalse(布尔表达式, 自定义消息)` 📤 **返回值解释**:`void`,表达式为假时无声返回 💡 **边界口径**: - 与 `isTrue` 互为镜像,不做其他校验 - 抛出的仍是 `IllegalArgumentException` 🧪 **方法示例**: - `isFalse(false, "该订单已取消,不能重复提交")` 通过,日志里是 `已取消标记 false` - `isFalse(true, "已取消的订单不能重复取消")` 抛 `已取消的订单不能重复取消` --- 🔢 **方法序号**:10 🎯 **方法用途**: - 断言整数值落在闭区间 `[min, max]` 内,返回原值 - 年龄、分页页码、数量上限这类有明确边界的整数参数用它,消息自带上下限与实际值 🧩 **方法定义**:`public static long inRange(long value, long min, long max, String name)` 🗣️ **入参解释**:`public static long inRange(数值, 下限, 上限, 参数名)` 📤 **返回值解释**:`long`,校验通过的原始数值 💡 **边界口径**: - 上下限都算在区间内,边界值能通过 - 越界消息形如 `age必须在[0, 150]之间,当前为-1`,参数名由调用方给 - 下限大于上限属配置错误,当场抛异常,消息里的数字按小数打印 - 消息只拼值,不做本地化数字格式 🧪 **方法示例**: - `inRange(30L, 0L, 150L, "age")` 拿到 `30` - 正好压上限 `inRange(150L, 0L, 150L, "age")` 拿到 `150` - `inRange(-1L, 0L, 150L, "age")` 抛 `age必须在[0, 150]之间,当前为-1` - 区间写反 `inRange(5L, 10L, 1L, "age")` 抛 `区间下限不能大于上限: min=10.0, max=1.0` --- 🔢 **方法序号**:11 🎯 **方法用途**: - 断言浮点值落在闭区间内,NaN 值与 NaN 边界都单独拦下 - 折扣率、比例这类 0 到 1 的小数校验用这一版 🧩 **方法定义**:`public static double inRange(double value, double min, double max, String name)` 🗣️ **入参解释**:`public static double inRange(数值, 下限, 上限, 参数名)` 📤 **返回值解释**:`double`,校验通过的原始数值 💡 **边界口径**: - 值是 NaN 直接抛 `参数名不能为NaN`,不会跟区间比出个假通过 - 边界写 NaN 也算配置错误,当场抛异常 - `±Infinity` 作边界是允许的,表示这一头不封顶 - 上下限含在内,口径与整型版一致 🧪 **方法示例**: - `inRange(0.85D, 0D, 1D, "discount")` 拿到 `0.85` - 上界给正无穷 `inRange(1.0D, 0D, Double.POSITIVE_INFINITY, "amount")` 拿到 `1.0` - 下界给负无穷 `inRange(-1D, Double.NEGATIVE_INFINITY, 1D, "rate")` 拿到 `-1.0` - 值是 NaN 抛 `rate不能为NaN` - 边界是 NaN 抛 `区间边界不能为NaN: min=NaN, max=1.0` --- 🔢 **方法序号**:12 🎯 **方法用途**: - 断言数值严格大于下界,等于下界不算通过,返回原值 - 用户 ID 必须为正、数量必须大于 0 这类只有下限的场景 🧩 **方法定义**:`public static long greaterThan(long value, long min, String name)` 🗣️ **入参解释**:`public static long greaterThan(数值, 下界, 参数名)` 📤 **返回值解释**:`long`,校验通过的原始数值 💡 **边界口径**: - 比较是严格大于,`value == min` 判失败 - 没有上限概念,要双向限制用 `inRange` - 消息形如 `qty必须大于1000,当前为1000` 🧪 **方法示例**: - `greaterThan(1001L, 0L, "userId")` 拿到 `1001` - `greaterThan(1000L, 1000L, "qty")` 抛 `qty必须大于1000,当前为1000` --- 🔢 **方法序号**:13 🎯 **方法用途**: - 断言字符串长度落在 `[min, max]` 内,返回原串 - 昵称、备注这类限长字段用它,消息自带区间与实际长度 🧩 **方法定义**:`public static String lengthBetween(String str, int min, int max, String name)` 🗣️ **入参解释**:`public static String lengthBetween(字符串, 最小长度, 最大长度, 参数名)` 📤 **返回值解释**:`String`,校验通过的原字符串 💡 **边界口径**: - 长度按 `char` 计数,Emoji 这类增补字符占 2 个 `char` - 区间写反属配置错误,抛 `长度区间非法: min=3, max=1`,不会留下永远不通过的校验 - 上下限含在内,长度等于边界算通过 - 字符串为 null 按失败处理,抛 `IllegalArgumentException` 🧪 **方法示例**: - `lengthBetween("小明", 2, 12, "nick")` 拿到 `小明` - `lengthBetween(emojiNick, 2, 12, "nick")` 拿到 `[😀笑] 的长度是 3`,Emoji 按 2 个 `char` 计 - `lengthBetween("abcd", 1, 3, "nick")` 抛 `nick长度必须在[1, 3]之间,当前为4` - 区间写反抛 `长度区间非法: min=3, max=1` ## 四、工具类源码(可直接复制) 📦 见评论区或本专栏简介