user2525419
user2525419

Reputation: 15

error code representation using enum in java

I have a bunch of error codes being returned to me by the server. Based on these error codes I need to write some logic for each error code. I don't want to place the plain error in my function. What is the best way to represent these error codes? I am using an enum for now,

 private enum LoginErrorCode{

   EMAIL_OR_PASSWORD_INCORRECT("101"),
   EMAIL_INCORRECT("102");

    private final String code;

    LoginErrorCode(String code){
      this.code=code;
    }

    public String getCode(){
      return code;
    }
  }

But I do not know how to handle it if I get an error code unknown to me. Please let me know.

Upvotes: 1

Views: 7631

Answers (2)

rgettman
rgettman

Reputation: 178293

The point of an enum is that there are no invalid values; invalid values do not exist. There can't be an LoginErrorCode.EMAIL_ERROR_DOES_NOT_EXIST value. You shouldn't have to deal with a non-existent value. That is what makes an enum the best representation, because you have a known set of values to represent.

EDIT

Since you need to translate the error code strings to your enum, include a Map of the error code Strings to your enum values:

public enum LoginErrorCode
{
    EMAIL_OR_PASSWORD_INCORRECT,
    EMAIL_INCORRECT;

    private static Map<String, LoginErrorCode> map;
    // static initializer
    static {
        map = new HashMap<String, LoginErrorCode>();
        map.put("101", EMAIL_OR_PASSWORD_INCORRECT);
        map.put("102", EMAIL_INCORRECT);
    }
    public static LoginErrorCode fromCode(String code)
    {
        return map.get(code);
    }
}

The fromCode method will return null on an invalid code.

Upvotes: 0

Wand Maker
Wand Maker

Reputation: 18762

Here is the solution using your Enum that I typically employ to deal with error codes as you have explained in your scenario:

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

public class EnumSample {

    public static enum LoginErrorCode {

        EMAIL_OR_PASSWORD_INCORRECT("101"), EMAIL_INCORRECT("102"), UNKNOWN_ERROR_CODE("---");

        private static Map<String, LoginErrorCode> codeToEnumMap;

        private final String code;

        LoginErrorCode(String code) {
            this.code = code;
        }

        public String getCode() {
            return code;
        }


        /**
         * Looks up enum based on code.  If code was not registered as enum, it returns UNKNOWN_ERROR_CODE
         * @param code
         * @return
         */
        public static LoginErrorCode fromCode(String code) {
            // Keep a hashmap of mapping between code and corresponding enum as a cache.  We need to initialize it only once
            if (codeToEnumMap == null) {
                codeToEnumMap = new HashMap<String, EnumSample.LoginErrorCode>();
                for (LoginErrorCode aEnum : LoginErrorCode.values()) {
                    codeToEnumMap.put(aEnum.getCode(), aEnum);
                }
            }

            LoginErrorCode enumForGivenCode = codeToEnumMap.get(code);
            if (enumForGivenCode == null) {
                enumForGivenCode = UNKNOWN_ERROR_CODE;
            }

            return enumForGivenCode;
        }
    }

    public static void main(String[] args) {

        System.out.println( LoginErrorCode.fromCode("101")); //Prints EMAIL_OR_PASSWORD_INCORRECT
        System.out.println( LoginErrorCode.fromCode("102")); //Prints EMAIL_INCORRECT
        System.out.println( LoginErrorCode.fromCode("999")); //Prints UNKWNOWN_ERROR_CODE
    }
}

Upvotes: 3

Related Questions