NuCradle
NuCradle

Reputation: 705

Is It Safe to Put a Java Enum in a Static Map During Its Construction Call?

As the title reads, I have the following Enum:

public enum MyEnum {

  FIRST_ENUM("first enum"),
  SECOND_ENUM("second enum"),
  THIRD_ENUM("third enum"),
  FORTH_ENUM("forth enum");

  private final String param;

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

  MyEnum(String param) {
    this.param = param;
    Mapper.MAP.put(param, this); // Is this going to be a problem?
  }

  public static MyEnum MyEnum(String value) {
    return Holder.MAP.get(value);
  }

}

I would like to know if putting an enum that its instantiation/construction hasn't been completed could possibly cause an issue?

Upvotes: 1

Views: 10023

Answers (2)

Abhishek Garg
Abhishek Garg

Reputation: 2288

You don't need to create a separate Mapper class. We use something similar for our use case also.

public enum MyEnum {

    FIRST_ENUM("first enum"),
    SECOND_ENUM("second enum"),
    THIRD_ENUM("third enum"),
    FORTH_ENUM("forth enum");

    private final String param;
    private static final Map<String, MyEnum> MAP = new HashMap<>();
    static {

        for (final MyEnum myEnum : MyEnum.values()) {
            MAP.put(myEnum.param, myEnum);
        }
    }

    MyEnum(String param) {
        this.param = param;
    }

    @JsonCreator
    public static MyEnum myEnumMapper(String value) {
        return MAP.get(value);
    }

}

Upvotes: 2

Ray Tayek
Ray Tayek

Reputation: 10003

build map at runtime:

public enum MyEnum {
    FIRST_ENUM("first enum"),SECOND_ENUM("second enum"),THIRD_ENUM("third enum"),FORTH_ENUM("forth enum");
    private final String param;
    MyEnum(String param) {
        this.param=param;
    }
    static void build() {
        for(MyEnum myEnum:MyEnum.values())
            map.put(myEnum.param,myEnum);
    }
    public static void main(String[] arguments) {
        MyEnum.build();
        System.out.println(map);
    }
    private static Map<String,MyEnum> map=new HashMap<>();
}

Upvotes: 0

Related Questions