On Thu, 3 Oct 2024 19:54:58 GMT, Andy Goryachev <[email protected]> wrote:
>> It's an interesting suggestion, but it is not needed. `javac` will already
>> deduplicate these.
>>
>> You can even verify that this is the case. Use `javap` to decompile the
>> class file with `javap -c <classname>`. In there, `invokedynamic` is used
>> to represent the lambda's. It looks like this for example:
>>
>> 120: invokedynamic #54, 0 // InvokeDynamic
>> #1:test:(Lcom/sun/javafx/scene/control/behavior/ScrollPaneBehavior;)Ljava/util/function/Predicate;
>>
>> Later on, you'll see another:
>>
>> 152: invokedynamic #54, 0 // InvokeDynamic
>> #1:test:(Lcom/sun/javafx/scene/control/behavior/ScrollPaneBehavior;)Ljava/util/function/Predicate;
>>
>> What you can see here is that the same constant (# 54) is used to reference
>> the method. So, there's no need to help the compiler here.
>
> hmmm... when I set up a breakpoint in Eclipse in KeyMapping:785 (after it
> hits the ScrollPaneBehavior<init>) the value for `interceptor` changes
>
>
> interceptor= 0x0000007001340d50 (id=208)
> interceptor= 0x00000070013411c0 (id=212)
> interceptor= 0x0000007001341630 (id=216)
>
>
> I think it's still creates a different lambda object. (I recall testing this
> assumption with some unit test a while back).
yep, it's a different object. the constant you are referring to is just a name
of the method, I think. here:
public class AppTestLauncher {
public static void main(String[] args) throws Throwable {
Runnable a = AppTestLauncher::func;
Runnable b = AppTestLauncher::func;
System.out.println("a=" + a + " b=" + b + " == " + (a == b));
}
static void func() { }
outputs
`a=goryachev.apps.AppTestLauncher$$Lambda/0x000000f801008c78@16c0663d
b=goryachev.apps.AppTestLauncher$$Lambda/0x000000f801008e90@23223dd8 == false
`
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1582#discussion_r1786841867