Это захват локальной или статической переменной? - PullRequest
0 голосов
/ 18 июня 2019

В следующем коде лямбда-выражения захватывают переменную static.Однако это также local для области охвата класса, так что это будет захват локальной переменной или захват статической переменной?

public class ExampleImpl{
    static String someStaticVar = "text";
    Example lam = () -> {
        System.out.println(someStaticVar);
    };


    interface Example {
        void sample();
    }
}

1 Ответ

1 голос
/ 18 июня 2019

Термины «захват локальной переменной» и «захват статической переменной» не встречаются нигде в спецификации, поэтому их значение будет зависеть от того, кто придумал эти термины.

Наиболее вероятная интерпретация состоит в том, что «захват локальной переменной» означает просто «захват локальной переменной», а также «захват статической переменной» означает «захват статической переменной», другими словами, захват переменной, которая происходит с быть либо локальным, либо полем экземпляра, либо статическим полем, а затем, ответ довольно прост, природа переменных не меняется, когда вы помещаете лямбда-выражение в другую область.

В вашем примере someStaticVar всегда является переменной static, независимо от того, где вы к ней обращаетесь.

Непонятно, почему это различие важно для вас. Могут быть технические различия под капотом, которые намеренно не определены, следовательно, специфичны для реализации. Наиболее важным аспектом типа захваченных переменных будет то, что захват переменной экземпляра приведет к тому, что сгенерированный экземпляр сохранит ссылку на экземпляр. Но, во-первых, это не относится к локальным переменным или статическим переменным, во-вторых, это естественные отношения, и код, потенциально обращающийся к полю экземпляра, может предотвратить сборку мусора этого экземпляра.

...