A private lambda function is accessing a private final class member that is initialised in the class constructor. However, this code pattern compiles with error: variable num might not have been initialized
public class Main {
private final int num;
public Main() {num = 7;}
private java.util.function.Supplier getNum = () -> num;
public void printNum() {
System.out.println(getNum.get());
}
public static void main(String[] args) {
Main main = new Main();
main.printNum();
}
}
However, the following patterns are fine:
i. Move lambda definition inside a method
public class Main {
private final int num;
public Main() {num = 7;}
private java.util.function.Supplier getNum;
public void printNum() {
getNum = () -> num;
System.out.println(getNum.get());
}
public static void main(String[] args) {
Main main = new Main();
main.printNum();
}
}
ii. Local lambda inside a method
public class Main {
private final int num;
public Main() {num = 7;}
public void printNum() {
java.util.function.Supplier getNum = () -> num;
System.out.println(getNum.get());
}
public static void main(String[] args) {
Main main = new Main();
main.printNum();
}
}
iii. Add this before the class member and cast this to the class name
public class Main {
private final int num;
public Main() {num = 7;}
private java.util.function.Supplier getNum = () -> ((Main) this).num;
public void printNum() {
System.out.println(getNum.get());
}
public static void main(String[] args) {
Main main = new Main();
main.printNum();
}
}
Could someone please explain what is going on above for each case? If it is compiler specific, I was testing on OpenJDK 11. Thank you.
P.S. a solution so that no this casting while the lambda can be shared among class methods is to also initialise it inside the class constructor
public class Main {
private final int num;
private final java.util.function.Supplier getNum;
public Main() {num = 7; getNum = () -> num;}
public void printNum() {
System.out.println(getNum.get());
}
public static void main(String[] args) {
Main main = new Main();
main.printNum();
}
}