簡體   English   中英

在java 1.6 for string中以優雅的方式切換

[英]Switch in elegant way in java 1.6 for string

我正在使用java 1.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")) {

    }

可以使用許多模式,從使用枚舉到使用Map<String,Implementation>但是在這個精確的情況下,它們都不會更簡潔,也更快。 如果更多代碼依賴於此typeName它們才有意義。

您可以使用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);
}

盡管使用enum可能有點直觀,但在這方面已證明非常強大。

每個enum都有一個valueOf(String)方法,該方法返回該名稱的Element。 然后,您可以在switch語句中使用檢索到的Element。 唯一丑陋的部分是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
    }
}

枚舉也可以實現接口。 通過為每個元素提供一個實現或者為每個元素提供一個實現。

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
    }
}

第二種方式使得擴展功能變得非常容易(只要它保留在一個模塊中,枚舉就無法進行子類化)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM