Just trying a hands-on the java.lang.Record. I have gone through the documentation and the JEP-359 for some understanding. So upon reading about the implicit declaration of the constructor I thought of mixing it up with an existing code generation library - Lombok!
Now what I've ended up creating as a minimal reproducible example is this record
import lombok.AllArgsConstructor;
@AllArgsConstructor
public record Java(String version) {
}
which when compiled using IntelliJ successfully produces the class file which looks like
public final class Java extends java.lang.Record {
private final java.lang.String version;
public Java(java.lang.String version) { /* compiled code */ }
... rest of the compiled code
}
Note that the constructor for the .class
file is just what I would have expected in the two worlds independently as well. But, further trying to create an instance of this record fails during compilation in IntelliJ :
public class MixOfWorlds {
public static void main(String[] args) {
System.out.println(new Java("14").version()); // cannot resolve constructor
}
}
I would create a further simpler example to perform the compilation with javac
and execution with java
tools. I am still looking for an answer if this is a possible expected behavior that could occur because of something I might have overlooked?
IntelliJ IDEA 2020.1 EAP (Community Edition)
Build #IC-201.6487.11, built on March 18, 2020
Runtime version: 11.0.6+8-b765.15 x86_64
macOS 10.14.6
This is how it reflects in IntelliJ for both the cases - with and without the @AllArgsConstructor
.
Following up on this and with some help online from the IntelliJ developers, I had tried the following steps to resolve this --
javac-lombok
interaction and was not connected to IDE.Note: The second step was with the plugin installed. So in short, it just happens that the plugin gets to highlight the code as if it wouldn't compile, but the actual execution is handled by IntelliJ properly. (Kudos!)
Edit: With the 1.8.20
release, Lombok prevents a record
to be annotated with an AllArgsConstructor
any more. You can access the official changelog here.