With JDK/12 EarlyAccess Build 10, the JEP-325 Switch Expressions has been integrated as a preview feature in the JDK. A sample code for the expressions (as in the JEP as well):
Scanner scanner = new Scanner(System.in); Day day = Day.valueOf(scanner.next()); switch (day) { case MONDAY, TUESDAY -> System.out.println("Back to work.") ; case WEDNESDAY -> System.out.println("Wait for the end of week...") ; case THURSDAY,FRIDAY -> System.out.println("Plan for the weekend?"); case SATURDAY, SUNDAY -> System.out.println("Enjoy the holiday!"); }
where Day
being an enum as
public enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
The Preview Language and VM Features JEP-12 already elaborate how a feature can be enabled during compile and runtime using javac
and java
.
How can one try out this feature using Maven?
To compile source code with javac that uses preview features from JDK release n, use javac from JDK release n with the --enable-preview command-line option in conjunction with either the --release n or -source n command-line option.
Build Java code This will run Maven, telling it to execute the compile goal. When it's finished, you should find the compiled . class files in the target/classes directory. The package goal will compile your Java code, run any tests, and finish by packaging the code up in a JAR file within the target directory.
mvn test-compile: Compiles the test source code. mvn test: Runs tests for the project. mvn package: Creates JAR or WAR file for the project to convert it into a distributable format. mvn install: Deploys the packaged JAR/ WAR file to the local repository.
If you want to use preview features in the latest versions of Java in IntelliJ IDEA, you need to set the language level to "Preview". Go to Project Structure, ⌘; (macOS) or Ctrl+Alt+Shift+S (Windows/Linux), make sure you have the correct JDK selected, and pick the "Preview" option from the Language Level dropdown.
One can make use of the following maven configurations to compile the code using the --enable-preview
along with --release 12
+ (e.g. 13
, 14
, 15
) argument.
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <release>12</release> <!-- <release>13/14/15</release> --> <compilerArgs>--enable-preview</compilerArgs> </configuration> </plugin> <!-- This is just to make sure the class is set as main class to execute from the jar--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>edu.forty.bits.expression.SwitchExpressions</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
Note:- I had to also ensure on my MacOS that my ~/.mavenrc
file was configured to mark java 13 as the default java configured for maven.
Execute the maven command to build the jar from the module classes
mvn clean verify
Use the command line to execute the main class of the jar created in the previous step as :
java --enable-preview -jar target/forty-bits-of-java-1.0.0-SNAPSHOT.jar
the last argument is the path to the jar built by maven.
This produces the output as expected as:
(screenshot is from a previous execution.)
Source on GitHub
Edit: A learning from an unwanted debugging session, use the arguments in the format as follows:
<compilerArgs> <arg>--enable-preview</arg> </compilerArgs>
Reason being, if you specify two different arguments it doesn't fail during the configuration validation and the one found later overrules the effective config:
<compilerArgs>--enable-preview</compilerArgs> <compilerArgs>-Xlint:all</compilerArgs>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With