X

A blog about Oracle Technology Network Japan

JDK最優秀機能トーナメント

Guest Author

※本記事は、Sharat Chanderによる”The Best of the JDK Face-Off“を翻訳したものです。


Javaは25年の間に発展を遂げ、言語、ライブラリ、ツール、ランタイムに多くのイノベーションを巻き起こしてきたが、その中で、もっとも重要なものは何だろうか

著者:Sharat Chander
2020年5月18日

Javaは誕生25周年を迎えます。1995年5月23日にJavaの最初のリリースが配信されてから、もう四半世紀がたっています。とてもそうとは思えないという方もいらっしゃるのではないでしょうか。

当初、この言語(と言語の背後にある概念)は興奮の渦の中心にありました。最初はOakという名前が検討され、後にGreenとなり、最終的にJavaという名前が採用されました。しかし、Javaが現在の地位を築いたのは、すばらしい才能を持ったエンジニア集団がシンプルで一致したビジョンを持っていたからです。それこそ、世界はハードウェア・ファーストからソフトウェア・ファースト+ネットワーク配信というパラダイム変革の途上にあるという認識です。新しいリリースのたびに使いやすさ、信頼性、セキュリティ、プラットフォームの独立性が向上するプログラミング言語と開発プラットフォームが生まれたのは、その変革があったからこそです。

しかし、Javaのイノベーションを進めたのは、エンジニアリングの非常に高度な専門知識ばかりではありません。この草創期に、進化し続けるテクノロジー・ランドスケープの需要を満たすため、Javaの設計に絶え間なく貢献したのは、ユーザーでした。そのスローガンは、「開発者にフォーカスしよう」でした。現在の開発の世界では当然のように思えますが、1990年代当時、開発者ファーストは一般的ではありませんでした。

現在、Javaのテクノロジーとエコシステムでは、慎重さとフォーカスを2つの均等な足場として継続的にイノベーションを推進するという、他にはない共生関係を実現しています。その結果、とどまることのない生産性が皆さんのような開発者に提供されています。

Javaコミュニティはこの重要なJavaのマイルストーンを祝っています。そこで、JavaチームとJava Magazineでは、ちょっとした息抜きを兼ねて皆さんにご参加いただく、JDK最優秀機能トーナメントを企画しました。

ご存じのように、Javaには記憶に残る重要なイノベーションを実現してきた豊かな歴史があります。Java 8では、開発者の生産性が驚くほど向上しました。その後も、Java 9から現在のJava 14リリースに至るまで、すばらしいイノベーションが蓄積されています。しかし、もっとも重要な進化とはいったい何でしょうか。それが本日の問いかけです。

Javaチームでは、ここ数年間で特に話題に上がることが多かった機能の一覧を作成しました(小さな機能も大きな機能も含みます)。皆さんには、ぜひお気に入りの機能に投票していただきたいと思います。

これを軽々しく考えないでください。実際にどの機能に興奮し、どの機能によって生産性が向上し、Javaプログラミングの専門知識をさらに得たのかについて、自己分析してじっくりと考えてみてください。

これからの数週間、JavaチームのTwitterアカウント(@Java)で、重要な機能を以下の4つの部門に分けてトーナメントを行います。

  • 言語
  • ライブラリ
  • ツール
  • ランタイム

投稿される各対決では、24時間、Twitterからの投票を受け付けます。毎日新しい対決が行われ、最終的には決勝に進んだ2つが対決します。このトーナメントは、これからの数週間にわたって@Javaでソーシャルに行われ、勝者となる1つの機能が選ばれます。

開始にあたり、図1にトーナメント表を示します。見てわかるように、楽な対決はありません。

The JDK Face-Off bracket board

図1:JDK対決トーナメント表 | 大きな画像を表示

このトーナメント表を見るとき、以下の問いについてよく考えてください。
    

  • いずれの機能を選ぶか
  • 自分にとっていずれの機能が重要か
  • いずれの機能がさらなる学習につながったか
  • どのようにして投票先を決めるべきか

準備はよいでしょうか。それでは、全員の認識が一致するように、4つの部門について詳しく確認します。見慣れない機能がある方のために(一部はJava 14の新機能です)、最新情報を確認できるお勧めのリソースも示します。

 

言語部門

  • デフォルト・メソッド:デフォルト・メソッドは、インタフェースでdefault修飾子を使って宣言するメソッドです。このメソッドの本体は、対象のインタフェースを実装しており、かつ対象のメソッドをオーバーライドしていないすべてのクラスにおいてデフォルトの実装になります。これにより、既存の(すでに広く使われているものである可能性もあります)インタフェースに新機能を追加できるようになります。さらに汎用的な使い方として、この機能は動作の多重継承をサポートするメカニズムにもなります。
  • instanceofのパターン・マッチング:パターン・マッチングとは、プログラムの共通ロジックを簡潔かつ安全に表現できるようにする方法です。具体的には、条件に応じてオブジェクトからコンポーネントを抽出します。これは、JDK 14のプレビュー言語機能です。詳しくはこちらをご覧ください
  • テキスト・ブロック:テキスト・ブロックは、ほとんどのエスケープ・シーケンスを省略できる複数行文字列リテラルです。文字列を予測可能な方法で自動的に書式設定するだけでなく、開発者がその書式設定を制御することもできます。
  • Javaの型アノテーション:JEP 104によって、Javaプログラミング言語の構文で、型の宣言だけでなく、型の使用でもアノテーションを記述できるようになっています。
  • ローカル変数の型推論(var):JEP 286でJava言語が拡張され、宣言時に初期化されるローカル変数の型推論が行われるようになっています。
  • レコード:JEP 359で定義されるレコードにより、コンパクトな構文で浅い不変データを格納する透過的なクラスを宣言できます。これは、JDK 14のプレビュー言語機能です。
  • switch式:JEP 361によってswitchが拡張され、文または式として使用できるようになっています。どちらの形式でも、従来型のcase ... :ラベル(フォールスルーあり)または新しいcase ... ->ラベル(フォールスルーなし)を使用できます。さらに、switch式から値を生成する新しい文も使用できます。以上の変更により、毎日のコーディングが簡略化され、switchでパターン・マッチングを利用する準備が進むことになります。
  • メソッド参照:メソッド参照は、ラムダ式を使って匿名メソッドを作成する方法です。しかし、ラムダ式の中には、既存のメソッドを呼び出す以外に何もしないものもあります。そのような場合は一般的に、既存のメソッドを名前で参照する方がシンプルです。メソッド参照を使うことで、これが可能になります。メソッド参照は、すでに名前を持つメソッドに対応する、コンパクトで読みやすいラムダ式です。

 

ライブラリ部門

  • 複数解像度イメージ:JEP 251では、複数解像度イメージAPIを定義しています。これにより、解像度が異なるイメージの操作や表示が容易にできるようになります。
  • JVM定数:JEP 334では、重要なクラスファイルとランタイム・アーティファクト、とりわけ定数プールからロードできる定数の、名前による説明をモデリングするAPIを導入しています。
  • 不揮発性バイト・バッファ:JEP 352では、JDK固有のファイル・マッピング・モードを新しく追加しています。これにより、FileChannel APIを使って不揮発性メモリを参照するMappedByteBufferインスタンスを作成できるようになっています。
  • HTTP/2クライアント:JEP 110では、HTTP/2とWebSocketを実装し、従来のHttpURLConnection APIを置き換えることができる新しいHTTPクライアントAPIを定義しています。
  • Stack-walking API:JEP 259では、スタックを横断するための効率的な標準APIを定義しています。このAPIにより、スタック・トレース内の情報のフィルタリングや遅延アクセスが容易に可能となっています。
  • TLS 1.3:JEP 332では、Transport Layer Security(TLS)プロトコルのバージョン1.3を実装しています。
  • 便利なファクトリ・メソッド:JEP 269では、少数の要素を持つコレクションやマップのインスタンス作成を便利にするライブラリAPIを定義しています。このAPIにより、Javaプログラミング言語にはコレクション・リテラルを記述する方法がないという欠点が緩和されます。
  • 非推奨の強化:JEP 277では、@Deprecatedアノテーションを刷新するとともに、APIライフサイクルを強化するツールを提供しています。

 

ツール部門

  • JDK Mission Control:JDK Mission Control(JMC)は、OpenJDKおよびOracle JDK用のツール・スイートで、本番環境でのプロファイリングや診断に特化しています。
  • jlink:一連のモジュールとその依存性をアセンブルして最適化し、カスタム・ランタイム・イメージを作成できるツールがJEP 282によって誕生しています。
  • jpackage:JEP 343により、自己完結型Javaアプリケーションのパッケージングを行うツールが誕生しています。
  • jdeprscan:この静的解析ツールでは、JARファイル(などのクラス・ファイルの集合体)をスキャンし、使用されている非推奨のAPI要素を検出します。
  • 単一ソース・コード・ファイルによるプログラムのランチャ:JEP 330によってjavaランチャが拡張され、1つのJavaソース・コード・ファイルで提供されるプログラムを実行できるようになっています。たとえば、「シェバン」ファイルによるスクリプトや、それに関連する手法から使用できます。
  • Javadoc検索:JEP 225により、検索ボックスが追加され、標準のドックレットで生成されたAPIドキュメントのページすべてのヘッダーに表示されるようになっています。この検索ボックスを使用して、ドキュメント内のプログラム要素や、タグが付いた単語および語句を検索することができます。
  • jshell:JEP 222では、Javaプログラミング言語の宣言、文、式を評価するインタラクティブなツールを提供しています。さらに、他のアプリケーションでこの機能を活用できるようにするAPIも提供しています。
  • マルチリリースJARファイル:JEP 238でJARファイルの形式が拡張され、1つのアーカイブにおいてJavaの複数のリリースに固有なバージョンのクラス・ファイルを共存させることができるようになっています。

 

ランタイム部門

  • アプリケーション・クラスデータ共有:起動時間の短縮とフットプリント・サイズの削減を目的として、JEP 310で既存のクラスデータ共有機能が拡張されています。この拡張により、共有アーカイブにアプリケーション・クラスを配置できるようになっています。
  • 文字列の圧縮:JEP 254で、これまでよりスペース効率のよい、文字列の内部表現が採用されています。
  • ZGC:Zガベージ・コレクタ(ZGC)は、スケーラブルで待機時間の短いガベージ・コレクタです。停止時間を10ミリ秒未満にする、ヒープやライブセットのサイズが増加しても停止時間が増加しない、サイズが8 MBから16 TBのヒープを扱う、という目標を満たすように設計されています。
  • Graal JIT:JEP 317により、Linux/x64プラットフォームでJavaベースのJITコンパイラであるGraalが試験運用版JITコンパイラとして使用できるようになっています。
  • モジュール式JDK:JSR 376で仕様が規定され、JEP 261で実装されているJavaプラットフォーム・モジュール・システムを使用し、JDKをモジュール化します。詳しくは、JEP 200をご覧ください。
  • スレッドローカルなハンドシェイク:JEP 312により、グローバルVMセーフポイントを実行せずにスレッド上でコールバックを実行する方法が導入されています。この方法により、すべてのスレッドを一律に扱うだけでなく、個々のスレッドを安価に停止できるようになっています。
  • JDK Flight Recorder:JEP 328では、JavaアプリケーションやHotSpot JVMのトラブルシューティングを目的とした、低オーバーヘッドのデータ収集フレームワークを提供しています。
  • 便利なNullPointerException:JEP 358により、JVMで生成されるNullPointerExceptionの使い勝手が向上し、どの変数がnullだったのかまで詳しくわかるようになっています。

 

まとめ

ぜひ、じっくり考えてみてください。Twitterの投票を行うときは、スレッドになぜそのように投票したのかを説明するコメントを投稿してください。さらに、その対決についての意見も記載してください。ハッシュタグ#MovedByJavaを使えば、コミュニティのより多くの皆さんが会話に参加できます。

なお、このトーナメントは、合意に基づいて行うわけではありません。すべての方に、意見の違いを聞き、理解し、受け入れてもらいたいと思っています。活発な議論を行うのは健全なことですが、常に礼儀正しく、専門家らしく、偏見を排除して誠実であるよう心がけてください。それこそが、Javaエコシステムの精神です。

ハッピー・バースデー、Java。最後にもう1つ。2020年5月20日(火)午前9時(太平洋標準時)から、この節目を祝うパネル・ディスカッションが行われます。どうぞご参加ください。


Sharat Chander

Bell Atlantic、Verizon、Sun Microsystems、Oracleなどの企業で、20年間IT業界に従事。Java開発ツール、グラフィック・デザイン、プロダクト/コミュニティ管理に関する経験や技術専門性を有する。15年にわたってJavaコミュニティに積極的に関与しており、Javaの認知度向上、受容促進、採用促進、支持拡大の活動を行っている。OracleのJava開発者リレーション部門のディレクターとして、7年にわたってJavaOneカンファレンスのコンテンツ・チェアパーソンを務め、カンファレンスの技術コンテンツ戦略や、カンファレンスへのJavaコミュニティの参加を担当。世界中の開発者プログラムに数多く参加し、基調講演も頻繁に行っている。米国メリーランド大学で企業金融の学士号を、ロヨラ大学メリーランドで国際ビジネスのMBAを取得。世界のさまざまな開発者イベントやJavaコミュニティの会合にも登場する。Javaの啓発にあたっていないときは、故郷のボルチモア・オリオールズの熱狂的なファンとして野球にも情熱を注いでいる。
Twitterハンドル:@Sharat_Chander

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.