枚举值基于字符串内容

时间:2015-02-11 16:25:42

标签: java enums

我正在尝试使用枚举在我的应用程序中包装某些错误代码。

public enum ErrorStatus
{
    PAGE_NOT_FOUND("http 404", "lorem ipsum")
    private final String code;
    private final String description;
        private ErrorStatus(String code, String description)
            {
            this.code = code;
            this.description = description;
        }
    public String getDescription()
    {
        return description;
    }
}

当我收到错误时,它是带有代码的字符串,例如“http 404”。

“http 404”(或任何其他错误代码)似乎不是一个清晰易读的枚举名称:

http_404("page not found", "lorem ipsum")

我发现无法覆盖valueOf()name()方法,我想阻止其他人错误地在String值上使用valueOf()而不是使用自定义实现不同的名字。

将enum映射到该String值的最简洁方法是什么?

2 个答案:

答案 0 :(得分:2)

编辑:在阅读完评论后,我认为您正在寻找类似的内容。

import java.util.HashMap;
import java.util.Map.Entry;


public enum ErrorStatus {

    PAGE_NOT_FOUND("404", "Description for error 404");

    private static final HashMap<String, ErrorStatus> ERRORS_BY_CODE;
    private static final HashMap<String, ErrorStatus> ERRORS_BY_DESCR;
    static {
        ERRORS_BY_CODE = new HashMap<String, ErrorStatus>();
        ERRORS_BY_CODE.put("404", PAGE_NOT_FOUND);
        ERRORS_BY_DESCR = new HashMap<String, ErrorStatus>();
        ERRORS_BY_DESCR.put("Description for error 404", PAGE_NOT_FOUND);
    }

所以最重要的是使用HashMap s,就像邹邹建议的那样。如果你想有效地通过givwn代码寻找描述你需要一个地图,如果你想通过给定描述有效地寻找代码你需要也是一张地图。

如果您有"404""500"这样的字符串,并希望获得相应的说明,则可以使用

public static ErrorStatus getErrorByCode(String code) {
    return ERRORS_BY_CODE.get(code);
}

如果您的描述与&#34;描述错误404&#34;并希望获得可以使用的相应错误代码

public static ErrorStatus getErrorByDescr(String descr) {
    return ERRORS_BY_DESCR.get(descr);
}

如果你只有一个字符串包含描述,那就有点讨厌了。这不是最有效的方法,但假设您没有那么多的错误代码,那就没事了。因此,如果我们有一个像&#34这样的字符串;这里是找不到页面的描述错误&#39;描述错误404&#39;&#34;然后你可以使用

public static ErrorStatus getErrorByString(String str) {
    for (Entry<String, ErrorStatus> entry : ERRORS_BY_DESCR.entrySet()){
        if (str.contains(entry.getKey())) {
            return entry.getValue();
        }
    }
    return null;
}

注意最后一个方法,因为如果没有找到任何内容,它返回null,并且只提供它成功的第一个错误对象(而代码中可能有多个错误描述)。

答案 1 :(得分:1)

您可以使用地图来保存映射代码枚举。

enum ErrorStatus {    

    PAGE_NOT_FOUND("404", "lorem ipsum");

    private static class Holder {
        private static Map<String, ErrorStatus> MAP = new HashMap<>();
    }

    private String code;
    private String description;

    private ErrorStatus(String code, String description) {
        this.code = code;
        this.description = description;
        Holder.MAP.put(code, this);
    }

    public static ErrorStatus fromCode(String code) {
        ErrorStatus error =  Holder.MAP.get(code);
        if(error == null) {
            throw new IllegalArgumentException();
        }
        return error;
    }
}

然后将其称为:

ErrorStatus status = ErrorStatus.fromCode("404"); //PAGE_NOT_FOUND

诀窍是类加载器在枚举类之前初始化静态内部类,以便您可以在枚举构造函数中使用映射,这意味着代码最少。

要将枚举映射到其代码,您只需添加一个可以给出代码值的方法:

public String code() { return this.code; }

  

似乎无法阻止价值或覆盖它。

不,你不能。但是您可以使用公共静态最终字段创建一个类。

class ErrorStatus {    

    public static final ErrorStatus PAGE_NOT_FOUND = new ErrorStatus("404", "lorem ipsum");
    //override toString, hashCode and equals

    //same code as in the enum

}