2013-02-14 42 views
1

我使用的是Java 1.6,我知道從Java 1.7有選項切換字符串 但在這裏我使用if/elseif路由類型名稱,我的問題如果有是一種優雅的方式 ,我可以改變它切換然而切換在Java 1.6的優雅方式爲字符串

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")) { 

    } 

回答

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); 
} 
+0

謝謝,靜態應該在新班上? – 2013-02-14 09:33:13

+0

這是什麼意思,你寫的只是靜態 – 2013-02-14 09:49:39

+1

@JeanTennie 1)否。2)「靜態{...}」是一個*靜態初始化*。看看它。 – 2013-02-14 09:58:52

1

很多模式可供選擇,從使用枚舉來使用Map<String,Implementation>,但沒有人會更簡潔,也快於你在這種精確的情況下。只有更多的代碼依賴於這個typeName,它們纔有意義。

+0

您能舉個例子嗎? – 2013-02-14 09:20:48

+1

@JeanTennie JB Nizet剛剛做到了。 – 2013-02-14 09:22:48

1

雖然這可能是使用enum直觀的一個小櫃檯在這方面已經證明相當強大。

每個enum都有一個valueOf(String)方法,該方法返回該名稱的Element。然後你可以在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 
    } 
} 

此外,枚舉也可以實現接口。要麼爲每個元素提供一個實現,要麼爲全局元素提供一個實現。

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

第二種方式使得擴展功能非常容易(只要它保留在一個模塊中,子類化對於枚舉是不可能的)。

相關問題