JDK 8 Objects 详解及详细源码展示

JDK 8 Objects 工具类详解及源码解析

Objects 类是 JDK 8 引入的工具类,位于 java.util 包下,提供了一系列静态方法用于操作对象。它主要用于简化空值检查、对象比较、哈希码生成等常见操作,提高代码的健壮性和可读性。Objects类位于java.util包下,它主要用于处理对象的各种常见操作,尤其是在涉及对象比较、空值检查、哈希码生成等场景中发挥着重要作用。该类中的方法大多是静态方法,这使得我们可以方便地在不创建对象实例的情况下直接调用这些方法,从而简化代码结构。例如,在进行对象比较时,传统的方式可能需要编写较为复杂的逻辑来处理空值情况,而使用Objects类的方法则可以轻松应对。


一、核心功能概述
  1. 空值安全操作:避免 NullPointerException
  2. 对象比较:提供 equalsdeepEquals 等方法。
  3. 哈希码生成:辅助生成对象的哈希码。
  4. 字符串表示:生成对象的默认字符串表示。
  5. 类型检查:验证对象是否为指定类型。

二、常用方法详解及源码
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) 防止 bnull 时抛出异常。
(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;
}

四、设计思想
  1. 防御性编程:通过 requireNonNull 等方法提前终止非法流程。
  2. 空值安全:所有方法均处理 null 输入,避免隐式异常。
  3. 简洁性:替代繁琐的 if (obj == null) ... 判断。

五、注意事项
  1. 性能deepEquals 对嵌套数组可能较慢,需谨慎使用。
  2. 哈希冲突hash 方法生成的哈希码可能冲突,需结合 equals 使用。
  3. 线程安全Objects 类方法均为无状态,天然线程安全。
六、总结

Objects类在 JDK 8 中为开发者提供了一系列实用的工具方法,涵盖了对象比较、空值检查、哈希码生成等多个方面。通过合理使用这些方法,我们可以显著提高代码的健壮性和可读性,减少空指针异常等常见错误的发生。深入理解其源码实现,更能让我们掌握其设计思想和原理,在实际编程中灵活运用,提升开发效率和代码质量。无论是日常的业务开发,还是复杂的系统架构设计,Objects类都能成为我们得力的编程助手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值