cn.hutool.core.lang.Holder 详解

181 阅读2分钟

cn.hutool.core.lang.Holder 是 Hutool 工具库中的一个通用持有者类,用于临时存储和传递任意类型的对象。它类似于一个包装类,可以将一个对象包装起来,方便在方法之间传递或作为返回值使用。


1. Holder 的作用

  • 临时存储:用于存储一个对象,类似于一个容器。
  • 传递引用:在方法之间传递对象时,可以通过 Holder 来避免直接修改方法参数。
  • 多返回值:在 Java 中,方法只能返回一个值。如果需要返回多个值,可以将其中一个值放在 Holder 中作为输出参数。

2. Holder 的使用场景

  • 方法返回多个值:当方法需要返回多个值时,可以将其中一个值放在 Holder 中。
  • 避免修改方法参数:在方法中修改 Holder 的内容,而不是直接修改方法参数。
  • 临时存储中间结果:在复杂的逻辑中,临时存储某些中间结果。

3. Holder 的基本用法

3.1 创建 Holder 对象

import cn.hutool.core.lang.Holder;

// 创建一个 Holder 对象
Holder<String> holder = new Holder<>();

3.2 设置值

holder.set("Hello, Hutool!");

3.3 获取值

String value = holder.get();
System.out.println(value); // 输出: Hello, Hutool!

3.4 检查是否为空

boolean isEmpty = holder.isEmpty();
System.out.println(isEmpty); // 输出: false

4. 示例代码

示例 1:方法返回多个值

import cn.hutool.core.lang.Holder;

public class HolderExample {
    public static void main(String[] args) {
        Holder<String> messageHolder = new Holder<>();
        boolean success = processData(messageHolder);

        if (success) {
            System.out.println("处理成功,消息: " + messageHolder.get());
        } else {
            System.out.println("处理失败");
        }
    }

    public static boolean processData(Holder<String> messageHolder) {
        // 模拟数据处理
        boolean result = true; // 假设处理成功
        if (result) {
            messageHolder.set("数据已处理完成");
        }
        return result;
    }
}

示例 2:临时存储中间结果

import cn.hutool.core.lang.Holder;

public class HolderExample {
    public static void main(String[] args) {
        Holder<Integer> sumHolder = new Holder<>();
        calculateSum(10, 20, sumHolder);

        System.out.println("计算结果: " + sumHolder.get()); // 输出: 30
    }

    public static void calculateSum(int a, int b, Holder<Integer> sumHolder) {
        int sum = a + b;
        sumHolder.set(sum);
    }
}

5. Holder 的源码分析

Holder 的源码非常简单,核心代码如下:

public class Holder<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    private T value;

    public Holder() {}

    public Holder(T value) {
        this.value = value;
    }

    public T get() {
        return this.value;
    }

    public void set(T value) {
        this.value = value;
    }

    public boolean isEmpty() {
        return this.value == null;
    }
}
  • value:存储的对象。
  • get() :获取存储的对象。
  • set() :设置存储的对象。
  • isEmpty() :检查存储的对象是否为空。

6. 注意事项

  • 线程安全Holder 不是线程安全的。如果需要在多线程环境中使用,需要自行加锁或使用线程安全的容器。
  • 空值处理Holder 可以存储 null 值,调用 get() 时可能会返回 null
  • 性能Holder 是一个轻量级的包装类,性能开销很小。

7. 总结

  • cn.hutool.core.lang.Holder 是一个通用的持有者类,用于临时存储和传递对象。
  • 适用于方法返回多个值、避免修改方法参数、临时存储中间结果等场景。
  • 使用简单,但需要注意线程安全和空值处理。