[brownies] ValuedEnumSet

一発目はValuedEnumSetです。
これの中味を説明するまえに、Delphiの列挙型(Enumeration)と集合型(Set)を紹介しましょう。これは中々強力で、Javaにも是非欲しいと思ってしまう機能です。

でもDelphiを忘れかけている僕には説明するのはしんどいので、他のサイトを参照してください。

列挙型のほうはJava1.5(もうJava5って呼ばれてる?)で導入されるらしいんですけど、集合型はどうなんでしょうね?


話を戻します。列挙型が便利なのはステータスなどを表すのに、intとかの数値に意味をもたせるのではなく、オブジェクト自身がそれを表せるという点です。
しかしそれだけならJakarta-commons-langのorg.apache.commons.lang.enum.Enumというクラスを使えば出来ます。


問題は値とのマッピングです。よくあるのがRDBのテーブルのあるカラムに記号や数値に
特別な意味を持たせるような場合です。

ユーザ種別
1:ゲスト
2:通常のユーザ
3:アドミニストレータ

というふうに値に意味を持たせてRDBにデータを格納したりした場合、この意味を確認するのに、テーブルレイアウトをチェックしてどんな意味なのかをいちいち確認しなければなりません。
そこで列挙型(Jakarta-commons-langのorg.apache.commons.lang.enum.ValuedEnum)を使って、

public final class UserType extend org.apache.commons.lang.enum.ValuedEnum {
    private UserType(String name, int value){
        super(name, value);
    }
    public static final UserType GUEST = new UserType("ゲスト", 1);
    public static final UserType NORMAL= new UserType("通常のユーザ", 2);
    public static final UserType ADMIN = new UserType("アドミニストレータ", 3);
}

という風に書いてあげるともうばっちり。ソースコードを読めばちゃんと意味が書いてあるっていう風になります。


しかし、このクラスは値としてマッピングできるのはプリミティブなintだけなのが玉に瑕。っていうわけでbrowniesでは独自に、Objectを値としてもつorg.apache.commons.lang.enum.Enumを継承したorg.asyrinx.brownie.core.lang.enum.ValuedEnumというクラスを用意しました。

これでこんな場合にも対応できます。

ユーザ種別
G0:ゲスト
U1:ユーザ(ランク1)
U2:ユーザ(ランク2)
A9:アドミニストレータ


いや長い前振りですな。すんません。
で集合型です、本題は。
例えば、上記のユーザ種別を条件としてSELECT文のINを使って検索したいとします。
javax.swing.JListで複数選択をできるようにして、上記のUserTypeという列挙型を使ってユーザの入力を受け付けたいというような場合です。

UserType用の集合型の変数を用意して、列挙型の中のどれとどれが選択されているかを表したい、っていうわけでbrowniesではorg.asyrinx.brownie.core.lang.enum.ValuedEnumSetというクラスを用意しました。

final ValuedEnumSet enumSet = new ValuedEnumSet(UserType.class);


これで集合型の入れ物が出来ます。
選択されているものを指定するにはこんな感じで書きます。

enumSet.getEntry(UserType.NORMAL).setSelected(true);

んで、値が選択されているかどうかを調べるには

if (selectedEnums.contains(UserType.NORMAL)){
    //何かの処理処理
}

ちょっと面倒くさい感じですけどJoeyではGUIなどで使う場合はコンポーネントが勝手にやってくれるので、まいっか。


と、こんな感じです。

ちなみにValuedEnumでなくても集合が使いたい場合はあるので、そういう場合にはorg.asyrinx.brownie.core.lang.enum.EnumSetというクラスを使います。



次回はTableUtilsを紹介します。