- 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%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 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>();

こんな感じ。


Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2006-12-17 02:07
auto-boxing/unboxing が便利と思っていましたが、ちょっと気になって実験してみました。

コード:
int n = null;


はコンパイルエラー。

コード:
Integer i = null;
int n = i;


は実行時に n = i で NullPointerException でした。

コンパイラが n = i.intValue() と解釈しているためだろうとは思いますが、やはり null が渡されては困るケースは注意が必要のようです。(当たり前か
この辺は C# の型システムの方がスマートですね。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-12-17 17:11
引用:

coasmさんの書き込み (2006-12-17 00:27) より:
拡張Forとオートボクシングは便利に使ってますが、
Generics はマジメに書くと面倒臭いと思う。



もともと、コレクションなどを利用する際はプログラマが
頭の中でこのコレクションに格納されているのはxxx型だよな、と
考えながら使っていたものを明記したというだけなので、
typedefみたいな手法で省略した分がどこに行くかと言えば、
読むときにプログラマが補完してるだけなんだよね、という話だったり。

記述の面倒さはEclipse3.2系であればコード補完をやってくれるので
あまり気にならない点ではあります。
3.1系だとこのあたりのジェネリクスは補完されないんですよね…。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-12-17 17:16
引用:

Gioさんの書き込み (2006-12-17 02:07) より:
コード:
Integer i = null;
int n = i;


は実行時に n = i で NullPointerException でした。



実際のところオートボクシングというのは
コード:
Integer integer;
int i;
i = integer.intValue();
integer = new Integer(i);


ということをコンパイラが自動でやってくれるという
シンタックスシュガーに他ならないので妥当な動きといえばそうなんですが…。
オートボクシングで使う前提のList<Integer>みたいな記述に対して
null値が混入しないように気をつけないと、デバッグで嵌ることがあります。
1.4のころにListなどを使っていてClassCastExceptionが出るバグに
嵌ることに比べれば可愛い物ですが、1.5以降での嵌りポイントなので注意がいりますね。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-12-17 17:40
オートボクシングの話ですが、switch文に使うのもNPEの原因になります。
オートボクシングに限らずenumも同様です。

ところで、型パラメータでextendsをよく使いますが、superの使い道がイマイチわかりません。
どういう目的で使うのが便利なのか、だれかご存知ありませんか?

あとthrows句にも型パラメータが使用できますが、これも使用目的が謎です。
これを使いこなせてる人っていませんか?
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2006-12-17 18:04
引用:

coasmさんの書き込み (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>();

こんな感じ。






C#2.0だとusingを使って別名を定義できるようですが、Javaのimportではできないみたいですね。

コード:
using StrIntPair =
  System.Collections.Generic.KeyValuePair<string, int>;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            StrIntPair pair = new StrIntPair("aaa", 10);
            StrIntPair pair2 = new KeyValuePair<string,int>("bbb",20);
            KeyValuePair<string, int> pair3 = new StrIntPair("ccc", 30);
        }
    }
}

mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-12-17 18:22
某所で今年リリースしたシステムで、
・Generics
・オートボクシング
・拡張for
だけ使いました。

Genericsはたしかに面倒…。

Map<a,b> map = new Map<>();

程度で済ませて欲しいかも。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 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っぽくていいなと思いますね。

スキルアップ/キャリアアップ(JOB@IT)