JDK7のプレビュー版が出たので早速触ってみた
ということで、JDK7のプレビュー版を触ってみた・・・
けど、そもそもJDK7にどんな機能があったのがかなり忘れていたので(^^;;
(LambdaもJigsawもJDK 8だったよな・・・)
skrbさんのProject Coinの部分を丸コピーで(汗
まずは簡単なところからダイヤモンド記法。
Genericsの<>の中をnewの部分は省略できるというもの。
List<Integer> list = new ArrayList<>();
特にこれといったものは無いですね(^^;;
続いては数値のリテラル記法の追加。
数値を表すとき"_"で区切りを入れられるようになりました。
例えば"10000"を次のように書くことが可能。
for (int i= 0; i<10_000; i++){ list.add(i); } System.out.println(list.size());
このとき次のように実行されます。
10000 構築成功 (合計時間: 0 秒)
これだけだと、へーって感じですが、
次のようにやってみてもエラーとなりません。
for (int i= 0; i<1_0_0_0_0; i++){ list.add(i); } System.out.println(list.size());
しかも実行結果が一緒です。
10000 構築成功 (合計時間: 0 秒)
これに関しては古いシステムとか
数値を"_"でくっつけて扱っているシステムとか
あるんじゃないかなという気がしていて
意外にバグの温床になるんじゃないかなと思ってたりします。
次はcase文でStringが使えるようになった点。
こんなことができるようになりました。
String str = "str"; switch(str){ case "Str": System.out.println("Str"); break; case "str": System.out.println("str"); break; }
実行結果はこんな感じ。
str 構築成功 (合計時間: 0 秒)
これは、意外に使いどころが難しいような気がします。
次はcatch文でのマルチキャッチ。
複数の例外を同じ場所でcatchできるようになりました。
try{ ・・・ }catch(NullPointerException | ArrayIndexOutOfBoundsException e){ ・・・ }
catchの括弧の中が長くなるのが欠点ですが、地味に使えるかも。
最後はストリームを自動的にcloseしてくれる書き方。
次の書き方をするとfinally句でcloseしなくても
自動的にcloseしてくれるようです。
try (InputStream in = new FileInputStream("C:\\test.txt"); OutputStream out = new FileOutputStream("C:\\testA.txt")) { byte[] buf = new byte[1024]; int n; while((n = in.read(buf)) >= 0) { out.write(buf, 0, n); } } catch (IOException ex) { ex.printStackTrace(); }
ちょっと特殊な書き方をしないとcloseしてくれないのか。
この場合、当たり前ですけど、
in、outのスコープはtry句の中だけになりますが、
意外にすっとぼけて微妙にはまりそうな気がちょっとします。
(私のことです・・・Javaを最近触っていなかったからなあ・・・)
他にも機能があるのですが、それはまた機会があればということで。
(というか調べている余裕が・・・)
P.S.
これらの実行はほとんどRuby専用機となっていたNetBeansで試したのですが、
最近のNetBeansはprintStackTraceを書いたら怒られるんですね。
知りませんでした・・・。