1995年にUNIXベンダーとして有名でだったサン・マイクロシステムズによって公開されたプログラミグ言語の Java は、これまで多くのバージョンアップを繰り返し、新しい機能の追加や削除がされてきました。
前回の記事では、JDK、JRE、JVMの違いや、Java 1.5 から 1.9 までの新機能を紹介してきました。この記事では、Java 10 から Java 17 までの新機能を紹介します。
【関連記事】
▶Javaのバージョンの違いとは?JDK、JRE、JVMって何?の疑問を解決
Java 10
Java 10の新機能として varを用いた型推論が追加されました。
var を使用することで初期値を指定して変数の宣言する際、データ型の記述を省略できるようになりました。これにより、冗長になりがちだった変数の宣言をスッキリしたコードで書けるようになりました。
varを用いることで、これまで次のように宣言されていた変数は…
String str = "12345";
FileOutputStream file = new FileOutputStream("path/to/file”);
以下のように var 用いて変数の型の宣言を省略できます。
var str = "12345";
var file = new FileOutputStream("path/to/file”);
var についての詳しい内容は、次の記事で解説していますので、こちらもご覧ください。
【関連記事】
▶Javaで便利な「var」を使って変数の型指定を省略(推論)する方法
Oracle JDK のライセンスに大きな変更がった
この時、新しい機能以外にサポート面でも大きな変化がありました。
Oracle は、Oracle JDK を本番環境で使用する場合は、有償のサポート契約を結ぶ必要があるとライセンスを変更し、大きな話題となりました。
当時の内容については、次の記事で詳しく解説しています。
【関連記事】
▶Javaのサポートについて解説!Oracle JDKの有償化と無料でJavaを使う方法
Java 11
Java 11では、特別大きな機能の追加は行われませんでしたが、いくつか細かい点で改善が行われました。
主な変更点は以下の通りです。
- 単一ファイルソースコードの実行
- 新元号対応(NewEra)
1つ目の単一ファイルソースコードの実行は、これまで単一ファイルであっても javac コマンドでコンパイルを行ってから java コマンドで実行する必要がありましたが、直接 java コマンドで実行できるようになりました。
public class Main {
public static void main(String[] args) {
System.out.println("Hello Java");
}
}
以下のように、直接 Java のソースファイル名を指定して java コマンドを実行できます。
$ java Main.java
Hello Java
2つ目の新元号対応ですが、新しい元号に対応すべく仮置きで新元号の設定が追加されました。そちて後に新元号の「令和」が正式に設定されました。
いくつかの機能が削除された
Java 11では、あまり使わなくなったレガシーな機能や、機能の統廃合により、次のモジュールがリリースから削除されました。
- CORBA関連モジュールの削除
- Java EE関連モジュールの削除(Jakarta EE への移行)
- JavaFX関連モジュールの削除
Java 12
Java 12では、いくつかの細かい改善が行われました。
一般的なプログラマーに関係する変更点には、次のものがあります。
CompactNumberFormat
NumberFormat.getCompactNumberInstance() で取得したフォーマッタを使用することで、数値を、○万、○億、○兆のように表記します。
import java.text.NumberFormat;
public class Main {
public static void main(String[] args) {
NumberFormat cnf = NumberFormat.getCompactNumberInstance();
System.out.println(cnf.format(10000));
System.out.println(cnf.format(100000000L));
System.out.println(cnf.format(1000000000000L));
}
}
String.indent(int)
String クラスに indent メソッドが追加されました。このメソッドは、その名の通り文字列に対してインデントを付与します。
次のサンプルコードのように、改行を含む文字列を引数に String.indent を呼び出すと、各行の先頭に指定したインデント数分のスペースが追加され文字列が取得できます。
public class Main {
public static void main(String[] args) {
String target = "Java\nPython\nPHP\nC#";
System.out.println("<元の文字列>");
System.out.println(target);
System.out.println("<インデント後の文字列>");
System.out.println(target.indent(2));
}
}
実行結果
<元の文字列>
Java
Python
PHP
C#
<インデント後の文字列>
Java
Python
PHP
C#
Java 13
Java 13でも、いくつかの細かい改善が行われました。
この時期の Java は、半年ごとにバージョンアップを繰り返すロードマップでリリースがされていたたため、昔のように、大きな機能の追加でバージョンアップを行うのではなく、小規模な改善を断続的に繰り返していました。
Java 13の新機能で、一般的なプログラマーに関係する変更点には、次のものがあります。
String.formatted
これまでは、static メソッドとして利用可能であった String.format メソッドと同じ機能が、インスタンスメソッドの formatted で利用可能になりました。
public class Main {
public static void main(String[] args) {
String target = "私は今日%d時に起きました";
System.out.println(target.formatted(1)); //私は今日1時に起きました
}
}
他にも、TCPソケットのAPI実装の見直しや、ガベージコレクションの改善などが行われています。
まとめ
Java10 から 13 までの新機能を解説してきました。
バージョン 11からは、Java は半年ごとにリリースを行うサイクルになっているため、バージョンアップのたびに大きな機能が追加されるのではなく、小規模な改善が繰り返し行われています。
後の 2021に Oracleは、再度 JDK のライセンスを変更し、現在では本番環境でも無料で使えるようになっています。