Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java1.6中以优雅的方式切换字符串_Java_Switch Statement - Fatal编程技术网

在Java1.6中以优雅的方式切换字符串

在Java1.6中以优雅的方式切换字符串,java,switch-statement,Java,Switch Statement,我使用的是Java1.6,我知道从Java1.7可以选择打开字符串 但是在这里我使用if/elseif来路由类型名,我的问题是是否有一种优雅的方式 我能把它改成开关吗 public static SwitchType<?> switchT(final String typeName, final String memberName) { if (typeName.equals("java.lang.St

我使用的是Java1.6,我知道从Java1.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")) {

    }
public static SwitchType switchT(最终字符串类型名,
最终字符串(名称){
if(typeName.equals(“java.lang.String”)){
返回新的SwitchInputType(新字符串(memberName+“”));
}else if(typeName.equals(“char”)){
返回新的SwitchInputType(新字符('a'));
}else if(typeName.equals(“decimal”)||
typeName.equals(“java.math.BigDecimal”)){
返回新的SwitchInputType(新的BigDecimal(“34.58”);
}else if(typeName.equals(“布尔”)){
}

许多模式都可用,从使用枚举到使用
映射
,但没有一种模式比这种情况下的模式更简洁、更快。只有更多的代码依赖于此
类型名
才能使用
映射

公共接口开关类型工厂{
SwitchType创建(字符串成员名);
}
...
私有静态映射工厂=新HashMap();
静止的{
put(“java.lang.String”,新的SwitchTypeFactory(){
@凌驾
公共开关类型创建(字符串成员名称){
返回新的SwitchInputType(memberName+“”);
}
});
factories.put(“char”,新的SwitchTypeFactory(){
@凌驾
公共开关类型创建(字符串成员名称){
返回新的SwitchInputType(Character.valueOf('a'))
}
});
...
}
公共静态SwitchType switchT(最终字符串类型名、最终字符串成员名){
返回工厂.get(typeName).create(memberName);
}

尽管使用
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
    }
}
枚举类型{
JAVA_LANG_字符串;
烧焦
十进制的
布尔型;
JAVA_LANG_BIGDECIMAL;
}
公共静态SwitchType switchT(最终字符串类型名,
最终字符串(名称){
试一试{
Type t=Type.valueOf(typeName.toUppercase().replace(“.”,“”);
开关(t){
case Type.JAVA_LANG_STRING:返回新的SwitchInputType(新字符串(memberName+“”));
case Type.CHAR:返回新的SwitchInputType(新字符('a'));
case Type.DECIMAL:
case Type.JAVA_MATH_BIGDECIMAL:返回新的SwitchInputType(新的BIGDECIMAL(“34.58”);
}捕获(IllegalArgumentException e){
//默认情况
}
}
枚举也可以实现接口。通过为每个元素提供一个实现或一个全局实现

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
    }
}
界面切换InputTypeFacotry{
SwitchInputType获取(字符串参数);
}
enum TypeName实现SwitchInputTypeFacotry{
煤焦{
SwitchInputType获取(字符串参数){
返回新的SwitchInputType(新字符('a'));
}
}
[...]
}
公共静态SwitchType switchT(最终字符串类型名,
最终字符串(名称){
试一试{
SwitchInputTypeFacotry t=Type.valueOf(typeName.toUppercase().replace(“.”,“”);
返回t.get(memberName);
}捕获(IllegalArgumentException e){
//默认情况
}
}

第二种方法使扩展功能变得非常容易(只要它停留在一个模块中,就不可能使用枚举进行子类化)。

您能提供一个例子吗?@JeanTennie JB Nizet刚刚做了。谢谢,静态应该在新类中?您刚刚编写的是什么意思static@JeanTennie1)第2)条“静态{…}”是静态初始值设定项。请查找它。
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
    }
}