2013-02-14 44 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 
    } 
} 

第二种方式使得扩展功能非常容易(只要它保留在一个模块中,子类化对于枚举是不可能的)。

相关问题