结论:只能判断对象本身是否为 null
,而不能判断对象内部的字段是否为空。
常规方法如下:
//ObjectUtils无法判断实体
if (ObjectUtils.isNotEmpty(whiteVo)) {
System.out.println("白规则不为空");
}
if (ObjectUtils.isNotEmpty(blackVo)) {
System.out.println("黑规则不为空");
Gson gson = new Gson();
String json = gson.toJson(blackVo);
System.out.println("黑规则 json"+json);
System.out.println("黑规则 输出"+blackVo);
}
//==无法判断实体
if (blackVo==null) {
System.out.println("黑规则为空");
}
//Optional无法判断实体
Optional<GphCustomerPageVo> optional = Optional.ofNullable(blackVo);
if (optional.isPresent()) {
// 实体对象不为null
GphCustomerPageVo gphCustomerPageVo = optional.get();
System.out.println("实体对象不为null:"+gphCustomerPageVo);
}
//tostring无法判断实体
if (StringUtils.isNotBlank(blackVo.toString())) {
System.out.println("tostring:"+blackVo.toString());
}
//Assert无法判断实体
Assert.notNull(blackVo, "实体对象不能为空");
无法判断实体的原因:
Java 开发中:当一个实体对象不为 null
,但其所有字段都为 null
时,常规的判断方式无法识别“它其实是个空对象”。
🧠 核心原因
你提到的这些方法和工具类(如 ObjectUtils.isNotEmpty
, Optional
, Assert.notNull
, toString()
等)只能判断对象本身是否为 null
,而不能判断对象内部的字段是否为空。
示例说明:
java
深色版本
GphCustomerPageVo blackVo = new GphCustomerPageVo();
这个对象:
blackVo != null
✅- 所有字段都是默认值(如
null
、0、false 等)
所以无论你怎么用下面的方法,它们都认为对象 不为空:
方法 |
判断依据 |
是否能判断字段为空 |
|
对象不是 null |
❌ |
|
直接比较引用 |
❌ |
|
对象不是 null |
❌ |
|
调用 toString() |
❌(除非手动重写返回 "") |
|
对象不是 null |
❌ |
✅ 正确做法:自定义方法判断字段是否为空
你需要手动编写逻辑来判断该对象是否是“业务意义上的空对象”。
方案一:手写判断关键字段是否全为空
public boolean isEntityEmpty(GphCustomerPageVo vo) {
if (vo == null) return true;
return
vo.getId() == null &&
vo.getDealerId() == null &&
vo.getCustomerId() == null &&
vo.getName() == null &&
vo.getRegisterMobileSecret() == null &&
// 继续添加你关心的关键字段...
true; // 最后一个条件补个 true 避免语法错误
}
然后你可以这样使用:
if (!isEntityEmpty(blackVo)) {
System.out.println("黑规则不为空");
} else {
System.out.println("黑规则实际为空");
}
方案二:使用反射自动判断所有字段是否为空(慎用)
如果你希望通用一点,可以用反射检查所有字段是否为 null:
⚠️ 注意:性能较低,适用于调试或非高频场景。
java
深色版本
public static boolean areAllFieldsNull(Object obj) throws IllegalAccessException {
if (obj == null) return true;
for (Field field : obj.getClass().getDeclaredFields()) {
field.setAccessible(true);
Object value = field.get(obj);
if (value != null) {
return false;
}
}
return true;
}
使用示例:
if (!areAllFieldsNull(blackVo)) {
System.out.println("黑规则不为空");
}
📝 总结
想法 |
实现方式 |
|
只能判断对象是否存在,不能判断内容是否为空 |
|
同上 |
|
同上 |
/ |
输出内容可见,但不能直接用于判断 |
想判断对象字段是否为空 |
✅ 必须自己写逻辑判断字段,或使用反射 |
💡 建议优化
如果你经常需要判断这类“空对象”,可以在 GphCustomerPageVo
类里加一个 isEmpty()
方法:
java
深色版本
public boolean isEmpty() {
return id == null && dealerId == null && customerId == null && name == null /* ... */;
}