JDK 8 Objects
工具类详解及源码解析
Objects
类是 JDK 8 引入的工具类,位于 java.util
包下,提供了一系列静态方法用于操作对象。它主要用于简化空值检查、对象比较、哈希码生成等常见操作,提高代码的健壮性和可读性。Objects类位于java.util包下,它主要用于处理对象的各种常见操作,尤其是在涉及对象比较、空值检查、哈希码生成等场景中发挥着重要作用。该类中的方法大多是静态方法,这使得我们可以方便地在不创建对象实例的情况下直接调用这些方法,从而简化代码结构。例如,在进行对象比较时,传统的方式可能需要编写较为复杂的逻辑来处理空值情况,而使用Objects类的方法则可以轻松应对。
一、核心功能概述
- 空值安全操作:避免
NullPointerException
。 - 对象比较:提供
equals
、deepEquals
等方法。 - 哈希码生成:辅助生成对象的哈希码。
- 字符串表示:生成对象的默认字符串表示。
- 类型检查:验证对象是否为指定类型。
二、常用方法详解及源码
1. 空值检查
(1) requireNonNull
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
// 带自定义错误消息的版本
public static <T> T requireNonNull(T obj, String message) {
if (obj == null)
throw new NullPointerException(message);
return obj;
}
// 带自定义 Supplier 生成错误消息的版本(JDK 8+)
public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
if (obj == null)
throw new NullPointerException(messageSupplier.get());
return obj;
}
- 用途:验证对象是否为
null
,若为null
则抛出NullPointerException
。 - 场景:方法参数校验、防御性编程。
(2) isNull
/ nonNull
public static boolean isNull(Object obj) {
return obj == null;
}
public static boolean nonNull(Object obj) {
return obj != null;
}
- 用途:显式判断对象是否为
null
。
2. 对象比较
(1) equals
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
- 逻辑:
- 若两个对象引用相同(
a == b
),返回true
。 - 否则,若
a
非空,调用a.equals(b)
。 - 避免直接调用
b.equals(a)
防止b
为null
时抛出异常。
- 若两个对象引用相同(
(2) deepEquals
public static boolean deepEquals(Object a, Object b) {
if (a == b)
return true;
else if (a == null || b == null)
return false;
else
return Arrays.deepEquals0(a, b);
}
- 用途:深度比较两个对象(包括嵌套数组)。
- 实现:委托给
Arrays.deepEquals0
处理。
3. 哈希码生成
(1) hash
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
- 用途:生成多个对象的组合哈希码。
- 实现:调用
Arrays.hashCode
,内部通过Objects.hashCode
计算每个元素的哈希码。
(2) hashCode
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
- 用途:安全地获取对象的哈希码,若对象为
null
返回0
。
4. 字符串表示
(1) toString
public static String toString(Object o) {
return String.valueOf(o);
}
// 带自定义 null 字符串的版本
public static String toString(Object o, String nullDefault) {
return (o != null) ? o.toString() : nullDefault;
}
- 用途:生成对象的字符串表示,处理
null
值。
5. 类型检查
(1) requireNonNullElse
/ requireNonNullElseGet
// 若 obj 为 null,返回默认值(JDK 9+)
public static <T> T requireNonNullElse(T obj, T defaultObj) {
return (obj != null) ? obj : defaultObj;
}
// 若 obj 为 null,通过 Supplier 生成默认值(JDK 9+)
public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier) {
return (obj != null) ? obj : supplier.get();
}
- 用途:提供
null
时的默认值(JDK 9+ 引入,JDK 8 需手动实现)。
三、使用示例
// 1. 空值检查
public void process(String input) {
String data = Objects.requireNonNull(input, "Input must not be null");
// ...
}
// 2. 对象比较
boolean isEqual = Objects.equals(str1, str2);
// 3. 哈希码生成
int hash = Objects.hash(field1, field2, field3);
// 4. 字符串表示
String str = Objects.toString(obj, "default");
// 5. 类型检查(需手动实现 JDK 8)
public static <T> T requireNonNullElse(T obj, T defaultObj) {
return obj != null ? obj : defaultObj;
}
四、设计思想
- 防御性编程:通过
requireNonNull
等方法提前终止非法流程。 - 空值安全:所有方法均处理
null
输入,避免隐式异常。 - 简洁性:替代繁琐的
if (obj == null) ...
判断。
五、注意事项
- 性能:
deepEquals
对嵌套数组可能较慢,需谨慎使用。 - 哈希冲突:
hash
方法生成的哈希码可能冲突,需结合equals
使用。 - 线程安全:
Objects
类方法均为无状态,天然线程安全。
六、总结
Objects
类在 JDK 8 中为开发者提供了一系列实用的工具方法,涵盖了对象比较、空值检查、哈希码生成等多个方面。通过合理使用这些方法,我们可以显著提高代码的健壮性和可读性,减少空指针异常等常见错误的发生。深入理解其源码实现,更能让我们掌握其设计思想和原理,在实际编程中灵活运用,提升开发效率和代码质量。无论是日常的业务开发,还是复杂的系统架构设计,Objects类都能成为我们得力的编程助手。