Java 13の機能
Java 13は、2019年9月17日に本番環境での使用が開始されました。6か月のリリースサイクルのため、Java 13には開発者特化の機能はあまりありません。
Java 13の特徴
日本語で以下の文章の言い換えをひとつ提供します:
Java 13の重要な機能の一部は以下のとおりです。
- Text Blocks – JEP 355
- New Methods in String Class for Text Blocks
- Switch Expressions Enhancements – JEP 354
- Reimplement the Legacy Socket API – JEP 353
- Dynamic CDS Archive – JEP 350
- ZGC: Uncommit Unused Memory – JEP 351
- FileSystems.newFileSystem() Method
- Support for Unicode 12.1
- DOM and SAX Factories with Namespace Support
プレビュー機能の有効化方法を教えてください。
スイッチ式とテキストブロックはプレビュー機能です。したがって、プロジェクトのプレビュー機能設定を有効にする必要があります。コマンドラインからJavaプログラムを実行している場合は、–enable-previewスイッチを使用して有効にすることができます。プレビュー機能を有効にしたままJShellを起動するためにも、このスイッチを使用できます。
$ jshell --enable-preview
$ java --enable-preview --source 13 Test.java
もしEclipse IDEを使用している場合は、プロジェクトのJavaコンパイラ設定からプレビュー機能を有効にすることができます。
1. テキストブロック – JEP 355
これはプレビュー機能です。これにより、複数行の文字列を簡単に作成することができます。複数行の文字列は、三重のダブルクォーテーションで囲まれた中に書かれなければなりません。テキストブロックを使用して作成された文字列オブジェクトには、追加のプロパティはありません。これは、複数行の文字列を簡単に作成するためのより簡単な方法です。テキストブロックを使用して単一行の文字列を作成することはできません。始めの三重のダブルクォーテーションの後には、行終了子が続かなければなりません。
package com.scdev.java13.examples;
public class TextBlockString {
/**
* JEP 355: Preview Feature
*/
@SuppressWarnings("preview")
public static void main(String[] args) {
String textBlock = """
Hi
Hello
Yes""";
String str = "Hi\nHello\nYes";
System.out.println("Text Block String:\n" + textBlock);
System.out.println("Normal String Literal:\n" + str);
System.out.println("Text Block and String Literal equals() Comparison: " + (textBlock.equals(str)));
System.out.println("Text Block and String Literal == Comparison: " + (textBlock == str));
}
}
出力:
Text Block String:
Hi
Hello
Yes
Normal String Literal:
Hi
Hello
Yes
Text Block and String Literal equals() Comparison: true
Text Block and String Literal == Comparison: true
私たちのJavaプログラムで簡単にHTMLやJSON文字列を作成するのに役立ちます。
String textBlockHTML = """
<html>
<head>
<link href='/css/style.css' rel='stylesheet' />
</head>
<body>
<h1>Hello World</h1>
</body>
</html>""";
String textBlockJSON = """
{
"name":"Pankaj",
"website":"JournalDev"
}""";
2. テキストブロックに対するStringクラスの新しいメソッド
文字列クラスには、テキストブロック機能に関連する新しいメソッドが3つあります。
-
- formatted(Object… args): String format()メソッドに似ています。テキストブロックのフォーマットに対応するために追加されました。
-
- stripIndent(): テキストブロック内の各行の先頭と末尾の不要な空白文字を削除するために使用されます。このメソッドはテキストブロックによって使用され、コンテンツの相対的なインデントを保持します。
- translateEscapes(): エスケープシーケンスを文字列リテラルであるかのように変換した文字列を返します。
package com.scdev.java13.examples;
public class StringNewMethods {
/***
* New methods are to be used with Text Block Strings
* @param args
*/
@SuppressWarnings("preview")
public static void main(String[] args) {
String output = """
Name: %s
Phone: %d
Salary: $%.2f
""".formatted("Pankaj", 123456789, 2000.5555);
System.out.println(output);
String htmlTextBlock = "<html> \n"+
"\t<body>\t\t \n"+
"\t\t<p>Hello</p> \t \n"+
"\t</body> \n"+
"</html>";
System.out.println(htmlTextBlock.replace(" ", "*"));
System.out.println(htmlTextBlock.stripIndent().replace(" ", "*"));
String str1 = "Hi\t\nHello' \" /u0022 Pankaj\r";
System.out.println(str1);
System.out.println(str1.translateEscapes());
}
}
結果:
Name: Pankaj
Phone: 123456789
Salary: $2000.56
<html>***
<body> *
<p>Hello</p>** *
</body>*
</html>
<html>
<body>
<p>Hello</p>
</body>
</html>
Hi
Hello' " /u0022 Pankaj
Hi
Hello' " /u0022 Pankaj
3. スイッチ式の強化 – JEP 354
Java 12のリリースでは、プレビューフィーチャーとしてスイッチ式が追加されました。Java 13ではほとんど同じですが、「break」が「yield」に置き換えられ、ケース文から値を返すようになりました。
package com.scdev.java13.examples;
/**
* JEP 354: Switch Expressions
* https://openjdk.java.net/jeps/354
* @author scdev
*
*/
public class SwitchEnhancements {
@SuppressWarnings("preview")
public static void main(String[] args) {
int choice = 2;
switch (choice) {
case 1:
System.out.println(choice);
break;
case 2:
System.out.println(choice);
break;
case 3:
System.out.println(choice);
break;
default:
System.out.println("integer is greater than 3");
}
// from java 13 onwards - multi-label case statements
switch (choice) {
case 1, 2, 3:
System.out.println(choice);
break;
default:
System.out.println("integer is greater than 3");
}
// switch expressions, use yield to return, in Java 12 it was break
int x = switch (choice) {
case 1, 2, 3:
yield choice;
default:
yield -1;
};
System.out.println("x = " + x);
}
enum Day {
SUN, MON, TUE
};
@SuppressWarnings("preview")
public String getDay(Day d) {
String day = switch (d) {
case SUN -> "Sunday";
case MON -> "Monday";
case TUE -> "Tuesday";
};
return day;
}
}
4. 伝統的なソケットAPIを再実装する- JEP 353
java.net.Socketおよびjava.net.ServerSocketの下部実装は書き換えられました。新しい実装であるNioSocketImplは、PlainSocketImplの代替として使用できます。この実装では、同期化されたメソッドではなく、java.util.concurrentのロックを使用します。もしレガシーな実装を使用したい場合は、javaオプション-Djdk.net.usePlainSocketImplを使用してください。
5. ダイナミックCDSアーカイブ – JEP 350
このJEPは、Java 10で導入されたクラスデータ共有機能を拡張しています。これにより、CDSアーカイブの作成と使用がより容易になりました。
$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar
$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar
6. ZGC: 使用されていないメモリのコミット解除 – JEP 351
このJEPは、ZGCを改良して未使用のヒープメモリをオペレーティングシステムに返すようにしました。Zガベージコレクタは、Java 11で導入されました。ヒープメモリのクリーンアップ前にわずかな一時停止時間を追加します。しかし、未使用のメモリはオペレーティングシステムに返されていませんでした。これは、IoTやマイクロチップなどのメモリのフットプリントが小さいデバイスにとって問題でした。しかし、これによって未使用のメモリをオペレーティングシステムに返すように改良されました。
7. FileSystems.newFileSystem() メソッド
ファイルシステムの提供者をより簡単に利用するために、FileSystemsクラスには3つの新しいメソッドが追加されました。これにより、ファイルの内容をファイルシステムとして扱うことができます。
-
- Pathを使用して新しいファイルシステムを作成する
-
- PathとMap<String, ?>を使用して新しいファイルシステムを作成する
- PathとMap<String, ?>、ClassLoaderを使用して新しいファイルシステムを作成する
8. 名前空間のサポートを備えたDOMとSAXファクトリ
DOMとSAXのファクトリをネームスペースのサポートを持つようにインスタンス化するための新しい方法があります。
-
- 新しいデフォルトNSインスタンスを作成する()
-
- 新しいNSインスタンスを作成する()
- 指定したファクトリクラス名とクラスローダーを使用して新しいNSインスタンスを作成する()
//java 13 onwards
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder();
// before java 13
DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
結論
6か月ごとのJavaのリリースはうまく機能しているようです。開発者向けの特徴はあまりありませんが、全体的に素晴らしいリリースです。待ちに待ったテキストブロックの文字列サポートが実装されたのを見るのは良いことです。
参考文献
- JDK 13 Release Notes
- OpenJDK 13 Download Page
- Text Blocks Examples
- Eclipse.org Java 13 Examples