Java2 SDK, Standard Edition, v1.5 の大きな仕様変更点
2004.01.08 新規

すっかりJava人間からC#人間に転身してしまいましたが、 Java2 SDK, Standard Edition 1.5.0 Alpha なんていう話題があったので少し調べてみました。

New Language Features for Ease of Development in the Java 2 Platform, Standard Edition 1.5 を見る限り、なんていうか後発であるC#言語に似せている感があります。 Javaを手本にして使いやすく(主観)したC#を、良さげな部分だけJavaが吸収しようとしている感じ? まぁ、使いやすい言語が増えることは歓迎できるわけで。

以下、自分なりに消化できた変更仕様を・・・。

Generics
C++言語のtempleteに相当する機能らしい。 「キャストする手間がなくなる」ということで、例えば今までこんな感じだったソースが。

さんぷる1A

List words = new ArrayList();
String title = ((String) words.get(i)).toLowerCase();

Generics機能のおかげ(という表現で良いのか?)で、シンプルに書ける と。

さんぷる1B

List<String> words = new ArrayList<String>();
String title = words.get(i).toLowerCase();

「この変数は絶対にString型しか持たないのに、いちいちキャストが面倒だ!」ってときに おすすめ。 逆に、そういう仕様(=String型しか持たない)のとき、こうしておけば変な型を保持させようとすればコンパイル・エラーが出るから保守性も上がる?

 

Enhanced for loop
拡張for文は、つまりC#で言うところのforeach文っぽい。 C#では例えば、String[ ]型のtitlesって変数があったとすると、こんな感じに取り出せる。

さんぷる2A

foreach(String title in titles)
{
    // 処理
}

これをJavaでも、こんな風に書けるようになったらしい。

さんぷる2B

for(String title : titles)
{
    // 処理
}

ちなみに、けっこう推測で書いているので、実際には配列(String[ ]型とか)は指定できないかも。 そうだとしたら、てんで使えないモノになっちゃうけど。 Genericsと組み合わせるのは ばっちりOKらしいから、そんなコトはないはず。

 

Autoboxing/unboxing
基本型と参照型を同時に扱うとき必要となるラッパ・クラス、その変換を自動的にやってくれる機能らしい。

さんぷる3A

List numbers = new ArrayList();
numbers.add(new Integer(1));

今まで上記のようにやってたことが、今度は下記のように書けます。 こっちのほうが直感的で良い感じ。

さんぷる3B

List numbers = new ArrayList();
numbers.add(1);

もちろん(?)、C#ではすでに存在する機能。 JavaからC#に移った自分が「使いやすい」と言う理由、これで少しわかる? オブジェクト指向の基本知識/動作を押さえるならJavaのほうがカッチリしていて良いかもしれないけど、そのレベルを過ぎているならC#のほうが自由度が高くて面白いのですよ。 普通はしないけど数値の「10」に対して「10.ToString()」なんて感じに書けちゃったりして、とても素敵。

しかもC#なら「((double)numerator/denominator).ToString("#0.#%")」って書けば、簡単にパーセント表記が得られちゃいます。

 

Typesafe enums
int型として扱われてしまう阿呆なC言語版enum型ではなくて、ちゃんとタイプ・セーフな列挙型をようやく用意する模様。 まぁ、説明不要かな。 扱い方とかは、C#のと ほとんど変わらないっぽい。

 

Static import
「これは良いなぁ」と思ったのが、クラス変数(定数)やクラス・メソッドをインポートできちゃう この機能。 「クラス名.定数名」と書くのって自分的にけっこう億劫なんだけど、これをすると定数名だけで良いらしい。

さんぷる4A

import java.awt.Color;

    ・・・
    setForeground(Color.RED);

というのが。

さんぷる4B

import static java.awt.Color.RED;

    ・・・
    setForeground(RED);

というように書ける。
大抵の場合、定数名って分かりやすいように長い名前になるから、クラス名が不要になる分だけ これは良さげ。 でもよく考えたらC#ではusing文で既に実現してたかも。

あとは、LookAndFeelがWindowsXPに対応したとか。 J2SE 1.4 でWin2000の見た目に対応して、 J2SE 1.5 でようやくWinXPの見た目に対応するのは、ちょっと時代遅れ過ぎる気がします。 仕様強化も良いけど、やはり重要なのは見た目の派手さだと思う。

より詳しく知りたい人は、 J2SE 1.5 虎の穴 Java 2 Platform, Standard Edition v1.5 の新機能 というサイトがお勧めです。


戻る