self-reference in initializer, Anonymous class vs Lambda
2020-01-08
사무실에서 갑자기 누가 뭘 물어봐서.. 알게된 사실..
public enum ABC {
A("ABC A", new Supplier<String>() {
@Override
public String get() {
return ABC.A.value + ", from anonymous class";
}
}),
B("ABC B", () -> {
String value = ABC.B.value;
return value + ", from lambda"; // 1)
//return ABC.B.value + ", from lambda"; // 2)
}),
;
private String value;
private Supplier<String> supplier;
ABC(String value, Supplier<String> supplier) { MainApp.looger.debug("ABC Constructor {}", this.toString()); this.value = value; this.supplier = supplier;}
public String getSupplier() {
return supplier.get();
}
}
1) 대신 2) 를 사용하면, error: self-reference in initializer
컴파일 에러가 난다.
참고 페이지들을 보면, 버그는 아니고.. 람다는 원래 그래! 이러고 있는 듯하다. 람다가 내부적으로 클래스를 만들지만, 문법적으로는 표현식으로 평가해주기 바라는 걸까?
참고