Hatena::Grouparaistudy

czk-htnの日記

2009-05-04

[] IConverterを実装して独自の文字変換を行う 06:45

先日の続き。Date, Integer, Booleanでアプリケーション固有の文字列表現に変換するやり方をまとめてみる。

java.util.Dateを文字列に変換
item.add(new Label("birthDay") {
    private static final long serialVersionUID = 1L;
    final DateFormat df = new SimpleDateFormat("yyyy/MM/dd");

    @Override
    public IConverter getConverter(Class<?> type) {
        IConverter converter = new DateConverter() {
            private static final long serialVersionUID = 1L;
            @Override
            public DateFormat getDateFormat(Locale locale) {
                return df;
            }
        };
        return converter;
    }
});
enumを血液型の文字列に変換
public enum BloodType { A, B, O, AB, Unknown };

item.add(new Label("bloodType") {
    private static final long serialVersionUID = 1L;
    @Override
    public IConverter getConverter(Class<?> type) {
        IConverter converter = new IntegerConverter() {
            private static final long serialVersionUID = 1L;
            @Override
            public String convertToString(Object value, Locale locale) {
                BloodType type = (BloodType) value;
                switch (type) {
                case A:
                    return "A型";
                case B:
                    return "B型";
                case O:
                    return "O型";
                case AB:
                    return "AB型";
                default:
                    return "不明";
                }
            }
        };
        return converter;
    }
});
booleanを既婚・未婚の文字列に変換
item.add(new Label("married") {
    private static final long serialVersionUID = 1L;
    @Override
    public IConverter getConverter(Class<?> type) {
        IConverter converter = new BooleanConverter() {
            private static final long serialVersionUID = 1L;

            @Override
            public String convertToString(Object value,
                    Locale locale) {
                if (value != null && ((Boolean) value) == true) {
                    return "既婚";
                }
                return "未婚";
            }
        };
        return converter;
    }
});

追記(2009-05-04

そもそもenumはIntegerで変換していいものか?と考え調べたところ、toStringをオーバーライドしてやればいいんじゃないかと思いついた。enumについてはこれが正当なやり方、たぶん。

"wicket IConverter"でググってみても件数が少ない上「文字列オブジェクト」のためにやっていることが多数。文字列変換について、なんか根本的なところで勘違いしているような気がしてきた・・・

wicket
/*
 * ふつうにLabelをaddすればよろし
 */
item.add(new Label("bloodType"));
enum定義
public enum BloodType {
    A, B, O, AB, Unknown;
    @Override
    public String toString() {
        switch (this) {
        case A:
            return "A型";
        case B:
            return "B型";
        case O:
            return "O型";
        case AB:
            return "AB型";
        default:
            return "不明";
        }
    }
};

nagaseyasuhitonagaseyasuhito2009/06/02 12:42自分はenumのFQCNをキーにしてプロパティファイルから引っ張ってくるConverterを書いて使ってますー。

public class EnumerationConverter extends AbstractConverter {
private static final long serialVersionUID = 1L;

private Class<? extends Enum<?>> clazz;

public EnumerationConverter(Class<? extends Enum<?>> clazz) {
this.clazz = clazz;
}

@Override
public Object convertToObject(String value, Locale locale) {
return null;
}

@Override
public String convertToString(Object value, Locale locale) {
return new ResourceModel(this.clazz.getName() + "." + value).getObject();
}

@Override
protected Class<? extends Enum<?>> getTargetType() {
return this.clazz;
}
}
こんな感じで、プロパティファイルには
net.nagaseyasuhito.sandbox.enumeration.Role.USER = ユーザー
net.nagaseyasuhito.sandbox.enumeration.Role.GUEST = ゲスト
こういう記述。
参考までにー。

czkczk2009/06/03 06:58なるほど、それならコードに日本語埋め込まなくていいですね。
試してみます。ありがとうございますー。

トラックバック - http://araistudy.g.hatena.ne.jp/czk-htn/20090504