雖然這可能是使用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
}
}
第二種方式使得擴展功能非常容易(只要它保留在一個模塊中,子類化對於枚舉是不可能的)。
謝謝,靜態應該在新班上? – 2013-02-14 09:33:13
這是什麼意思,你寫的只是靜態 – 2013-02-14 09:49:39
@JeanTennie 1)否。2)「靜態{...}」是一個*靜態初始化*。看看它。 – 2013-02-14 09:58:52