Java9とは?開発者に嬉しい9つの新機能を徹底解説!

2017年9月にリリースされたJava9は新しい機能が90個くらい追加されているそうです。

「Java9で何が変わったの?」「新機能はどのように使うの?」「どんなときに新機能を使うの?」

といった方に向けて、今回は初心者向けにJava9の新機能をわかりやすく解説します!


・Javaとは?Javaの特長
・Java9の新機能
・Java9の環境構築
・Java9の環境構築方法
・Java9の新機能

今回はJava9の新機能について、使い方をわかりやすく解説します!

Javaとは?Javaの特長

Java9の説明に入る前に、まずはJavaについて簡単におさらいしておきましょう。

Javaは1990年代にSun Microsystemsが開発・発表したオブジェクト指向という考え方を取り入れた言語です。

2010年にOracleが買収し、Oracle製品の1つになりました。

Javaは家電やモバイル機器を始めとして、多くのデバイスに搭載されています。

国内でもスマートフォンなどに搭載されていて、アプリ開発を行うにはJava言語を使って開発することになります。

2017年9月にリリースされたJava9では多くの新機能が追加されているので、その新機能について解説していきます。

これまでのJavaについては、こちらのサイトでも詳しく解説していますので、ぜひ参考にしてください。

Javaとは?言語の特徴や用途などを専門用語抜きで網羅的に解説
更新日 : 2019年8月21日

Java9の新機能一覧

Java9のリリース

Java9は2017年9月22日に正式リリースされました。

元々のリリース予定は2016年の6月でしたが、今回追加された「Project Jigsaw」でのモジュール化の開発が難航し、今回のリリースとなっています。

また、Oracle社の発表によると今後のJavaのアップデートは6ヶ月ごとに行う提案がされています。

これまでは数年ごとに大きな機能追加を行ってきましたが、この場合だと数年ごとにしか進化しないというデメリットがあるために、6ヶ月ごとの定期的アップデートを今後は行う予定のようです。

新機能一覧

それではJava9で追加された新機能について解説していきます。

新機能といっても全部で90個くらいあるようですが、ここではよく使われると思われる代表的な9つの新機能について簡単に解説します。

9つの新機能について簡単にまとめました。

 項目説明
1JShellコンパイルなしのスクリプトで実行することが可能に
2Project Jigsawモジュール化システム
Javaライブラリの複雑な依存関係、クラスパス設定が解消
3不変コレクションの生成ofメソッドで初期値付き不変コレクションの記述が簡潔に
4匿名クラスでのダイヤモンド演算子匿名クラスの総称型を省略して記述可能に
5Interface内のprivateメソッドInterface内でprivateメソッドを定義可能に
(Java8でdefaultメソッドとstaticメソッドは定義可能)
6try-with-resources文の改良try節内でのクラス宣言が不要に
7Stream APIでのメソッドの追加takeWhile、dropWhile、ofNullableの追加
8Optionalクラスでのメソッドの追加ifPresentOrElse、or、streamの追加
9Deprecatedアノテーションの強化forRemoval(削除されるか?)、since(いつから?)の追加

これらの他にも、JavaScriptエンジン「Nashorn」用APIの強化、Javadocの検索機能の追加などがあります。

それでは表にまとめた9つの新機能について解説していきます!

Java9の環境構築

Java9の新機能を確認する前にJava9での開発環境を構築しなければなりません。

ダウンロードとインストール

Java9はこちらからダウンロードできます。

http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html

OSを選択してダウンロードしましょう!

java9.01

インストールについては、Java8以前と大きく変わりません。

こちらのサイトで詳しく解説していますので、参考にしてください。

【Java初心者必見!】Javaの開発環境を構築する方法を解説!
更新日 : 2019年5月7日
【Mac編】Javaの開発環境を簡単に一括インストールする方法
更新日 : 2019年4月29日

アップデート

Java9にアップデートするためには現在パソコンにインストールされているJavaのバージョンがJava9かJava8以前か確認する必要があります。

ここでは、使うパソコンのOSはWindows10の場合を代表例として説明します。

Javaのバージョンを確認する方法は以下のとおりです。

Windows 10-プログラムの確認
1.「スタート」をクリックします。
2.「設定」を選択します
3.「システム」を選択します
4.「アプリと機能」を選択します
5.プログラムの一覧からJavaを探し出してバージョンを確認します

Java8check

この画像ではJava8がインストールされています。

Java8以前がインストールされている場合は、Javaをアンインストールする必要があります。

Javaをアンインストールできたら、前章のダウンロードの方法を参考にしてJava9をインストールしてください。

Windows 10-プログラムのアンインストール
1.「スタート」をクリックします。
2.「設定」を選択します
3.「システム」を選択します
4.「アプリと機能」を選択します
5.アンインストールするプログラムを選択し、「アンインストール」ボタンをクリックします。
6.プロンプトに従って、アンインストールを完了します

公式参考サイト
https://java.com/ja/download/faq/remove_olderversions.xml

32bit版がない?

Java9のダウンロードサイトには64bit版のみが並んでいて、32bit版は探しても見つかりません。

32bit版のOSには対応していませんので、注意しましょう!

公式サイトにも以下のコメントが掲載されています。

Dropped Windows 32–bit Client VM
https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-59701F80-5BB1-416D-835D-C39A9112FC1E

Eclipseでの注意点

こちらのサイトで解説しているPleiadesでJava9の開発環境も自動構築することができます。

最新の「Pleiades All in One」を選択するとJava9に対応しています。

【Java初心者必見!】Javaの開発環境を構築する方法を解説!
更新日 : 2019年5月7日

Pleiadesの環境が構築できたらJavaのプロジェクトを新規作成するときに「JavaSE-9」を選択してください。

これでJava9を使うことができます。

java903

なお、Eclipseで開発環境を構築する場合はNoClassDefFoundErrorというエラーが発生する場合があります。

Eclipse4.7.1a以降をインストールするようにしましょう。

詳細はこちらのサイトに記載されています。

https://wiki.eclipse.org/Configure_Eclipse_for_Java_9

JShellでスクリプト

Java9の大きな変更点の1つにJShellを使って、スクリプトでJavaを記述、動作確認できるようになりました。

JShellはJavaのREPLツールです。

REPLとは「Read-Eval-Print Loop」の略で、読んで字のごとく「読んで評価して出力を繰り返す」ということになります。

簡単に言うと、JShellを使うとコンパイルなしで対話型で動作確認しながら記述することができます。

それでは、JShellを使って”Hello Java9!”を出力表示してみましょう。

JShellはコマンドラインで「jshell」と入力し、実行すると使えるようになります。

java902

「jshell>」の後にJavaのコードを記述します。

最後に「;」(セミコロン)を記述する必要はありません

タブキーを押すと入力候補も表示されますので、入力するのも簡単です。

ちなみに、Rubyなどのスクリプト言語とコンパイル言語との違いについてはこちらで詳しく解説しています。

ぜひ参考にしてください。

専門知識いらず!スクリプト言語とは?言語の種類やオススメを解説
更新日 : 2019年4月27日

Jigsawでのモジュール化

Java9の大きな変更点の1つにモジュールシステムというものが導入されました。

モジュールとはJavaのパッケージをまとめたもので、他のモジュールをどのように使うか、また他のモジュールからどのように使われるかを制御します。

module-info.javaというソースファイルでモジュール間のアクセスを制御します。

使い方については下記のクイックスタートで紹介されていますので参考にしてください。

http://openjdk.java.net/projects/jigsaw/quick-start

不変コレクションの生成

ListやMapなどのコレクションで要素を初期化して値を変更されたくない場合があります。

Java8までは以下のサンプルコードのように数行に渡って記述する必要があり、とても面倒でした。

Java8までの記述方法:

実行結果:

これがJava9ではofメソッドを使うことで、簡潔に記述することができるようになりました。

Java9での記述方法:

実行結果:

ただし、要素の値を変更されたくない場合に使うものですので、以下のように変更しようとするとエラーが発生します。

注意しましょう!

実行結果:

ListやMapの使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【Java入門】ListインターフェースとArrayListクラスの使い方
更新日 : 2019年4月23日
【Java入門】Mapの使い方総まとめ(HashMapで初期化、値のソート)
更新日 : 2019年5月22日

匿名クラスでのダイヤモンド演算子

Java7からダイヤモンド演算子を使って、以下の記述のように右辺で型の指定を省略することができます。

Java9ではこれが強化されて、匿名クラスでも使えるようになりました。

ジェネリクス(総称型)については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【Java入門】ジェネリクス(Generics・総称型)の使い方
更新日 : 2019年4月2日

匿名クラスについては、こちらのサイトでも詳しく解説していますので、ぜひ参考にしてください。

【Java入門】Java8のラムダ式の使い方とメリットとは(Stream API)
更新日 : 2018年10月29日

Interface内のprivateメソッド

Java8からInterface内でdefautメソッドとstaticメソッドが定義できるようにりました。

こちらのサイトで詳しく解説していますので、参考にしてください。

【Java入門】interfaceとdefaultの使い方
更新日 : 2018年10月26日

Java9ではさらにprivateメソッドが定義できるようになりました。

defaultメソッドやstaticメソッドの処理内でprivateメソッドを使うことができます。

Interfaceの使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【Java入門】interface(インタフェース)の使い方総まとめ
更新日 : 2019年4月26日

try-with-resources文の改良

ファイルやデータベースにアクセスするとリソースを解放するためにclose処理を記述する必要がありました。

これを忘れるとメモリリークの原因になったりします。

Java7よりtry-with-resources文が追加され、リソースが確実に閉じられるようになりました。

finallyブロックでcloseメソッドを呼び出さなくても自動でcloseしてくれます。

ただし、以下の記述のようにtry節内でクラスを宣言する必要がありました。

これがJava9よりtry節内で宣言する必要がなくなりました

以下のように記述できます。

Stream APIでのメソッドの追加

Java8でStream APIが追加され、簡潔に記述できるようになりました。

Stream APIについては、こちらのサイトで詳しく解説していますので、参考にしてください。

【Java入門】Java8のラムダ式の使い方とメリットとは(Stream API)
更新日 : 2018年10月29日

Java9ではこのStream APIにさらにメソッドが追加されています。

それぞれのメソッドの使い方についてみていきましょう。

takeWhile

takeWhileメソッドは、条件を満たしている間だけ処理が行われます。

一度条件を満たさなくなると、その後の処理は実行されません。

break文でforループを抜ける記述を簡潔にすることができます。

サンプルコードで確認しましょう。

実行結果:

break文でループを抜ける方法については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【3分で解決Java】for文のループ制御(breakとcontinue)
更新日 : 2019年4月4日

dropWhile

dropWhileメソッドは、条件を満たしている間は処理が行われません。

一度条件を満たさなくなると、その後の処理を実行します。

サンプルコードで確認しましょう。

実行結果:

ofNullable

ofNullableメソッドは引数に指定する値がnullでない場合はStreamを返します

nullの場合は空のStreamを返します。

nullチェックが必要なくなります

サンプルコードで解説しましょう。

実行結果:

このサンプルコードでは、List型のオブジェクトlistの要素をKeyの値に指定し、Map型のオブジェクトmapのValueを返すように記述しています。

listの要素”Oosaka”はmapのKeyには含まれていないので、Keyに"Oosaka"を指定するとnullを返します。

ofNullableメソッドの引数がnullですので、その場合はエラーも発生せず、出力表示もされていません。

このようにnullチェックが必要なく、簡潔に記述することができます。

Optionalクラスでのメソッドの追加

Java8でOptionalクラスが追加されました。

値のない状態を「null」と言いますが、開発中はnullが原因で意図しないエラーが起こることがよくあります。

そのためif文などを使ってnullチェックの処理を書く必要がありましたが、Optionalクラスを使うと簡潔に書くことができます。

Java9ではこのOptionalクラスにさらにメソッドが追加されました。

Optionalクラスの使い方についてはこちらのサイトで詳しく解説していますので、参考にしてください。

Java8の新機能を徹底解説!(ラムダ式、Streamなど)
更新日 : 2017年12月20日

新たに追加されたメソッドの使い方についてみていきましょう。

ifPresentOrElse

Java8で追加されたifPresentメソッドを使うと、nullでない場合のみ引数で指定した処理を行うことができました。

ifPresentOrElseメソッドではnullの場合も処理を行うことができます。

nullでない場合の処理を第1引数に指定します。

nullの場合の処理を第2引数に指定します。

サンプルコードで確認しましょう。

実行結果:

or

orメソッドはnullの場合のみ処理を実行します。

orメソッドはOptional型のオブジェクトを返します。

サンプルコードで確認しましょう。

実行結果:

stream


stream
メソッドを使うと、nullチェックをせずにOptional型のオブジェクトからnullでないものだけを取り出すことができます。

サンプルコードで確認しましょう。

実行結果:

List型のオブジェクトlist1はnullではないので、streamメソッドで要素を取得できています。

一方list2の場合はnullであるにもかかわらず、エラーは発生ぜずに処理を実行できています。

Deprecatedアノテーションの強化

Java9ではDeprecatedアノテーションでforRemoval(削除されるか?)、since(いつから?)を指定できるようになりました。

ちなみにDeprecatedアノテーションは、Javaのバージョンが新しくなって以前の記述では非推奨となるけれども、以前の記述のまま残しておきたい場合に使います。

サンプルコードで確認しましょう。

実行結果:

このサンプルコードでは、ClassSampleクラスのget_numメソッドをgetNumメソッドにメソッド名を変更しています。

旧のget_numメソッドに@Deprecatedアノテーションを付けることで、非推奨の警告が出ますが旧のメソッドを削除することなく使用することも出来ています。

forRemoval将来削除されるかどうか指定することができます。

また、sinceいつから非推奨になったかバージョンを指定することができます。

Deprecatedをはじめ、アノテーションの使い方については、こちらのサイトで詳しく解説しています。

ぜひ参考にしてください。

【Java入門】アノテーションの使い方と作成する方法
更新日 : 2019年4月16日

このままJavaを学び続けて大丈夫?

あなたがJavaを学んでいる理由は何でしょうか?

  • プログラミングと言えばJavaだから
  • プログラミング言語人気ランキングで1位だから
  • 授業で一度習ったことがあるから

もしあなたがJavaでできることやJavaエンジニアの働き方などを知らずに学習を始めているのなら、Javaの特徴があなたのやりたいことと本当に合っているのか?を見直す必要があります。

Javaは誕生して30年経ち様々な企業で使われて求人数や需要も多く、汎用性の高い非常に優れている言語です。そんなJavaエンジニアの特徴としては、

  • アンドロイドアプリや業務アプリ向きでWebサービスには別言語の方が向いている
  • 基本的に客先常駐型かつチームで開発していくスタイル、複数の仕事を掛け持ちしたり、場所を問わずに働きたいという人には向いていない
  • Javaは単体で動作する言語ではなく、他の様々な技術と掛け合わせる言語のため、習得難易度は高い

もしあなたがWebサービス開発経験を積みつつ、自分でもサービスを作れるようになりたい。場所問わずに自由に働きたい。というイメージでしたら、Ruby、Python、PHPなどの言語のほうが適しています。

自分に合った言語を知りたい方は、質問に答えていくだけであなたにおすすめのプログラミング言語を知れるプログラミング学習診断アプリがありますので、こちらを見てみてください。

おすすめの言語だけでなく、理想の生活を手に入れるキャリア設計や、そのキャリアに直結する効率の良い学習方法など、1からあなたにあったものを知りたい方は弊社「侍エンジニア塾」の無料体験レッスンでお答えいたします。

オンラインでも受講可能なため、お気軽にお申し込みください。

無料体験レッスンを申し込む

まとめ

今回はJava9の主な新機能について解説してきましたが、いかがでしたか?

JShellJigsawなどの大きな変更があるため細かい部分まで解説しきれなかったのは残念ですが、これらの機能を使いより楽をして品質の高いコードをかけるといいですね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説