Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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
Java 返回正确的枚举而不使用if_Java_Enums - Fatal编程技术网

Java 返回正确的枚举而不使用if

Java 返回正确的枚举而不使用if,java,enums,Java,Enums,如果出现以下情况,我必须更改此任务: if (userDecision.equalsIgnoreCase("D")) { return DirectoriesActivity.DELETE; } else if (userDecision.equalsIgnoreCase("R")) { return DirectoriesActivity.REPLACE; } else { return DirectoriesActivity.ADD_NEW_CONTENTS; }

如果出现以下情况,我必须更改此任务:

if (userDecision.equalsIgnoreCase("D")) {
    return DirectoriesActivity.DELETE;
} else if (userDecision.equalsIgnoreCase("R")) {
    return DirectoriesActivity.REPLACE;
} else {
    return DirectoriesActivity.ADD_NEW_CONTENTS;
}
在将返回的内容上,只使用enum而不使用if。我必须使用一些枚举属性,但我不知道是哪一个:/这是我的枚举:

public enum DirectoriesActivity {
    DELETE,
    REPLACE,
    ADD_NEW_CONTENTS;
}
我试着这样做:

public enum DirectoriesActivity {
    DELETE ("D"),
    REPLACE ("R"),
    ADD_NEW_CONTENTS ("A");

    private String directoriesActivityCode;
    private DirectoriesActivity(String directoriesActivityCode)    {
        this.directoriesActivityCode = directoriesActivityCode;
    }

    public DirectoriesActivity getEnum(String x){
        //no idea what to do here
    }
}

或者有人有其他想法?

您可以添加地图查找

static Map<String, DirectoriesActivity> lookup = new HashMap<>();

static {
    // iterate over all the values and 
    // put the value we want to lookup as the key to the map.
    for(DirectoriesActivity da: values())
        lookup.put(da.directoriesActivitCode, da);
}

public static DirectoriesActivity lookup(String s) {
    // lookup the map we built in the static block.
    return s == null ? null : lookup.get(s.toUppercase());
}
staticmap lookup=newhashmap();
静止的{
//迭代所有的值和
//将要查找的值作为映射的键。
对于(DirectoriesActivity da:values())
lookup.put(da.directoriesActivitCode,da);
}
公共静态目录活动查找(字符串s){
//查找我们在静态块中构建的地图。
返回s==null?null:lookup.get(s.toUppercase());
}

通过这种方式,您可以添加任意数量的代码,而无需更改代码。

您可以添加地图查找

static Map<String, DirectoriesActivity> lookup = new HashMap<>();

static {
    // iterate over all the values and 
    // put the value we want to lookup as the key to the map.
    for(DirectoriesActivity da: values())
        lookup.put(da.directoriesActivitCode, da);
}

public static DirectoriesActivity lookup(String s) {
    // lookup the map we built in the static block.
    return s == null ? null : lookup.get(s.toUppercase());
}
staticmap lookup=newhashmap();
静止的{
//迭代所有的值和
//将要查找的值作为映射的键。
对于(DirectoriesActivity da:values())
lookup.put(da.directoriesActivitCode,da);
}
公共静态目录活动查找(字符串s){
//查找我们在静态块中构建的地图。
返回s==null?null:lookup.get(s.toUppercase());
}
通过这种方式,您可以添加任意数量的代码,而无需更改代码。

这样如何:

public enum DirectoriesActivity {
    DELETE ("D"),
    REPLACE ("R"),
    ADD_NEW_CONTENTS ("A");

    private String directoriesActivityCode;

    private DirectoriesActivity(String directoriesActivityCode)    {
        this.directoriesActivityCode = directoriesActivityCode;
    }    

    public DirectoriesActivity getEnum(String x){
        for (DirectoriesActivity directoriesActivity : values()) {
            if (directoriesActivity.directoriesActivityCode.equals(x)) {
                return directoriesActivity;
            }
        }
        throw new IllegalArgumentException("Unknown value " + x);
    }
}    
或者如果您使用的是Java8

return Arrays.stream(DirectoriesActivity.values())
            .filter(directoriesActivity -> directoriesActivity.directoriesActivityCode.equals(userDecision))
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException("Unknown value " + userDecision));
这里重要的一点是,该解决方案的性能比Peter提供的解决方案差得多。但是,只要性能不是问题,我更喜欢这样的解决方案。

这个怎么样:

public enum DirectoriesActivity {
    DELETE ("D"),
    REPLACE ("R"),
    ADD_NEW_CONTENTS ("A");

    private String directoriesActivityCode;

    private DirectoriesActivity(String directoriesActivityCode)    {
        this.directoriesActivityCode = directoriesActivityCode;
    }    

    public DirectoriesActivity getEnum(String x){
        for (DirectoriesActivity directoriesActivity : values()) {
            if (directoriesActivity.directoriesActivityCode.equals(x)) {
                return directoriesActivity;
            }
        }
        throw new IllegalArgumentException("Unknown value " + x);
    }
}    
或者如果您使用的是Java8

return Arrays.stream(DirectoriesActivity.values())
            .filter(directoriesActivity -> directoriesActivity.directoriesActivityCode.equals(userDecision))
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException("Unknown value " + userDecision));

这里重要的一点是,该解决方案的性能比Peter提供的解决方案差得多。但只要性能不是问题,我更喜欢这样的解决方案。

如果可以将枚举名称更改为d、R、a,则可以使用内置功能:

public enum DirectoriesActivity {D,R,A}
DirectoriesActivity activity = DirectoriesActivity.valueOf("D");

valueOf
如果字符串不匹配,则抛出IllegalArgumentException。

如果可以将枚举名称更改为D、R、A,则可以使用内置功能:

public enum DirectoriesActivity {D,R,A}
DirectoriesActivity activity = DirectoriesActivity.valueOf("D");


valueOf
在字符串不匹配时抛出IllegalArgumentException。

比switch@SashaSalauyou这就是为什么彼得是281k代表的大师,而我只是一个差劲的代表xDDDD@JordiCastilla我们是来学习的,我相信即使是彼得在StackOverflow@Codebender上的这些年也学到了很多东西。这段代码非常有效(在实践中多次使用).static是在创建值之后执行的。@Codebender我更奇怪为什么OP接受了更详细、效率更低的答案。比switch@SashaSalauyou这就是为什么彼得是281k代表的大师,而我只是一个差劲的代表xDDDD@JordiCastilla我们在这里学习,我相信即使是彼得在Stack的岁月里也学到了很多溢出)@Codebender此代码工作准确(在实践中多次使用)<代码>静态是在创建值之后执行的。@Codebender我更为惊讶的是,OP为什么接受了更为详细和低效的答案。确实如此,但我想问题是在不使用
if
的情况下重写“客户机代码”?这可以被重构为DirectoriesActivity.getEnum(userDecision)。一个if可以是:P只是我不能使用例如20x if(为了不出现这种情况,如果(a)elseif(b)elseif(c)…elseif(z))。@MarekS我的示例不使用任何
if
,而且速度要快得多。对于20个常数,它将至少快20倍。这远不是最糟糕的解决方案@彼得拉维是最有效率的。。。一开始您可能不理解它,但是请看一看,测试它,并意识到每次使用
for循环
检索枚举不是一个好的选择。就性能而言,这不是最好的解决方案,但在决定选择哪个选项时还有很多其他方面。性能只是其中之一。是的,但我想问题是重写“客户机代码”,而不使用
if
?这可以被重构为DirectoriesActivity.getEnum(userDecision)。一个if可以是:P只是我不能使用例如20x if(为了不出现这种情况,如果(a)elseif(b)elseif(c)…elseif(z))。@MarekS我的示例不使用任何
if
,而且速度要快得多。对于20个常数,它将至少快20倍。这远不是最糟糕的解决方案@彼得拉维是最有效率的。。。一开始您可能不理解它,但是请看一看,测试它,并意识到每次使用
for循环
检索枚举不是一个好的选择。就性能而言,这不是最好的解决方案,但在决定选择哪个选项时还有很多其他方面。性能只是其中之一。