- - PR -
Java5の言語拡張は使ってますか?
投票結果総投票数:37 | |||
---|---|---|---|
両方バリバリ | ![]() |
9票 | 24.32% |
Generics | ![]() |
15票 | 40.54% |
Anotation | ![]() |
1票 | 2.70% |
それ以外の拡張forとか | ![]() |
1票 | 2.70% |
1.5だけど1.4互換 | ![]() |
3票 | 8.11% |
1.4以前 | ![]() |
8票 | 21.62% |
|
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-17 00:27
拡張Forとオートボクシングは便利に使ってますが、
Generics はマジメに書くと面倒臭いと思う。 Map<UserId,UserInfo> nusiUsers = HashMap<UserId,UserInfo>(); Map<UserId,UserInfo> veteranUsers = HashMap<UserId,UserInfo>(); Map<UserId,UserInfo> loginUsers = WeakHashMap<UserId,UserInfo>(); とか書いてると、何故同じようなことを何度も書く必要があるのかと、じれったくなる。 プリプロセッサとかtypedefみたいな機能が欲しい。 typedef UserInfoMap<M extends Map> = M<UserId, UserInfo>; UserInfoMap nusiUsers = UserInfoMap<HashMap>(); UserInfoMap veteranUsers = UserInfoMap<HashMap>(); UserInfoMap loginUsers = UserInfoMap<WeakHashMap>(); こんな感じ。 | ||||||||||||
|
投稿日時: 2006-12-17 02:07
auto-boxing/unboxing が便利と思っていましたが、ちょっと気になって実験してみました。
はコンパイルエラー。
は実行時に n = i で NullPointerException でした。 コンパイラが n = i.intValue() と解釈しているためだろうとは思いますが、やはり null が渡されては困るケースは注意が必要のようです。(当たり前か ![]() この辺は C# の型システムの方がスマートですね。 | ||||||||||||
|
投稿日時: 2006-12-17 17:11
もともと、コレクションなどを利用する際はプログラマが 頭の中でこのコレクションに格納されているのはxxx型だよな、と 考えながら使っていたものを明記したというだけなので、 typedefみたいな手法で省略した分がどこに行くかと言えば、 読むときにプログラマが補完してるだけなんだよね、という話だったり。 記述の面倒さはEclipse3.2系であればコード補完をやってくれるので あまり気にならない点ではあります。 3.1系だとこのあたりのジェネリクスは補完されないんですよね…。 | ||||||||||||
|
投稿日時: 2006-12-17 17:16
実際のところオートボクシングというのは
ということをコンパイラが自動でやってくれるという シンタックスシュガーに他ならないので妥当な動きといえばそうなんですが…。 オートボクシングで使う前提のList<Integer>みたいな記述に対して null値が混入しないように気をつけないと、デバッグで嵌ることがあります。 1.4のころにListなどを使っていてClassCastExceptionが出るバグに 嵌ることに比べれば可愛い物ですが、1.5以降での嵌りポイントなので注意がいりますね。 | ||||||||||||
|
投稿日時: 2006-12-17 17:40
オートボクシングの話ですが、switch文に使うのもNPEの原因になります。
オートボクシングに限らずenumも同様です。 ところで、型パラメータでextendsをよく使いますが、superの使い道がイマイチわかりません。 どういう目的で使うのが便利なのか、だれかご存知ありませんか? あとthrows句にも型パラメータが使用できますが、これも使用目的が謎です。 これを使いこなせてる人っていませんか? | ||||||||||||
|
投稿日時: 2006-12-17 18:04
C#2.0だとusingを使って別名を定義できるようですが、Javaのimportではできないみたいですね。
| ||||||||||||
|
投稿日時: 2006-12-17 18:22
某所で今年リリースしたシステムで、
・Generics ・オートボクシング ・拡張for だけ使いました。 Genericsはたしかに面倒…。 Map<a,b> map = new Map<>(); 程度で済ませて欲しいかも。 | ||||||||||||
|
投稿日時: 2006-12-17 18:56
>mioさん
JDK7のスレにも書いたのですが、省略形のnew構文がサポートされるみたいです。 理由としてはやっぱり、Genericsの構文が面倒というのが理由みたいですが、 まだ、完全な構文は決まっていないみたいですね。 var map = new HashMap<Integer, List<String>>(); final map = new HashMap<Integer, List<String>>(); あたりをJames Goslingさんのブログで読みました。finalだとJavaっぽくていいなと思いますね。 |