我正在尝试使用枚举在我的应用程序中包装某些错误代码。
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值的最简洁方法是什么?
答案 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
}