2012-07-04 4 views
5

Java에 익숙하지 만 지금은 딜레마에 직면 해 있습니다. 다음과 같은 오류 목록이 있습니다.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

열거 형을 사용하여 시도해보십시오. –

+4

올바른 구조는 실제로 enum입니다. –

+0

나는 적절한 구조가 열거 형이라고 말하지 않을 것이다. 이드는 상황에 전적으로 의존한다고 말한다. 특히 오류 코드가 문자열이라는 사실을 매우 분명하게 알았 기 때문에 일부 오류 코드에는 숫자가 아닌 문자가 포함되어있을 수 있습니다. –

답변

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; } 
} 
+0

이 예제가 정말 마음에 들었습니다. 유일한 것은 getError 메서드에 다른 조건을 추가 할 수 있는지 알고 싶습니다. 나는 같은 ERROR_CODE를 가지고 있지만 다른 위치에 있기 때문에 위치를 지정해야합니다. 예 : ERROR_CODE : 001 on POSITION : 2에 설명이 있습니다. "잘못된 메시지 헤더" –

+1

getError에서 String을 반환하는 대신 실제 Error 객체를 반환 할 수 있습니다. 이렇게하면 다음과 같이 할 수 있습니다 : 'Error error = Error.getError ("001")' 'System.out.println ("code :"+ error.getCode() + "position :"+ error. getPosition() + "설명 :"+ error.getDescription(); ' 내 대답을 업데이트했습니다. – munyengm

0
enum ErrorCode{ 
001,002 
} 

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

Map<ErrorCode, List<ErrorWrapper>>

1

사용에게 java.util.Map 구현 (HashMap의)가 있습니다. 오류 코드를 키 및 설명으로 값으로 사용하십시오. 당신이 당신의 오류 코드는 문자열과 설명은 또한 문자열 언급 이후

0

은 그냥

HashMap<String, String> 

를 사용합니다.

2

당신은 열거를 사용하여 구조를 구축 할 수 있습니다 :

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 문에 enum 값을 사용할 수 있습니다. 모든

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 

나는이

+0

오류는 코드와 별개로 거의 추가되지 않습니다. 제 의견으로는 코드 밖에서 선언하는 것은 의미가 없습니다. 국제화 된 오류 메시지 (있는 경우) 만 특성에서 선언해야합니다. –

+0

오류 코드는 대부분 코드에 따라 다르지만 대부분의 경우 오류 설명이 없습니다 –

0

을; 테스트 코드가 포함되어 있습니다. 기본 패키지에 클래스 Main을 만들고 코드를 복사하여 실행하십시오.당신은 코드 오류 메시지를 얻을 수있는 수준의 오류에서 방법은 GetError (문자열 코드)를 사용할 수 있습니다 :

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; 
     } 
    } 
} 
0

자바 enum이 문제에 적합하다. 새로운 오류 코드를 추가하거나 기존 코드를 수정하는 측면에서 약간 더 유연한 또 다른 접근법을 생각해 볼 수 있습니다.

    • 000-1 = 아니오 오류를 다음과 같이 항목과 속성 파일을 만듭니다
    • 001-1 = 연결 오류
  1. 번들 배포됩니다 항아리에이 파일 개발자에게.
  2. 클래스를 만들고 jar 내에서이 파일을 읽을 코드를 넣고이 이름 값 쌍의 Map (또는 HashMap)을 만듭니다.
  3. 이 코드를 정적 블록에 넣으면 HashMap이 모멘트 클래스가로드 될 때 초기화됩니다.
  4. getError(ERROR_CODE) 메서드는 단순히 -1을 입력 오류 코드에 추가하고이 Map에 쿼리하고 적절한 오류 메시지를 반환합니다.
  5. 새 메시지를 추가하거나 기존 메시지를 수정하는 경우 등록 정보 파일의 내용을 변경하기 만하면됩니다. 코드를 변경할 필요가 없습니다.