JDK-8180758 : Illegal writes to final fields are allowed from lambdas inside a constructor
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 8u131,9
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • Submitted: 2017-05-22
  • Updated: 2017-06-01
  • Resolved: 2017-06-01
Related Reports
Duplicate :  
Description
public class UpdateFinalField {
    final int f;
    final Runnable updater;

    UpdateFinalField() {
        updater = () -> { f = 1; };
        f = 0;
    }

    public static void main(String[] args) {
        UpdateFinalField u = new UpdateFinalField();
        System.out.println("u.f = " + u.f);
        u.updater.run();
        System.out.println("u.f = " + u.f);
    }
}

$ jdk.8u131/bin/javac -d classes.8 UpdateFinalField

$ jdk.8u131/bin/java -cp classes.8 UpdateFinalField
u.f = 0
u.f = 1

$ jdk.9/bin/java -cp classes.8 UpdateFinalField
u.f = 0
u.f = 1

$ jdk.9/bin/javac -d classes.9 UpdateFinalField

$ jdk.9/bin/java -cp classes.9 UpdateFinalField
u.f = 0
Exception in thread "main" java.lang.IllegalAccessError: Update to non-static final field UpdateFinalField.f attempted from a different method (lambda$new$0) than the initializer method <init> 
	at UpdateFinalField.lambda$new$0(UpdateFinalField.java:6)
	at UpdateFinalField.main(UpdateFinalField.java:13)

Comments
This case was not covered by the spec. JDK-8043176 fixed the spec. JDK-8043179 documents the unresolved bug in javac.
01-06-2017