「Java 10後の生活」:Java 11がもたらす変化

つい最近、3月末にJava 10 がリリースされました 、Oracle リリースサイクル(6か月ごとの新しいリリース)に変更加えたため、11番目のバージョンはリリースの準備中です。



打ち上げは2018年9月に予定されています。 現在知られている今後の更新の一部をご覧ください。





/写真Markus Spiske PD



Java 10:簡単な要約



第10バージョンのイノベーションは、 var 使用したローカル型推論 、ガベージコレクションプロセスの改善、およびメインJITコンパイラとしてGraal 使用する機能です。



varを使用したローカル型推論は、多くの開発者から要求されました。 これで、変数を宣言するために最初に、次に続くコンストラクターのために、連続して型を2回入力することはできません。



var list = new ArrayList<String>(); // infers ArrayList<String> var stream = list.stream(); // infers Stream<String>
      
      





ただし、varを導入する決定は、コミュニティのメンバーからさまざまなレビューを受けました 。 誰かがイノベーションを求めて発言し、重複排除がコードの可読性を改善すると述べました。 しかし、多くの種類の変数(たとえば、接続)が明らかにならないことに注意する人がいました。 IDEはそれらをオンデマンドで表示できるようになりましたが、他の環境では問題が発生します。



ガベージコレクションを改善するために、10回目のリリースにはJEP 304JEP 307の 2つの変更がすぐに含まれました。 JEP 304は、新しいGCインターフェースにより、さまざまなガベージコレクターからのコードの分離を改善し、サードパーティコレクターのより高速な統合を可能にしました。 JEP 307では、複数のスレッドで「ガベージコレクション」も可能になりました。



新しいJITコンパイラについては、JVMのパフォーマンスを向上させることを目的としています。 JVMの以前のバージョンはC ++で記述されていましたが、 Metropolis プロジェクトの一部として、JVMのほとんどはJavaで書き直されます。 実験的なコンパイラは、この目標に向けた最初のステップです。





/写真Betsy Weber CC



Java 11で可能な革新



開発者は初秋にJava 11を導入する予定です。そして、今日のリリースに含まれる可能性のある多くの機能について既に知っています。 ネットワークには、提案された変更についての激しい議論もあります。



一部の開発者は、言語の変化の速さに不満を抱いています。 Hacker Newsのある住人は次のように述べています。「Javaはまったく新しい言語に変わりつつあります。 以前にJavaを使用した理由の1つは、下位互換性です。 6か月ごとに新しいプログラミング言語を学習する必要がある場合は、別のことを学習します。」



しかし、Javaには最終的にJavaに欠けていた機能が追加されており、他の言語で長い間実装されていることに注意する人がいます。 別のHNユーザーは次のように書いています。「2000年代の初めからJavaを使用していません。他の言語に長い間存在していた機能を導入してきたことに驚いています。」 ここにそれらのいくつかがあります。



ローカル型推論の変更


Java 10は、ローカル変数のタイプを示すためにvarを使用する機能を既に提供しており、このタスクをコンパイラーに移行しています。 ただし、Java 11はさらに進んで、暗黙的に型指定されたラムダ式の仮パラメーターを宣言するときにvarを使用できるようにします。



varをいつどのように使用するかの詳細なガイドについては、このOpenJDKの記事を参照してください



生の文字列リテラルの追加


これは、現在作業中の別の追加です。 生の行では、各文字はブレーク文字を含めて「そのまま」読み取られます。 たとえば、このような文字列はHTMLマークアップまたはSQLクエリです。



 String html = "<html>\n" + " <body>\n" + " <p>Hello World.</p>\n" + " </body>\n" + "</html>\n";
      
      





文字列リテラルを使用すると、このコードは次のように記述できます。



 String html = `<html> <body> <p>Hello World.</p> </body> </html> `;
      
      





逆アポストロフィ( `)は、生の文字列を示すために使用されます。 行自体の内部にアポストロフィを登録する必要がある場合、この場合、二重(または三重、四重など)逆アポストロフィを使用して境界をマークします。



 String str = ```This is a raw `string` with ``backticks`` inside```;
      
      





スイッチ式が表示されます


スイッチの設計は次のとおりです。



 int val; switch (str) { case "foo": val = 1; break; case "bar": val = 2; break; case "baz": val = 3; break; default: val = -1; }
      
      





switch-expressionsの出現により、設計は縮小します。



 int val = switch (str) { case "foo": break 1; case "bar": break 2; case "baz": break 3; default: break -1; }
      
      





さらに、ケースでブレークのみが発生した場合、簡略表記を使用することができます。



 int val = switch (str) { case "foo" -> 1; case "bar" -> 2; case "baz" -> 3; default -> -1; }
      
      





スイッチ式の追加は、 パターンマッチング手法の出現に向けた一歩です。



上記に加えて、Javaは他の変更を受け取る場合があります。 たとえば、列挙型の値型または型変数のサポート。 これらの更新は必ずしもJava 11の一部ではありませんが、近い将来におそらく期待できます。






PS最初の企業IaaSブログでは、他に何を書いていますか:





PPSHabréのブログの資料:






All Articles