Javadoc for MethodHandles.foldArguments包含此括号内注:
(请注意,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之间的关系(如果有的话)是什么?