java - 使用 java Supplier 接口(interface)创建条件对象

我有一个方法如下:

void updateObject(ObjOne obj, SomeClass data) {
    if(obj != null) {
        obj.doSomething(data);
    }
}

updateObject 被调用了很多次,为了避免在每个地方都进行 null 检查,我想避免以下情况:

// directly invoke doSomething conditionally.
if(obj != null) {
    SomeClass data = getData();
    obj.doSomething(data);
}

由于data仅在obj为非null时使用,我想到重构代码如下:

void updateObject(ObjOne obj, Supplier<SomeClass> data) {
    if(obj != null) {
        obj.doSomething(data.get());
    }
}

这只会在需要时创建一个 SomeClass 对象,而不是创建一个 Supplier 类型的对象。

上述使用 Supplier 的方法是否更好?

最佳答案

性能取决于 SomeClass 的构建成本例如,换句话说,仅创建 Supplier 时可以节省什么永远不会 SomeClass实例,以及不创建 SomeClass 的可能性实例。如果SomeClass在大多数情况下无论如何都会创建一个实例,显然你不能通过另外创建一个 Supplier 来保存任何东西。 .

如果您在不知道费用和可能性的情况下设计 API,您可以提供这两种方法并让调用者决定使用哪一种。这是一个既定的模式,例如

  • Objects.requireNonNull​(T obj, String message) 对比
  • Objects.requireNonNull​(T obj, Supplier<String> messageSupplier)

  • Objects.requireNonNullElse​(T obj, T defaultObj) 对比
  • Objects.requireNonNullElseGet​(T obj, Supplier<? extends T> supplier)

  • Optional.orElse​(T other) 对比
  • Optional.orElseGet​(Supplier<? extends T> supplier)

  • log​(System.Logger.Level level, String msg) 对比
  • log​(System.Logger.Level level, Supplier<String> msgSupplier)

https://stackoverflow.com/questions/67006971/

相关文章:

angular - 类型 'null' 的参数不可分配给参数 Angular

java - 使用 Java Streams 返回单词出现的句子计数和列表

c++ - 是否有一种算法可以快速将大量十六进制字符串转换为字节流?汇编/C/C++

flutter - 解决依赖关系 : pub finished with exit code 1

r - 如何根据在ggplot中分配的概率对单词重新排序

r - 错误延迟加载包 'devtools' 失败

numpy - 在 Julia 中替代 python 的 np.meshgrid()?

python - 替代全局变量

javascript - 使用 JavaScript 中的动态属性对数组中的所有对象项求和

reactjs - Eslint错误: Do not nest ternary expression