Javaはこれまで3、4年に1回新しいバージョンをリリースしてきました。
しかし、現在(2018/7/4)の最新バージョンのJava10からは6ヶ月おきに新しいバージョンをリリース予定です。
今回は初心者向けに過去にさかのぼって2011年7月28日にリリースされたJava7の新機能をわかりやすく解説します!
・そもそもJavaとは?
・Java7の新機能一覧
・Java7の環境構築
・数値リテラル中のアンダースコア
・バイナリリテラルの導入
・switch文を文字列で評価
・ダイヤモンド演算子で型指定の省略
・try-with-resources文の導入
・複数の例外を1つのcatch文で捕捉
・リフレクションの例外クラス
・ThreadLocalRandomの導入
など基本的から応用的な内容についても解説していきます。
なお、Javaの記事については、こちらにまとめています。
そもそもJavaとは?
Java7の説明に入る前に、まずはJavaについて簡単におさらいしておきましょう。
Javaは1990年代にSun Microsystemsが開発・発表したオブジェクト指向という考え方を取り入れた言語です。
2010年にOracleが買収し、Oracle製品の1つになりました。
Javaは家電やモバイル機器を始めとして、多くのデバイスに搭載されています。
国内でもスマートフォンなどに搭載されていて、アプリ開発を行うにはJava言語を使って開発することになります。
2011年7月にリリースされたJava7では今ではよく使われている機能も新しく追加されているので、その新機能について解説していきます。
これまでのJavaについては、こちらのサイトでも詳しく解説していますので、ぜひ参考にしてください。
Java7の新機能一覧
Java7のリリースとサポート
Java7は2011年7月28日に正式リリースされました。
2014年3月18日に次のバージョンJava8がリリースされ、現在ではサポートも終了しています。
ちなみにJavaの公式サイトでは、古くてサポートされていないバージョンをシステム上に残しておくと、重大なセキュリティ・リスクが生じると警告しています。
新機能一覧
それではJava7で追加された新機能について解説していきます。
ここではよく使われると思われる代表的な8つの新機能について簡単に解説します。
8つの新機能について簡単にまとめました。
項目 | 説明 |
---|---|
数値リテラル中のアンダースコア | 数値リテラル内でアンダースコアの記述が可能 |
バイナリリテラルの導入 | リテラルの先頭に「0b(0B)」を記述してバイナリの指定 |
switch文を文字列で評価 | 従来のint型やenum型での評価に加えて、文字列でんも評価が可能 |
ダイヤモンド演算子で型指定の省略 | ジェネリクスを使った宣言、定義で右辺での型指定の記述を省略可能 |
try-with-resources文の導入 | finallyブロックでcloseメソッドを呼び出さなくても自動でclose |
複数の例外を1つのcatch文で捕捉 | 「|」を使って複数の例外をcatch |
リフレクションの例外クラス | ReflectiveOperationExceptionでリフレクションを使用した部分をコンパイル時にエラー検出可能 |
ThreadLocalRandomの導入 | ThreadLocalクラスを使ってスレッド固有の変数を使用しながら、乱数を使用する場合の処理速度の遅延を解消 |
Java7の環境構築
Java7の新機能を確認するには最新バージョンのJava10の開発環境でも可能です。
Java10の開発環境の構築については、こちらで詳しく解説しています。
ぜひ参考にしてください。
しかし、業務の都合上開発環境を合わせるためにどうしてもJava7での開発環境を構築しなければならない場合もあるかと思います。
ですので、Java7での開発環境の構築についても説明しておきます。
ダウンロードとインストール
Oracleでは現在パブリック・ダウンロード・サイトにJava7のアップデートを公開していません。
ですので、Javaアーカイブからダウンロードする必要があります。
「Java SE 7」をクリックします。
http://www.oracle.com/technetwork/java/javase/archive-139210.html
ラジオボタン「Accept License Agreement」をチェックし、OSを選択してダウンロードしましょう!
インストールについては、Java8リリース時と大きく変わりません。
こちらのサイトで詳しく解説していますので、参考にしてください。
バージョンダウン
Java7にバージョンダウンするためには現在のJavaのバージョンを削除する必要があります。
Javaをアンインストールできたら、前章のダウンロードの方法を参考にしてJava7をインストールしてください。
Windows 10-プログラムのアンインストール
1.「スタート」をクリックします。
2.「設定」を選択します
3.「システム」を選択します
4.「アプリと機能」を選択します
5.アンインストールするプログラムを選択し、「アンインストール」ボタンをクリックします。
6.プロンプトに従って、アンインストールを完了します
公式参考サイト
https://java.com/ja/download/faq/remove_olderversions.xml
もし、Java7とそれ以降のバージョンを複数で切り替えて使用しなければならない場合は、バージョンを切り替える方法をこちらで説明しています。
ぜひ参考にしてください。
Eclipseでの利用
こちらのサイトで解説しているPleiadesでもJava7の開発環境も自動構築することができます。
Pleiadesの環境が構築できたらJavaのプロジェクトを新規作成するときに「JavaSE-1.7」を選択してください。
これでJava7を使うことができます。
数値リテラル中のアンダースコア
Java7では数値リテラルの中にアンダースコアを記述しても、記述しない場合と同じように処理されるようになりました。
サンプルコードで確認しましょう。
public class Java7Sample { public static void main(String[] args) { int num = 123_456_789; System.out.println(num); } }
実行結果:
123456789
バイナリリテラルの導入
Java7からバイナリリテラルを使うことができます。
リテラルの先頭に「0b(0B)」を記述します。
public class Java7Sample { public static void main(String[] args) { int num = 0b00001001; System.out.println(num); } }
実行結果:
9
switch文を文字列で評価
switch文で使える型はint、short、char、byte、enumでした。
Java7から文字列(String型)も使えるようになりました。
public class Java7Sample { public static void main(String[] args) throws Exception { // 好きな色による性格判断 String answer = "青色"; switch (answer) { case "赤色": System.out.println(answer + ":" + "情熱的なリーダタイプ"); break; case "黄色": System.out.println(answer + ":" + "食いしん坊な和ませタイプ"); break; case "青色": System.out.println(answer + ":" + "沈着冷静な参謀タイプ"); break; case "紫色": System.out.println(answer + ":" + "少し斜めに構えた孤独タイプ"); break; case "白色": System.out.println(answer + ":" + "正義感が強い率先タイプ"); break; case "黒色": System.out.println(answer + ":" + "あえて悪をも受け入れる懐の広いタイプ"); break; default: System.out.println(answer + ":" + "選ぶことができない優柔不断タイプ"); } } }
実行結果:
青色:沈着冷静な参謀タイプ
Switch文を文字列で評価する方法については、こちらで詳しく解説していますので、ぜひ参考にしてください。
ダイヤモンド演算子で型指定の省略
Java7からダイヤモンド演算子を使って、以下の記述のように右辺で型の指定を省略することができます。
List<String> list = new ArrayList<>();
Listの使い方については、こちらで詳しく解説していますので、ぜひ参考にしてください。
try-with-resources文の導入
Java7よりtry-with-resources文が追加され、リソースが確実に閉じられるようになりました。
finallyブロックでcloseメソッドを呼び出さなくても自動でcloseしてくれます。
tryのすぐ後にクローズの対象となるリソースを生成する処理を記述する必要があります。
import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class Java7Sample { public static void main(String[] args) { // FileReaderクラスとreadメソッドを使って1文字ずつ読み込み表示する try (FileReader fileReader = new FileReader(new File("Test.txt"))) { int data; while ((data = fileReader.read()) != -1) { System.out.print((char) data); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
try-catch-finally文については、こちらで詳しく解説していますので、ぜひ参考にしてください。
複数の例外を1つのcatch文で捕捉
複数の例外が発生する可能性がある場合に、「|」を使って1つのcatch文にまとめることができるようになりました。
catch (IOException | SQLException e) { e.printStackTrace(); }
リフレクションの例外クラス
リフレクションはJava7以前でも使われていました。
しかし以前はリフレクションを使用した部分のコードは、コンパイル時のエラー検出対象外でエラーを検出させることができませんでした。
リフレクション部分のエラーはプログラム実行時にのみ検出するしかありませんでした。
しかし、Java7以降ではReflectiveOperationExceptionでリフレクションに関連する例外の共通クラスが定義されたため、例外処理を記述できるようになりました。
import java.lang.reflect.Method; class TestClass { private String str; public void setStr(String str) { this.str = str; } public String getStr() { return str; } } public class Main { public static void main(String[] args) { // クラス、メソッドを文字列で指定 String strClass = "TestClass"; String strMethod1 = "setStr"; String strMethod2 = "getStr"; // テスト用の変数 String str1 = "test"; // リフレクション try { // クラスの取得 Class<?> c = Class.forName(strClass); // インスタンスの生成 Object myObj = c.newInstance(); // メソッド(setStr)の取得 Method m = c.getMethod(strMethod1, String.class); // メソッド(setStr)の実行 m.invoke(myObj, str1); // メソッド(getStr)の取得 m = c.getMethod(strMethod2); // メソッド(getStr)の実行 System.out.println(m.invoke(myObj)); } catch(ReflectiveOperationException e) { e.printStackTrace(); } } }
実行結果:
test
リフレクションについては、こちらで詳しく解説していますので、ぜひ参考にしてください。
ThreadLocalRandomの導入
ThreadLocalクラスを使ってスレッド固有の変数を使用しながら、乱数を使用する場合は注意が必要となります。
乱数を使用する場合、通常Math.Randomメソッドなどを使用しますが、この場合も同様にMath.Randomメソッドを使用すると処理速度が極端に遅くなる可能性があるからです。
ですのでこの場合はJava7より使えるThreadLocalRandomクラスのThreadLocalRandom.current().nextIntメソッドを使用します。
import java.util.concurrent.ThreadLocalRandom; class Int { // インスタンス変数の宣言 private int i; // getter public int getInt() { return i; } // setter public void setInt(int i) { this.i = i; } } class NewInt { // 現行スレッドの初期値を取得 private static ThreadLocal<Int> tl = new ThreadLocal<Int>(){ @Override protected Int initialValue(){ return new Int(); } }; // 現行スレッドの値を取得 private static Int getNewInt(){ return tl.get(); } // 現行スレッドでのgetter public static int getInt(){ return getNewInt().getInt(); } // 現行スレッドでのsetter public static void setInt(int i){ getNewInt().setInt(i); } } class ThreadTest extends Thread { int val = 0; // コンストラクタ public ThreadTest(int val){ this.val = val; } public void run() { // ThreadTestクラスのメンバ変数valの値を // Intクラスのインスタンス変数にセット NewInt.setInt(val); ThreadLocalRandom.current().nextInt(); } } public class Main { public static void main(String[] args) { long t0 = System.currentTimeMillis(); for (int i = 0; i < 10000; i++){ ThreadTest tt1 = new ThreadTest(0); tt1.start(); } long processTime1 = System.currentTimeMillis() - t0; System.out.println("ThreadLocalRandomクラスでの処理時間は" + processTime1 + "ミリ秒"); } }
実行結果:
ThreadLocalRandomクラスでの処理時間は557ミリ秒
ThreadLocalRandomクラスについてはこちらで詳しく解説していますので、ぜひ参考にしてください。
まとめ
今回はJava7ので追加された主な機能について解説してきましたが、いかがでしたか?
switch文で文字列を評価できるようになったり、try-with-resource文の導入などの大きな変更がありました。
これらの機能を使いより楽をして品質の高いコードをかけるといいですね!