Java中向Supplier传递this的最优方式?是否有返回this的预定义函数?
关于Java中返回
this的预定义函数及性能分析 核心问题:有没有预定义的() -> this等价实现
Java标准库中没有像Function.identity()那样的全局预定义函数来返回this。原因很简单:this是当前实例的引用,和具体对象绑定,没法做通用的全局Supplier实现——毕竟每个对象的this都独一无二,全局逻辑无法感知当前调用的是哪个实例。
你的场景分析及代码修正
首先注意:你代码里的future.complete(...)调用有误,CompletableFuture.complete()方法直接接收最终结果,而非Supplier;你需要的是completeAsync(Supplier<? extends T>),它会异步执行Supplier获取结果并完成Future。修正后的complete()方法应该是:
void complete() { // 正确调用completeAsync,传入Supplier future.completeAsync(() -> this); // 或者用方法引用 future.completeAsync(this::self); }
lambda vs 方法引用的性能开销
关于你关心的内存分配问题:
() -> this是捕获当前实例的lambda,this::self是实例方法引用,二者底层实现非常相似——都会生成关联当前实例的函数对象。- 多数情况下,JVM的逃逸分析会优化掉这些对象的分配,尤其是当Supplier仅在当前方法内使用时,JVM可能将其分配在栈上而非堆上,避免GC开销。
- 如果
complete()会被频繁调用,你可以在类中预定义一个Supplier成员变量,彻底避免重复分配:
class Thing<T> { final T value; final CompletableFuture<T> future; private final Supplier<Thing<T>> selfSupplier = () -> this; void complete() { future.completeAsync(selfSupplier); } }
这样每次调用complete()时复用同一个Supplier实例。
额外说明
自己实现self()方法其实没必要,() -> this已经足够简洁。方法引用this::self和lambda() -> this语义完全等价,写法不同而已,性能上没有显著差异。
内容的提问来源于stack exchange,提问作者jocull
相关产品推荐
相关产品推荐

