JavaRush /Java Blog /Random-JA /Java 13: 新機能

Java 13: 新機能

Random-JA グループに公開済み
新しい JDK リリースが 6 か月ごとにリリースされるという事実には、私たちはすでに慣れています。これまでのところ、このアプローチは正当化されており、更新に追いつけなくなるのではないかという一部の開発者の懸念は杞憂に終わりました。半年ごとの変更はほとんどなく、以前ほどグローバルではありません。まあ、初心者プログラマーはこの革新性にまったく気付かないかもしれません。 Java 13: 新機能 - 1ただし、将来のソフトウェア開発者にとっては、イノベーションの最新情報を常に把握しておいたほうがよいでしょう。この記事では、従来通り、Accepted Extension Proposal (JEP) について説明します。Java 13 には、5 つの JEP と 76 の新しいコア ライブラリ要素のみが含まれています (そのうちのほぼ半分は java.io パッケージへの単純な追加です)。

JEP 355 : テキスト ブロック(プレビュー)

まずは言語の構文を変更することから始めましょう。その中で最も重要なものはテキスト ブロックです。これらにより、文字のエスケープを回避し、文字列をフォーマットする方法を知ることができます。JDK 12 には、文字列リテラルを操作するために期待されていた Raw String Literals (JEP 326) 機能が含まれていなかったことを覚えているかもしれません。Java 13 では、テキスト ブロックを持つ JEP 355 に置き換えられました。Java では文字列が二重引用符で囲まれていることを覚えているでしょう。これは良いことですが、問題は、1 行がソース ファイルの複数の行を占有することができないことです (Java 行との混同を避けるため、ここではファイル行を「行」と呼びます)。さて、話を戻して、たとえば、\n区切りが必要な場合は記号を使用したり、複数行の式を連結したりしてみましょう。なかなかうまくいきませんね!HTML、XML、SQL、または JSON フラグメントが埋め込まれたテキスト リテラルは特に面倒です。このようなエスケープ、連結、手動編集により、コードの作成が不便になり、読みにくくなります。テキスト ブロックはこの問題を解決しようとします。これらは、えー... 三重の二重引用符で始まり、それらで終わります (あまり良く聞こえませんが、わかります)。引用符の間にあるものはすべて、改行を含めて行の一部として解釈されます。テキスト ブロックは標準のテキスト リテラルとまったく同じように使用でき、Java は同じ方法でコードをコンパイルします。開始引用符の後には行区切り文字を続ける必要があります。テキスト ブロックは 1 行で使用できないため、コードは
String smallBlock = """Only one line""";
次のエラーが発生します。
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                          ^
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                                   	^
単純な HTML フラグメントは次のように記述できます。
String htmlBlock = """
               	<html>
                 	<body>
                   	<p>CodeGym Web page</p>
                 	</body>
               	<html>
         	     """;
テキスト ブロックを使用するときに注意したほうがよいいくつかの微妙な点について触れてみましょう。終了引用符の配置が重要であることがわかりました。それによって、時折現れる空白がどのように処理されるかが決まります。上の例では、終わりの引用符が HTML テキストのインデントに合わせて配置されています。この場合、コンパイラはインデント スペースを削除し、その結果、次のような行が得られます。
<html>
  <body>
    <p>My web page</p>
  </body>
</html>
注記:このような行には行末に改行が含まれます。必要がない場合は、</html> タグの直後に閉じ引用符「"」を配置できます。閉じ引用符を左マージンに近づけると、削除されるインデントの量が変わります。これらを 2 スペース左に移動すると、各行にインデント用の 2 スペースが追加されます。左端に移動すると、すべてのパディングが保持されます。引用符をさらに右に移動しても効果はなく、インデントは追加されません。テキスト ブロックは、プレビュー機能として JDK 13 に含まれていました。これは、それらが対応する Java 言語仕様にまだ含まれていないことを意味します。つまり、この機能が言語の永続的な部分になるのか、それとも単なるゲストなのかは不明です。現在、開発者はこの機能をテストし、それについて意見を述べることができます。テキスト ブロックの運命はそれにかかっています。機能は改善できますし、気に入らない場合は完全に削除することもできます。テキスト ブロックを実際に試したい場合は、コンパイルして実行するためにプレビュー機能を明示的に含める必要があることに注意してください。編集:

javac --enable-preview --release 13 TextBlock.java
アプリケーションを実行するには、プレビュー機能を有効にする必要があります。

java --enable-preview TextBlock
このクラスには、Stringこの言語変更を補完する 3 つの新しいメソッドがあります。
  • formatted(): 文字列自体をフォーマット文字列として使用して文字列をフォーマットします。チャレンジに相当format(this, args)
  • stripIndent(): 文字列からランダムなスペースを削除します。これは、複数行の文字列を読んでいて、明示的な宣言の場合と同じ空白の除外を適用したい場合に便利です。
  • translateEscapes(): エスケープ シーケンス ( など\ r) を含む文字列を、適切な Unicode 値に変換して返します。
これらのメソッドは登場したばかりで、すでに非推奨としてマークされているのは興味深いことです。この状況は、これらのメソッドが JDK の将来のバージョンで削除される可能性があることを示唆しています。新しい方法を追加してすぐに放棄するのは、少し奇抜なように思えます。ただし、これらのメソッドは、変更または削除できるプレビュー機能に関連付けられていることに注意してください。おそらく、アノテーションを導入すると@PreviewFeatureそのような状況に役立つでしょうが、それはまだ JDK には含まれていません (ただし、高い確率で JDK 14 に登場する予定です)。

JEP 354 : スイッチ式 (プレビュー)

Java 12 では、switch ステートメントを使用した新しい形式の式の記述に関する提案 ( JEP 325)が導入されました。これはまさに最初のプレビュー機能であることが判明し、その運命はユーザーに提案を送信することが素晴らしいアイデアであることを証明しています。JDK 12 より前は、switchアクションを実行するが結果を返さないステートメントとしてのみ使用できました。switchしかし、Java 12 では、変数に代入できる結果を返す式として使用できるようになりました。内の case ステートメントの構文には他にも変更がありましたswitch。これがどのように機能するかを理解するために、JEP の例を見てみましょう。
int numberOfLetters;
switch(dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
    numberOfLetter = 6;
    break;
  case TUESDAY
    numberOfLetter = 7;
    break;
  case THURSDAY
  case SATURDAY
    numberOfLetter = 8;
    break;
  case WEDNESDAY
    numberOfLetter = 9;
    break;
  default:
   throw new IllegalStateException("Huh?: " + day);
}
この例では、 value を使用してdayOfWeekに値を割り当てますnumberOfLetters。オペレーターの作業の特殊性によりswitch、このコードはそれほど美しいものではなく、間違いを犯しやすいです。まず、ケース ラベルの各グループにステートメントを適用するのを忘れた場合break、デフォルトでケース ラベルの次のグループが適用されます。これにより、発見が困難なエラーが発生する可能性があります。次に、ケースラベルの各グループを定義する必要があります。忘れると、もちろんコンパイラ エラーが発生しますが、このオプションは理想的ではありません。dayOfWeek各値に独自の case ラベルが必要なため、コードも非常に冗長になります。新しい構文を使用すると、よりクリーンでエラーが発生しにくいコードが得られます。
int numberOfLetters = switch (dayOfWeek) {
   case MONDAY, FRIDAY, SUNDAY -> 6;
   case TUESDAY -> 7;
   case THURSDAY, SATURDAY -> 8;
   case WEDNESDAY -> 9;
   default -> throw new IllegalStateException("Huh?: " + day);
};
これで、(式の戻り値から) 割り当てを 1 回行うだけで済みswitch、ケース ラベルにカンマ区切りのリストを使用できるようになりました。また、演算子を使用しないためbreak、演算子に関連する問題がなくなりました。式の構文ではswitch古いスタイルの構文を使用できるため、JDK 12 では次のように記述できます。
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   break 6;
  case TUESDAY
   break 7;
  case THURSDAY
  case SATURDAY
   break 8;
  case WEDNESDAY
   break 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Java コミュニティによると、オーバーロードを使用してbreak戻り値を指定すると混乱を招く可能性があるとのことです。Java 言語では、無条件ジャンプ演算子のようなラベルとともにbreak(and ) を使用することもできます。JEP 354 ではこの使用法が変更されたため、Java 13 ではコードが若干変更されています。 continuegotobreak
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   yield 6;
  case TUESDAY
   yield 7;
  case THURSDAY
  case SATURDAY
   yield 8;
  case WEDNESDAY
   yield 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
次の 3 つの JEP は Java 仮想マシンに関連付けられています。

JEP 350ダイナミック CDS アーカイブ

この拡張機能を使用すると、Java アプリケーションの実行終了時にクラスを動的にアーカイブできます。class data sharingCDS またはクラス データ共有を使用すると、デフォルトでこれらの同じクラスのリストを使用して、起動時に起動されるすべてのクラスを特別なアーカイブにパックできます。これにより、アプリケーションの起動が大幅に高速化され、RAM が節約されます。以前は、AppCDS の使用は、関連するクラスのリストを作成し、そのリストを使用して後続の実行に使用されるアーカイブを作成するという複数のステップから成るプロセスでした。必要なのは、ArchiveClassesAtExitアーカイブが書き込まれる場所を示す -XX: フラグを指定してアプリケーションを 1 回起動することだけです。このアプローチでは、アプリケーションが通常に停止された後、クラスは自動的にアーカイブにパッケージ化されます。

JEP 351 ZGC : 未使用メモリのコミットを解除する

1 年前、JDK 11では、実験的でスケーラブルな低レイテンシのガベージ コレクターである ZGC が導入されました。当初、ZGC はかなり奇妙な動作をしていました。メモリが不要になった場合でも、メモリをオペレーティング システムに戻すことはできませんでした。コンテナなどの一部の環境では、リソースが複数のサービスによって同時に使用されるため、システムのスケーラビリティと効率が制限される可能性があります。ZGC ヒープは、いわゆる ZPages で構成されます。ZPage がガベージ コレクション サイクル中にクリアされると、ZPageCache に返されます。このキャッシュ内の ZPage は、最近使用された順に並べられます。Java 13 では、ZGC は長期間使用されていないと識別されたページをオペレーティング システムに返します。こうすることで、他のプロセスで再利用できます。

JEP 353従来のソケット API を再実装する

どちらの API 実装もJDK 1.0 のままjava.net.Socketです。java.net.ServerSocketこの JDK および後続のすべての JDK では、これらの API の実装にいくつかの手法 (スレッド スタックを I/O バッファとして使用するなど) が使用されているため、柔軟性が低く、保守が困難です。この問題を解決するために、JDK 13 では新しい実装が提供されましたNioSocketImpl。ネイティブ コードが不要になったので、さまざまなプラットフォームへの移植が容易になりました。このクラスは、既存のバッファ キャッシュ メカニズム (この目的でのスレッド スタックの使用を回避) と、java.util.concurrent同期メソッドではなくロックも使用します。これにより、 Project Loomのファイバーとの統合が簡素化されます。

新しい API

Java 13 には基本クラス ライブラリに 76 の新しい API が含まれていることを前述しました。それらは次の領域をカバーします。
  • Unicode サポートの更新。
  • Stringテキスト ブロックをサポートする3 つの新しいメソッド(上記の JEP 255 の説明を参照)。
  • クラスjava.nioには (相対ではなく) 絶対get メソッドを設定します。これらには、基本抽象クラスと同様に、バッファーの一部を取得する Bufferメソッドが含まれています。 slice()
  • force()クラスメソッドは、MappedByteBufferバッファ セクションをバッキング ストレージに強制的に書き込みます。
  • nio.FileSystemnewFileSystem()ファイル システムとしてファイルの内容にアクセスするための3 つの新しいオーバーロードされたフォームが追加されます。
  • 新しい興味深い手法が登場しましjavax.annotation.processing.ProcessingEnvironmentた。isPreviewEnabled()。プレビュー機能が有効になっているかどうかがわかります。上記のアノテーションは@PreviewFeatureJDK 14 がリリースされるまで利用できないため、これは興味深いことです。
  • DocumentBuilderFactory名前空間対応インスタンスを作成するための 3 つの新しいメソッドSAXParserFactoryを入手します。javax.xml.parsers
この資料は、 Simon Ritterによる記事と公式ドキュメントに基づいています。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION