プロフィール


Live!Ads

カテゴリ

iPad (2)

スポンサー


検索(サイト内)

全タイトルを表示


最近の記事

最近のコメント

最近のトラックバック

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



【--/--/-- --:--】 スポンサー広告| tb(-) cm(-)

[Java]Java の enum に負けた話

Java の enum がクラスでもない値でもない、人間でも妖怪でもない妖怪人間ベムみたいで非常にビミョーです。

事の発端は、Android でサービスを作るとき、aidl という言語でインターフェースを定義しますが、そこで enum が使えない。これビミョーポイント1です。
(どっちかっていうと aidl がビミョーなのかも知れませんが。)



内部では enum だった方が何かと都合が良いので、とりあえず enum は作って、サービスには int に変換して渡すことに。
こうなると enum と int の相互変換が必要です。
C#(.NET)なら、enum と int の相互変換は以下のコードのように簡単に書けます。

[C#]
public enum HogeTypes
{
Hoge1 = 1,
Hoge2 = 2,
Hoge3 = 3
}

static void Main(string[] args)
{
// 数値に変換して出力
Console.WriteLine(Convert.ToInt32(
HogeTypes.Hoge1).ToString()); // 1
Console.WriteLine(Convert.ToInt32(
HogeTypes.Hoge2).ToString()); // 2
Console.WriteLine(Convert.ToInt32(
HogeTypes.Hoge3).ToString()); // 3

// 番号:2 → Enum:Hoge2
Array enums = Enum.GetValues(
typeof(HogeTypes));
foreach (var item in enums)
if (Convert.ToInt32(item) == 2)
Console.WriteLine(
item.ToString()); // Hoge2
}


Java の場合は、、、enum を数値に変換することができません。(ビミョーポイント2)
あるのは文字列への変換のみ。aidl で文字列を使うのは嫌だったので…。

で、

Enum型と整数型との相互変換 - torutkの日記

という記事を発見しました。(感謝!)
この方法は enum にメソッドやフィールドを定義するものです。
次のように応用することで、.NET の enum と同じように getIntValue と valueOf で数値⇔enum値の相互変換ができます。

[Java]
public enum HogeTypes {
Hoge1(1),
Hoge1(2),
Hoge1(3);

HogeTypes(final int anIntValue) {
intValue = anIntValue;
}
// enum定数から整数へ変換
public int getIntValue() {
return intValue;
}
// 整数からenum定数へ変換
public static HogeTypes valueOf(
final int anIntValue) {
for (HogeTypes d : values()) {
if (d.getIntValue() == anIntValue) {
return d;
}
}
return null;
}

private int intValue;
}


今回やりたいことは確かに実現できたのですが、、、enum を作る度に同じメソッドやフィールドを書くのがどうにも許せません。

できたら、フィールドやメソッドはカプセル化したいのですが、enum は派生させられないし、Generics の T にも与えられないし(これらは .NET も同じようですが)いまのところ、処理を共通化する術がありません。

なんともビミョーな Java の enum です。

P.S.
ヘルプ によると Java の enum のベースは Enum> であるとのこと。
なんじゃこりゃ?って感じですが、この辺を理解したら、もうすこしスマートな方法がとれるのかなあ?
スポンサーサイト
【2010/10/22 00:51】 Android| tb(0) cm(0)
タグ : Android
<<IS03 予約しました | ホーム | [Android][Java]AyncTask+ProgressDialog のハマリポイント>>
コメント
コメントの投稿

管理者にだけ表示を許可する

トラックバック
トラックバックURL
http://oku2006.blog43.fc2.com/tb.php/1610-3897ab44
| ホーム |
アクセスランキング
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。