JAVA - 最适合的数据结构

5

我是一名刚接触Java的新手,现在面临一个困境。我有一个错误列表,看起来像这样:

"ERROR CODE" "POSITION" "Error description"
"000" "1" "No error"
"001" "1" "Connection error"
"002" "1" "Error sending reversal or batch capture process"
"003" "1" "Error after authorization – message sent to host and answer received"
"004" "1" "Error sending message for authorization"
"005" "1" "Error receiving message from host"

还有很多其他的错误。

现在我正在开发一个JAVA库,我真正需要做的是以某种方式实现这些错误(错误永远不会改变,它们总是相同的),以便使用库的开发人员可以通过给定的ERROR_CODE轻松地识别错误描述。

例如:String getError(ERROR_CODE); 并返回与ERROR_CODE相关联的错误描述字符串。

我考虑过声明ENUM数据结构,但似乎无法使其正常工作。

非常感谢。


2
请展示您如何使用枚举(enum)的尝试。 - Jesper Fyhr Knudsen
4
正确的结构确实是一个枚举。 - Denys Séguret
我不会说适当的结构是枚举,我会说这完全取决于情况。特别是考虑到他非常明确地表示错误代码是一个字符串,这可能是因为某些错误代码包含非数字字符。 - Jon Taylor
8个回答

3

您可以像这样使用枚举:

enum Error {

    ERROR_000("000", 1, "No error"),
    ERROR_001("001", 1, "Connection error"),
    ERROR_002("002", 1, "Error sending reversal or batch capture process"),
    ERROR_003("003", 1, "Error after authorization – message sent" +
                        "to host and answer received"),
    ERROR_004("004", 1, "Error sending message for authorization"),
    ERROR_005("005", 1, "Error receiving message from host");

    private final String code;
    private final int position;
    private final String description;
    private static final Map<String, Error> errorMap =
        new HashMap<String, Error>();

    static {
        for (Error error : Error.values()) {
            errorMap.put(error.code, error);
        }
    }

    Error(final String code, final int position, final String description) {
        this.code = code;
        this.position = position;
        this.description = description;
    }

    public static Error getError(String code) {
        return errorMap.get(code);
    }
    // add getters and setters here:
    public String getCode() { return this.code; }
    public int getPosition() { return this.position; }
    public String getDescription() { return this.description; }
}

我真的很喜欢这个例子。唯一想知道的是我能否添加另一个条件到 getError 方法中。我还需要指定位置,因为我在不同的位置有相同的 ERROR_CODE。例如:ERROR_CODE: 001,在 POSITION: 2 有 DESCRIPTION:"无效的消息头"。 - Ionut Bogdan
1
与其在getError中返回一个String,不如返回实际的Error对象。这样你就可以像这样做:
Error error = Error.getError("001")
System.out.println("code: "+ error.getCode() + " position: " + error.getPosition() + " description: " + error.getDescription();
我已更新我的答案。
- munyengm

2
你可以使用枚举(enum)来构建一个结构体:
public enum Error {

   public final int code;
   public final String message;

   e0 (000, "No Error"),
   e1 (001, "Connection error");

   public Error(int code, String message) {
      this.code = code;
      this.message = message;
   }

   public static Error byCode(int code) {
        return Error.valueOf("e"+code); // you may add try/catch on IllegalArgumentException, etc.
   }
}

您可以添加尽可能多的访问器(静态或非静态的,例如可以使用静态HashMap通过消息查找)。

自Java 1.5以来,您可以在switch语句中使用枚举值。


1

使用java.util.Map实现(HashMap)。将错误代码用作键,将描述用作值。


0

Java的enum非常适合你的问题。我还可以想到另一种方法,稍微更灵活一些,可以添加新的错误代码或修改现有代码。

  1. 创建一个属性文件,内容如下:
    • 000-1=无错误
    • 001-1=连接错误
  2. 将此文件打包到分发给开发人员的jar中。
  3. 创建一个类,并编写代码从jar内部读取此文件,并创建一个Map(或HashMap)来存储这些键值对。
  4. 将此代码放在静态块中,以便在类加载时初始化HashMap。
  5. getError(ERROR_CODE)方法只需将输入的错误代码附加-1,然后查询该Map并返回相应的错误消息。
  6. 要添加新的消息或修改现有消息,只需更改属性文件的内容,无需更改代码。

0
enum ErrorCode{
 001,002
}

并且

class ErrorWrapper{
 private ErrorCode errorCode;
 private String description;
 //setters + getters    
}

有一个 Map<ErrorCode, List<ErrorWrapper>>



0

只需使用一个

HashMap<String, String> 

因为你说你的错误代码是字符串并且描述也是一个字符串。


0
首先,“错误永远不会改变”在不久的将来是错误的 :)
我建议使用属性文件来存储这些错误代码和描述(如果需要,可以解析“位置”数据)。
Properties properties = new Properties();
    try {
        properties.load(new FileInputStream("errors.properties"));
    } catch (IOException e) {}

那么,你的 getError 方法将是:

public String getError(String errorCode){
     return properties.getProperty(errorCode);
}

你的 errors.properties 文件应该像这样:

001=No error
002=Connection error

我认为这将更加动态


错误很少是独立于代码之外添加的。在我看来,声明它们超出代码范围是没有意义的。只有国际化错误消息(如果有)应在属性中声明。 - Denys Séguret
错误代码大多取决于代码本身,但在大多数情况下,错误描述并非如此。 - Serkan Arıkuşu

0

我为你写了一些东西,测试代码已包含在内。只需在默认包中创建一个名为Main的类,复制粘贴我的代码并运行它即可。你可以使用Errors类中的getError(String code)方法通过代码获取错误信息:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        for(String code : new String[]{"000", "001", "002", "003", "004", "005"}) {
            System.out.println(Errors.getError(code));
        }
    }
}
class Errors {
    static {
        Errors.errors = new HashMap<String, Error>();
        for(String[] error : new String[][]{
                {"000", "1", "No error"},
                {"001", "1", "Connection error"},
                {"002", "1", "Error sending reversal or batch capture process"},
                {"003", "1", "Error after authorization – message sent to host and answer received"},
                {"004", "1", "Error sending message for authorization"},
                {"005", "1", "Error receiving message from host"}
        }) {
            Errors.errors.put(error[0], new Error(error[0], error[1], error[2]));
        }

    }
    private static Map<String, Error> errors;
    public static String getError(String code) {
        return Errors.errors.get(code).message;
    }
    private static class Error {
        private String code;
        private String position;
        private String message;
        public Error(String code, String position, String message) {
            super();
            this.code = code;
            this.position = position;
            this.message = message;
        }
        @Override
        public String toString() {
            return this.getClass().getSimpleName() + " | code: " + this.code + " | position: " + this.position + " | message: " + this.message;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接