📋 目录
一、工具类功能
方法入口处一行断言替掉层层判空:对象非 null、字符串非空白、集合与 Map 与数组非空、布尔成立、数值在闭区间、长度在范围内;校验通过就把值原样返回,能直接写进赋值和链式调用。
二、所需环境
JDK 17或以上
三、方法与调用示例(按需调用)
🔢 方法序号:1
🎯 方法用途:
- 断言对象不为 null,通过时把原对象返回,可以直接写进赋值语句
- 构造器注入、字段赋值这类「进来就得有值」的入口用它替掉一层判空
🧩 方法定义:public static <T> T notNull(T object, String message)
🗣️ 入参解释:public static <T> T notNull(待校验对象, 自定义消息)
📤 返回值解释:T,就是传进来的那个对象,不做拷贝
💡 边界口径:
- 失败抛
IllegalArgumentException,消息完全用调用方传入的文案 - 返回的是同一个引用,不是新建对象
- 只判 null,空串与纯空白要用
notEmpty、notBlank - 想省掉消息用单参版,消息走默认文案
🧪 方法示例:
notNull(" tom ", "buyer 不能为null").length()拿到7,值被直接接走- 断言通过时返回的就是原对象,
notNull("abc", "不该抛")拿到true - 传 null 抛
IllegalArgumentException,消息是自定义的那句
🔢 方法序号:2
🎯 方法用途:
- 判 null 的简写版,不传消息,失败时用固定文案
- 内部代码、消息不需要给前端看的场合用它少敲一个参数
🧩 方法定义:public static <T> T notNull(T object)
🗣️ 入参解释:public static <T> T notNull(待校验对象)
📤 返回值解释:T,传进来的对象本身
💡 边界口径:
- 默认消息是
参数不能为null,不带参数名,对外提示不如两参版清楚 - 口径与两参版完全一致,内部就是转调
🧪 方法示例:
notNull("order-service")拿到order-servicenotNull(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 extends Collection<?>> C notEmpty(C collection, String message)
🗣️ 入参解释:public static <C extends Collection<?>> C notEmpty(集合, 自定义消息)
📤 返回值解释:C,原集合,保留具体类型
💡 边界口径:
- 只看
isEmpty(),元素本身可以是 null - 返回的是同一个实例,后续改动会互相看见
- null 与空集合都按失败处理,抛
IllegalArgumentException
🧪 方法示例:
notEmpty(items, "购物车不能空")拿到2 个元素,且返回的就是那个原集合notEmpty(new ArrayList<String>(), "购物车不能空")抛购物车不能空notEmpty((List<String>) null, "列表不能为空")抛列表不能为空
🔢 方法序号:6
🎯 方法用途:
- 断言 Map 非 null 且至少有一个条目,返回原 Map
- 配置表、价格表这类不能空着传进来的字典参数用这一版
🧩 方法定义:public static <M extends Map<?, ?>> M notEmpty(M map, String message)
🗣️ 入参解释:public static <M extends Map<?, ?>> M notEmpty(Map, 自定义消息)
📤 返回值解释:M,原 Map,保留具体类型
💡 边界口径:
- 判的是
isEmpty(),值为 null 的条目算有条目 - null 与空 Map 都抛
IllegalArgumentException - 与集合、数组重载同名,传 null 字面量要转型
🧪 方法示例:
notEmpty(prices, "价格表不能为空")拿到{手机=4999}notEmpty(new HashMap<String, String>(), "配置不能为空")抛配置不能为空
🔢 方法序号:7
🎯 方法用途:
- 断言对象数组非 null 且长度大于 0,返回原数组
- 变参、批量券码这类以数组形态进来的参数用这一版
🧩 方法定义:public static <T> T[] notEmpty(T[] array, String message)
🗣️ 入参解释:public static <T> 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, "库存不足,无法下单")无声通过,日志里还是库存 8isTrue(stock == 0, "库存不足,无法下单")抛库存不足,无法下单
🔢 方法序号:9
🎯 方法用途:
- 断言布尔表达式为假,为真就抛出,返回
void - 「不能重复提交」「必须未支付」这类否定条件用它,省去取反
🧩 方法定义:public static void isFalse(boolean expression, String message)
🗣️ 入参解释:public static void isFalse(布尔表达式, 自定义消息)
📤 返回值解释:void,表达式为假时无声返回
💡 边界口径:
- 与
isTrue互为镜像,不做其他校验 - 抛出的仍是
IllegalArgumentException
🧪 方法示例:
isFalse(false, "该订单已取消,不能重复提交")通过,日志里是已取消标记 falseisFalse(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")拿到1001greaterThan(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
四、工具类源码(可直接复制)
📦 源码文件