0

MethodHandles.foldArguments的Javadoc包含以下括号注释:

(请注意,dropArguments 可用于删除组合器或目标不希望接收的任何参数。如果某些传入参数仅用于组合器,请考虑使用 asCollector 代替,因为这些参数不需要在进入目标时驻留在堆栈中。)

首先,我很困惑这是否建议用 dropArguments+asCollector 替换 foldArguments,用 asCollector 替换 foldArguments+dropArguments,用 foldArguments+asCollector 替换 foldArguments+dropArguments 等等。

其次,我不明白为什么 MethodHandles.asCollector 在这里完全相关。

  • 该注释没有说“如果您只想将参数收集到一个数组中,请使用 asCollector”,它似乎暗示 asCollector 是 foldArguments 的一般替代品(可能与 dropArguments 结合使用),但事实并非如此。

  • 关于“在进入目标时位于堆栈上”的说法似乎暗示我应该首先将任何“仅用于组合器”的参数收集到带有 asCollector 的数组中,然后再将它们发送到组合器。我不明白添加数组创建和额外的间接级别将如何帮助任何事情,特别是因为如果生成的方法句柄被内联,JVM 无论如何都会尝试优化数组创建。如果使用 dropArguments 删除了仅组合器的 args,则 JVM 应该能够证明它们没有在目标中使用。如果由于某种原因 JVM 无法证明仅组合器的 args 未在目标中使用,因此必须使它们保持活动状态,那么肯定由 asCollector 创建的数组将保持活动状态,从而使其内容也保持活动状态。他们'

  • Java 8 添加了MethodHandles.collectArguments,它以明显的方式结合了 foldArguments 和 dropArguments 来实现仅收集器的参数。Javadoc collectArguments 没有提到 asCollector 作为替代,建议使用 asCollector 的任何建议不再成立,但 foldArguments Javadoc 仍然包含令人困惑的括号注释。

MethodHandles.foldArguments 和 MethodHandle.asCollector 之间有什么关系(如果有的话)?

4

0 回答 0