日々常々

ふつうのプログラマがあたりまえにしたいこと。

Java7 体当たり/diamond operator

Type Inference for Generic Instance Creation
ジェネリックインスタンス生成時の型推論。私的に嬉しいダイアモンドです。コードの見た目がちょっとマシになるやつです。コードは読み物ですから、読みやすいほうが良いに決まっています。誰でも一度は書いた事がある(よね?)MapのMapとかの見た目も多少マシに。

// Java6
Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();

// Java7
Map<String, Map<String, String>> map = new HashMap<>();

原型とは違います。違うんです。何が違うんだと聞かれると困るんですけど、違うものは違うんです。こんな風に。

List<String> list;
list = new ArrayList() {
    {
        add(1); // コンパイルは通る
    }
};

list = new ArrayList<>() {
    {
        add(1); // コンパイルエラー
    }
};

ね!……いや、初期化以外だと list は List だから String 以外入れようとするとコンパイルエラーになるから、挙動的には実質原型との違い無い…と思うんですよね。となると、コンパイラの警告が出ない事くらいしか差が無くて、いやそれでも十分意味あるんですけど、それだけじゃないってのを必死に表現しようとしたらこんな例になってしまった訳で。

実際、ダイアモンドによって記述性は大して変わらないと思います。IDEを使っている限り勝手に補完されますし、使わないJava開発なんて考えられないし。記述する際に嬉しい事は、途中で変えたくなった時にコンストラクタのほうも直す手間が減るくらいですかね。可読性は間違いなく上がりますから、そっち寄りの変更かなーと。


あ、下の方に書いてるコンストラクタのやつ、意味わかりませんでした!「とかコンパイル通らないけどこれ何言ってんの?」とか思っちゃってます…。