1

私はJava1.6を使用しており、Java 1.7から文字列をオンにするオプションがあることを知っていますが、ここではif / elseifを使用してタイプ名をルーティングします。これを切り替えるために変更できるエレガントな方法があるかどうか、私の質問です。

public static SwitchType<?> switchT(final String typeName,
                                    final String memberName) {

    if (typeName.equals("java.lang.String")) {
        return new SwitchInputType<String>(new String(memberName + " "));

    } else if (typeName.equals("char")) {
        return new SwitchInputType<Character>(new Character('a'));

    } else if (typeName.equals("decimal") || 
               typeName.equals("java.math.BigDecimal")) {
        return new SwitchInputType<BigDecimal>(new BigDecimal("34.58"));

    } else if (typeName.equals("boolean")) {

    }
4

3 に答える 3

1

少し直感に反するかもしれませんが、enumその点で非常に強力であることが証明されています。

すべてenumに、valueOf(String)その名前の要素を返すメソッドがあります。次に、取得した要素をswitchステートメントで使用できます。唯一の醜い部分は、をvalueOf(String)スローすることIllegalArgumentExceptionです。したがって、それをキャッチすることはデフォルトの場合と同等です。

enum Type{
    JAVA_LANG_STRING;
    CHAR;
    DECIMAL;
    BOOLEAN;
    JAVA_LANG_BIGDECIMAL;
}

public static SwitchType<?> switchT(final String typeName,
                                final String memberName) {

    try{
    Type t = Type.valueOf(typeName.toUppercase().replace(".","_"));
    switch(t){
    case Type.JAVA_LANG_STRING: return new SwitchInputType<String>(new String(memberName + " "));
    case Type.CHAR: return new SwitchInputType<Character>(new Character('a'));
    case Type.DECIMAL:
    case Type.JAVA_MATH_BIGDECIMAL: return new SwitchInputType<BigDecimal>(new BigDecimal("34.58"));
    }catch(IllegalArgumentException e){
        //default case
    }
}

また、列挙型はインターフェイスを実装する場合があります。要素ごとに1つの実装を提供するか、グローバルな実装を1つ提供します。

interface SwitchInputTypeFacotry {

    SwitchInputType get(String arg);

}
enum TypeName implements SwitchInputTypeFacotry{
    CHAR{
        SwitchInputType get(String arg){
            return new SwitchInputType<Character>(new Character('a'));
        }
    }
    [...]
}

public static SwitchType<?> switchT(final String typeName,
                                final String memberName) {

    try{
        SwitchInputTypeFacotry t = Type.valueOf(typeName.toUppercase().replace(".","_"));
        return t.get(memberName);
    }catch(IllegalArgumentException e){
        //default case
    }
}

2番目の方法では、機能を非常に簡単に拡張できます(1つのモジュールにとどまっている限り、列挙型でサブクラス化することはできません)。

于 2013-02-14T14:23:17.803 に答える
1

列挙型の使用からがの使用まで、多くのパターンが利用可能Map<String,Implementation>ですが、この正確な場合よりも簡潔で高速なパターンはありません。より多くのコードがこれに依存している場合にのみ意味がありますtypeName

于 2013-02-14T09:16:10.413 に答える
1

あなたは使用することができますMap<String, SwitchTypeFactory>

public interface SwitchTypeFactory {
   SwitchType<?> create(String memberName);
}

...

private static Map<String, SwitchTypeFactory> factories = new HashMap<String, SwitchTypeFactory>();

static {
   factories.put("java.lang.String", new SwitchTypeFactory() {
        @Override
        public SwitchType<?> create(String memberName) {
            return new SwitchInputType<String>(memberName + " ");
        }
    });

    factories.put("char", new SwitchTypeFactory() {
        @Override
        public SwitchType<?> create(String memberName) {
            return new SwitchInputType<Character>(Character.valueOf('a'))
        }
    });
    ...
}

public static SwitchType<?> switchT(final String typeName, final String memberName) {
    return factories.get(typeName).create(memberName);
}
于 2013-02-14T09:20:54.470 に答える