Java 9 project coin language changes

The Java 9 project coin language changes include diamond with anonymous classes, private methods in interfaces, removing ‘_’ as a single character identifier, @SafeVargs on private instance methods and effectively final variables as resources in try-wth-resources statement.

1. Diamond with anonymous classes

Prior to Java 1.6, constructors did not have inferred type inference. This code would work in java 1.6

but, omitting type on the constructor would not work.

java7 fixed that and we could use the diamond. However, the diamond can’t be used with anonymous classes. For example, lets create an anonymous classes

This is an anonymous class that extends an ArrayList. This would not compile in Java 7 and Java 8, however, Java 9 allows this as part of project coin changes.

2. private methods in interfaces

Java 8 introduced the concept of default methods. These are methods in interfaces that have implementation.

In the example above methodB has an implementation and is a default method. methodC has an implementation but is a private method. They can be used by
other private methods and default methods in the interface.

3. Removing ‘_’ as a single character identifier

Versions prior to 9 allowed a variable called ‘_’ (underscore). Java 9 disallows that. Java 1.8 started using the underscore as a keyword and the compiler gave a warning. Java 9 gives a compile error.

4. @SafeVargs on private instance methods

When a method declares a method with parameterized variable argument, the compiler gives a warning . For example

For this method the compiler gives a warning on a that says ‘Type safety: Potential heap pollution via varargs parameter a’. This is because java internally converts T… a to T[], but because java does not allow parameterized arrays the type is erased the it ends up as Object[]. This can potentially cause heap pollution. If you are sure that your method handles the vararg safely, you can annotate the method with @SafeVargs annotation and this will remove the compiler warning. Java 9 allows using the @SafeVargs annotation on private instance methods.

5. effectively final variables as resources in try-wth-resources statement

try-with-resources allows using auto-closeable objects inside the try block, so that they are automatically closed. For example, prior to Java9, this is how you would use a BufferedReader

However, with Java 9, you don’t need to redeclare a variable if it is final or effectively final.
This works with Java 9

However, note that the varialbe has to be effectively final or final, so this does not work.

This completes our discussion on the language changes in Java 9. In the next article we will look at JLink tool.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.