Why does lambda translation need generation of a static method?

后端 未结 3 1301
花落未央
花落未央 2020-12-16 12:35

Lambda translation is a two step process, One: desugaring the lambda into a static method in same class.

public class Main {
    public stat         


        
3条回答
  •  孤城傲影
    2020-12-16 13:05

    Your test is incomplete.

    public class Lambda {
    
      private String hello = "Hello from instance";
    
      public static void main(String[] args) {
        Runnable r = () -> System.out.println("Hello");
        for (Method m: Lambda.class.getDeclaredMethods()) {
          System.out.println(m);
        }
      }
    
      public void instanceMethodWithAccessToInstanceVariables(){
        Runnable r = () -> System.out.println(hello);
      }
    
      public void instanceMethodWithoutAccessToInstanceVariables(){
        Runnable r = () -> System.out.println("Hello from instance");
      }
    }
    

    This results in the following:

    public void Lambda.instanceMethodWithAccessToInstanceVariables()
    public void Lambda.instanceMethodWithoutAccessToInstanceVariables()
    private static void Lambda.lambda$instanceMethodWithoutAccessToInstanceVariables$2()
    private void Lambda.lambda$instanceMethodWithAccessToInstanceVariables$1()
    private static void Lambda.lambda$main$0()
    public static void Lambda.main(java.lang.String[])
    

    This clearly shows several cases:

    • lambdas in static method declare static method
    • lambdas in instance methods using instance variables declare instance methods
    • lambdas in instance methods not using instance variables declare static method

    The two first are rather logical. Why would you expect a static member to access an instance member? Same for the instance method.

    The real question is why does an instance method not using any instance variables declare a static method?

    Well, this is also for performance and safety reasons mentioned by Tagir.

提交回复
热议问题