Java is one of the most powerful programming languages in the software world. Recently, Java 16, the latest version of Java has been released on 16th March 2021.
Oracle announced the availability of Java 16 (JDK 16) with 17 new enhancements to the platform. This latest Java Development Kit release comes with language enhancements, new tools, and improved memory management to improve developer productivity and flexibility.
Last year, Oracle and OpenJDK community celebrated Java’s 25th birthday. Java continues to be a choice of developers and enterprises worldwide to build superior, performant, scalable, and secure software solutions. It is one of the most popular programming languages among developers and large-scale enterprises. Java development remains ahead of the other platforms and frameworks due to its performance, stability, superiority, and reliability over the years.
According to IDC’s latest report “Java Turns 25”, over nine million developers representing 69% of full-time developers worldwide use Java – this is more than any other language.
You may aware of the fact that Oracle delivers Java updates every six months to provide developers with quite a predictable release schedule. Let’s see what Java 16 offers to the developers’ community and global enterprises that already use Java.
Java 16: What’s New?
JDK 16 offers performance, security, and stability updates along with 17 main changes that are known as JDK Enhancement Proposals – JEPs.
Java 16 is available as the Oracle OpenJDK release using the open-source GNU General Public License v2.
Key Highlights Of Java 16:
- Language enhancements that were introduced in JDK 14 and finalized in JDK 16
- Improved memory management
- New Packaging Tool
- UNIX-Domain Socket Channels
- Warning for Value-based Classes
- Encapsulating JDK Internals by default
- Enable C++ 14 Language Features
- Incubating and Preview Features
Note: Please note that Java 16 is not a long-term support (LTS) release. According to the roadmap, Java 17, scheduled to release in September 2021 is an LTS version. So Java 16 unlikely to see widespread adoption based on the fact that no previous non-LTS iteration of the development framework was widely adopted and became popular among developers.
Let’s talk about Java 16 features and enhancements in detail.
Pattern matching and records were introduced in Java 14 as preview features and are now implemented in Java 16.
“Pattern Matching and Records were introduced a year ago as part of JDK 14 and have since gone through multiple rounds of community feedback based on real-world applications. This process has not only given Java developers the opportunity to experiment with these features before they were finalized but also incorporated that critical feedback which has resulted in two rock-solid JEPs that truly meet the needs of the community.”
– Georges Saab, vice president of development, Java Platform Group, Oracle
These two JEPs are – Pattern Matching for instanceof and Records.
Pattern Matching For instanceof:
The Instanceof operator in Java is used to check object reference. It returns either true or false value and checks whether an object belongs to a parent class, child class, or an interface. It is also used to check the type of object.
If this result returns true, the next step is to explicitly cast it to the specific type that is being compared. Pattern Matching for instanceof in Java helps remove redundant code of casting by introducing Pattern Matching variable.
With this JEP, the instanceof operator comes with a pattern variable. If the instanceof condition is true, the pattern variable binds to the variable being compared. This removes the need for explicit casting and allows conditional extraction of components from objects more safely and clearly.
Here is one example that helps you understand this feature:
Here, the first step is to verify whether a circle is an instance of class ‘Shape’ or not. If instanceof returns true, then the shape object casts to the type of Class circle.
New Java 16 Feature:
The above code is now simplified like this. Here, instanceof operator with a pattern matching variable shape is used. If it matches successfully, it will return a result of the draw method.
Another feature that was introduced in Java 14 and Java 15 is Records. Record is a special Java class that offers a compact syntax for defining immutable data classes.
This will simplify passing immutable data between objects. Before this, it was a mundane task to pass immutable data as it required boilerplate methods and classes. Record simply designed to hold data in it.
Improved Memory Management:
These two new features are introduced in Java 16 – Elastic Metaspace and ZGC: Concurrent Thread-Stack Processing.
We will see these two features in detail.
The primary function of Metaspace is to manage memory for class metadata. Elastic Metaspace is introduced to improve the allocation and deallocation of metaspace memory in the HotSpot JVM. This is used to return unneeded memory to the OS more quickly, thereby reducing overhead and memory fragmentation.
It allocates memory in smaller chunks and improves elasticity by returning unused metaspace memory to the OS. It leads to greater performance and reduced maintenance costs.
ZGC: Concurrent Thread-Stack Processing:
Oracle’s Z Garbage Collector is one of the low-latency collectors in the HotSpot JVM. This JEP moves ZGC thread-stack processing from safepoints to a concurrent phase.
What does this mean?
This concurrent phase allows removing the final source of latency in the ZGC garbage collector. Here, the concurrent phase means that all heavy lifting is done while Java threads continue to execute through millisecond pauses inside GC safepoints.
This concurrent ZGC Garbage collection will greatly improve performance and efficiency, especially in large-scale apps.
New Packaging Tool:
This was also introduced in Java 14 as an incubator module. This new Packaging tool can be used for packaging self-contained Java applications. To give users a natural installation experience, it supports native packaging formats.
Unix-Domain Socket Channel:
Unix-Domain sockets are similar to TCP/IP sockets and are used for inter-process communication (IPC) on the same host OS. Unlike TCP/IP sockets, these sockets are addressed by file system pathnames rather than IP addresses and port numbers.
They are more secure and efficient than TCP/IP loopback connections. Java 16 adds support for all of the features of UNIX-domain sockets. Now, Java’s socket channel/server-socket channel API can use Unix domain sockets for faster and efficient IPC on the same host. Before Java 16, this was limited to TCP/IP sockets.
Warning For Value-based Classes:
This JEP designates the primitive wrapper classes as value-based and deprecates their constructors for removal, causing new deprecation warnings.
It provides warnings on improper attempts to synchronize on instances of any value-based classes.
Encapsulating JDK Internals By Default:
This is implemented with a goal to continuously improve the security and maintainability of the JDK. This JEP denotes the strong encapsulation of all internal elements of the JDK – except for some critical internal APIs.
This further encourages developers to migrate from using internal elements to using standard APIs, so developers can easily upgrade to future Java releases.
Enable C++ 14 Language Features:
This JEP enables the use of C++14 language features in JDK C++ source code. It also offers guidance on which of these features may be used in HotSpot code.
This JEP, along with JEP 357 and JEP 369 are focused to improve productivity for OpenJDK developers.
The abovementioned JEPs migrate the source code repositories of the OpenJDK community from Mercurial to Git and host OpenJDK’s Git repositories on GitHub.
Incubating And Preview Features:
This Incubator Vector API is an initial iteration of an incubator vector module. It expresses vector computations that compile at runtime to optimal vector hardware instructions. This vector API is based on the principle that Java developers should be able to use any native library that is required for a particular task.
Foreign Linker API:
This API offers statically typed, pure-Java access to native code.
Foreign-Memory Access API:
It allows Java programs to safely and efficiently access foreign memory outside of the Java heap. It also provides the foundation for the Foreign Linker API.
This second preview of sealed classes restricts which other classes or interfaces may extend or implement them. It allows the author to control which code is responsible for implementing it.
Java 17: Be Ready To Use Modern LTS Java Release
Oracle announced that Java 17(LTS release) will be released in September (2021) this year. As per the schedule, if Java 17 would become the next LTS release, it would come up with some nice features that further enhance the stability, security, and performance of the Java platform.
Java: Platform of Choice For Enterprise Application Development
Java is one of the most successful development platforms and it remains the number one programming language of choice by enterprises and developers worldwide. It continues to gain popularity even after 25 years of its creation. With continuous enhancement and a large ecosystem of products, people, and organizations, the Java platform is well-positioned, enhanced, and suitable for modern application development.