2014年11月8日土曜日

[Java SE 7] Java SE 7新機能: Project Coin

Java SE 7 の新機能は次の4つが目玉:
  • Project Coin: 言語仕様に関する小さな変更群
  • NIO.2: NIOの改良
  • Fork/Join Framework: 並列処理の実装を容易にするらしい
  • InvokeDynamic: 動的型付けでメソッド呼び出しをできるらしい
この内、Project Coinについて。

switch構文のスイッチにStringが使えるようになった

その他使えるのは(おおよそ)、整数型もろもろと列挙型。

数値リテラルに2進数表現が追加された

0b01110010

可読性向上のため、数値リテラルに_が挿入できるようになった

1234_5678
処理前にreplace("_","")される

例外のマルチキャッチ

これ知ってた。
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

例外の再スロー

再スローする例外を細かく指定できるようになった。
  static class FirstException extends Exception { }
  static class SecondException extends Exception { }
  public void rethrowException(String exceptionName) throws Exception -> FirstException, SecondException 
{
    try {
      if (exceptionName.equals("First")) {
        throw new FirstException();
      } else {
        throw new SecondException();
      }
    } catch (Exception e) {
      throw e;
    }
  }
catchしているのがExceptionになるため、Java SE 6まではthrows節にはExceptionwしか書けなかったんだそうな。

ダイヤモンド演算子

これも知ってた。例は略。

try-with-resources文

リソースのクローズを自動的にやってくれる。
try (
      java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
      java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)

    ) {
      // Enumerate each entry
      for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {
        // Get the entry name and write it to the output file
        String newLine = System.getProperty("line.separator");
        String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;
        writer.write(zipEntryName, 0, zipEntryName.length());
      }
    }
tryの()の中(=try-with-resources)で、java.lang.AutoCloseable インタフェースを実装しているオブジェクトの初期化をすると、自動的にclose()が呼ばれる。
クローズ処理は、catch, finallyブロックより先に呼ばれて、作成時と逆の順番で呼ばれる。

try-with-resources文のブロックでもtryブロックでも例外がスローされた場合、tryブロックの中の例外の方が優先されて、try-with-resources文の方の例外は抑制された例外というのになる。
(これによりどういうスニペットができるんだろう?)
詳しい動作についてはいつもの:
ひしだま's 技術メモページ: Javaステートメント リソース付きtry文
http://www.ne.jp/asahi/hishidama/home/tech/java/statement.html#try_with_resources_statement

記法、公募したんですね!pull request募集みたいな感じ?
あとJSRが何か分かってないです。仕様?RFC的な。

参考:

 slideshare: New Feature of Java SE 7 -Java SE 7で切り開く新しいJavaの世界について
(寺田佳央さん)
http://www.ne.jp/asahi/hishidama/home/tech/java/uptodate.html#JDK1.7

ORACLE: 複数の例外型のキャッチと型チェックが改善された例外再スロー
http://docs.oracle.com/javase/jp/7/technotes/guides/language/catch-multiple.html

ORACLE: try-with-resources 文
http://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html

ITPro: Java SE 7の新機能を読み解く (桜庭祐一さん)
http://itpro.nikkeibp.co.jp/article/COLUMN/20120417/391316/