java—从静态Map的枚举构造函数生成枚举Map

rhfm7lfc  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(338)

好吧,现在我有了我的Map,但它无论如何都不起作用。比如,当我试着这么做的时候:

Status inStatus = Enum.valueOf(Status, ENUM_MAP.get(02));

结果是空的:
是的。
我在java工作,基本上,现在我有:

private static final HashMap<Integer,Status> ENUM_MAP = 
                    new HashMap<Integer,Status>();
...
ENUM_MAP.put(0, Status.A);
ENUM_MAP.put(1, Status.B);
ENUM_MAP.put(2, Status.C);

而且很有效。但我想要我的 enum 在内部这样做,但不起作用。

public static enum Status{
    A(0),B(1),C(2);
    protected static final HashMap<Integer,Status> ENUM_MAP =
                    new HashMap<Integer,Status>();
    private final Integer state;
    private Status(Integer state){
        this.state = state;
        ENUM_MAP.put(this.state,**this**);
    }
}

这就是我想弄明白的,这样我就不用写了,而且它可以很容易地由enum构建。注意,我不希望state是公共的,我也不知道如何从序数整数到名称的字符串版本(如果有办法的话,这会使事情简单化。)
编辑:
这似乎是最好的工作,只有两个额外的行(虽然我的编译器告诉我它是泄漏的),它保持我的Map作为私人,因为我想它。

private static final Map<Integer,Status> ENUM_MAP=new HashMap<>();

    public static enum Status{
        A(0),B(1),C(2);
        private final Integer state;
        private Status(Integer state){
            this.state=state;
            ENUM_MAP.put(this.state, this);
        }//end private Status(int state)
rekjcdws

rekjcdws1#

可以使用静态块:

public enum Status{
    A(0),B(1),C(2);
    protected static final HashMap<Integer,Status> ENUM_MAP =
                    new HashMap<Integer,Status>();

    static {
      for(Status status : Status.values()) {
        ENUM_MAP.put(status.state, status);
      }
    }
    private final Integer state;
    private Status(Integer state){
        this.state = state;
    }
}
avwztpqn

avwztpqn2#

可以使用内部类保存静态Map:

public static class Holder {
    static Map<Integer, Status> statusMap = new HashMap<>();
}
private Status(Integer state){
    this.state = state;
    Holder.statusMap.put(state, this);
}
public static Status byState(Integer state) {
    return Holder.statusMap.get(state;
}

我不想州是公开的-如果州是你Map的关键,你可能会发送州,所以我不理解你的评论

wz8daaqr

wz8daaqr3#

您可以在搜索值时根据需要填充Map。不能在构造函数中将值添加到Map中。
下面是您可以做的事情(无论如何,您必须使查找方法可用):

public static enum Status {
    A(0), B(1), C(2);

    protected static final HashMap<Integer, Status> ENUM_MAP = 
            new HashMap<Integer, Status>();
    private final Integer state;

    private Status(Integer state) {
        this.state = state;
    }

    //finds a mapped value or maps one for the key
    public static Status find(int i) {
        if (ENUM_MAP.containsKey(i)) {
            return ENUM_MAP.get(i);
        }

        Status found = null;
        for (Status s : values()) {
            if (i == s.state) {
                found = s;
                ENUM_MAP.put(i, s);
                break;
            }
        }

        return found;
    }
}
lbsnaicq

lbsnaicq4#

枚举Map的这一行定义(尽管很长)是最终的且不可变的,如果您添加更多,它将包含所有状态值。作为公共成员共享是安全的-不允许进行后续更改,因为声明使用 Map.copyOf() :

public enum Status{
    A(0),B(1),C(2);
    private final Integer state;
    private Status(Integer state){
        this.state=state;
    }
    public static final Map<Integer,Status> ENUM_MAP = 
        Map.copyOf(Arrays.stream(values())
                         .collect(Collectors.toMap(st -> st.state, st -> st)));

枚举Map的值由所有枚举值按键状态初始化为枚举的值。
这个示例程序演示如何按状态或名称查找枚举值-包括 Status.valueOf(String) :

public static void main(String[] args)
{
    System.out.println("ENUM_MAP="+Status.ENUM_MAP);
    System.out.println("ENUM_MAP.get(1)="+Status.ENUM_MAP.get(1));
    System.out.println("ENUM_MAP.get(5)="+Status.ENUM_MAP.get(5));

    System.out.println("Status.valueOf(\"A\")="+Status.valueOf("A"));
    System.out.println("Enum.valueOf(Status.class, \"A\")="+Enum.valueOf(Status.class, "A"));

    // Next line fails (as expected) as ENUM_MAP cannot be changed
    Status.ENUM_MAP.put(10, Status.C);
}

这张照片:

ENUM_MAP={0=A, 1=B, 2=C}
ENUM_MAP.get(1)=B
ENUM_MAP.get(5)=null
Status.valueOf("A")=A
Enum.valueOf(Status.class, "A")=A
Exception in thread "main" java.lang.UnsupportedOperationException

电话 Status.valueOf("A") 与相同 Enum.valueOf(Status.class, "A") .

相关问题