Java7で追加された新機能を徹底解説!(ダウンロードも解説)

Javaはこれまで3、4年に1回新しいバージョンをリリースしてきました。

しかし、現在(2018/7/4)の最新バージョンのJava10からは6ヶ月おきに新しいバージョンをリリース予定です。

今回は初心者向けに過去にさかのぼって2011年7月28日にリリースされたJava7の新機能をわかりやすく解説します!


・そもそもJavaとは?
・Java7の新機能一覧
・Java7の環境構築
・数値リテラル中のアンダースコア
・バイナリリテラルの導入
・switch文を文字列で評価
・ダイヤモンド演算子で型指定の省略
・try-with-resources文の導入
・複数の例外を1つのcatch文で捕捉
・リフレクションの例外クラス
・ThreadLocalRandomの導入

など基本的から応用的な内容についても解説していきます。

そもそもJavaとは?

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

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

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

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

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

2011年7月にリリースされたJava7では今ではよく使われている機能も新しく追加されているので、その新機能について解説していきます。

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

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

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の開発環境の構築については、こちらで詳しく解説しています。

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

Java10の新機能を解説!劇的に変更されたサポートポリシーとは?
更新日 : 2019年2月11日

しかし、業務の都合上開発環境を合わせるためにどうしてもJava7での開発環境を構築しなければならない場合もあるかと思います。

ですので、Java7での開発環境の構築についても説明しておきます。

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

Oracleでは現在パブリック・ダウンロード・サイトにJava7のアップデートを公開していません。

ですので、Javaアーカイブからダウンロードする必要があります。

「Java SE 7」をクリックします。

http://www.oracle.com/technetwork/java/javase/archive-139210.html

java_version08

ラジオボタン「Accept License Agreement」をチェックし、OSを選択してダウンロードしましょう!

java701

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

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

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

バージョンダウン

Java7にバージョンダウンするためには現在のJavaのバージョンを削除する必要があります。

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

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

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

もし、Java7とそれ以降のバージョンを複数で切り替えて使用しなければならない場合は、バージョンを切り替える方法をこちらで説明しています。

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

Javaのバージョンを確認する方法(バージョンの切り替えも解説)
更新日 : 2019年4月3日

Eclipseでの利用

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

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

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

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

java702

数値リテラル中のアンダースコア

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文を文字列で評価する方法については、こちらで詳しく解説していますので、ぜひ参考にしてください。

【Java】switch文でStringの文字列を扱う方法
更新日 : 2018年11月13日

ダイヤモンド演算子で型指定の省略

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

List<String> list = new ArrayList<>();

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

JavaのList型とは!?ArrayListの使い方を基礎の基礎から解説!
更新日 : 2019年4月23日

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文については、こちらで詳しく解説していますので、ぜひ参考にしてください。

【Java】try-catchで例外処理を実装しよう!Exceptionクラスの使い方
更新日 : 2019年6月8日

複数の例外を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

リフレクションについては、こちらで詳しく解説していますので、ぜひ参考にしてください。

【Java入門】リフレクションでメソッドの実行、フィールドの変更
更新日 : 2019年4月3日

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クラスについてはこちらで詳しく解説していますので、ぜひ参考にしてください。

【納得Java】ThreadLocalでスレッド毎に値を保持する方法
更新日 : 2019年5月14日

まとめ

今回はJava7ので追加された主な機能について解説してきましたが、いかがでしたか?

switch文で文字列を評価できるようになったり、try-with-resource文の導入などの大きな変更がありました。

これらの機能を使いより楽をして品質の高いコードをかけるといいですね!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

長野 透

長野 透

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

おすすめコンテンツ

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

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