Java 从静态映射的枚举构造函数生成枚举映射

Java 从静态映射的枚举构造函数生成枚举映射,java,enums,hashmap,Java,Enums,Hashmap,好的,现在我有了我的枚举图,但它无论如何都不起作用。比如,当我尝试这样做时: Status inStatus = Enum.valueOf(Status, ENUM_MAP.get(02)); 它最终是空的:\ 叶寿 我在Java中工作,基本上,现在我有: private static final HashMap<Integer,Status> ENUM_MAP = new HashMap<Integer,St

好的,现在我有了我的枚举图,但它无论如何都不起作用。比如,当我尝试这样做时:

            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轻松地构建。注意,我不希望state是公共的,我不知道如何从序号整数转换为名称的字符串版本。(如果有办法的话,可以简化这一过程。)

编辑:

这似乎效果最好,只增加了2行(尽管我的编译器告诉我它有漏洞) 它让我的地图保持我想要的私密性

    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)
private static final Map ENUM_Map=new HashMap();
公共静态枚举状态{
A(0)、B(1)、C(2);
私有最终整数状态;
私有状态(整数状态){
这个状态=状态;
ENUM_MAP.put(this.state,this);
}//结束私有状态(int状态)

您可以使用内部类保存静态映射:

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;
}
公共静态类持有者{
静态映射statusMap=newHashMap();
}
私有状态(整数状态){
this.state=状态;
Holder.STATUSSMAP.put(状态,本);
}
按状态列出的公共静态状态(整数状态){
返回Holder.statusMap.get(状态;
}

我不希望状态是公共的-如果状态是映射的键,您可能会发送状态,因此我不理解您的评论

您可以在搜索值时按需填充映射。您不能在构造函数中将值添加到映射

以下是您可以做的事情(无论如何,您必须使查找方法可用):

公共静态枚举状态{
A(0)、B(1)、C(2);
受保护的静态最终哈希映射枚举映射=
新的HashMap();
私有最终整数状态;
私有状态(整数状态){
this.state=状态;
}
//查找键的映射值或映射一个值
公共静态状态查找(int i){
if(枚举映射容器(i)){
返回ENUM_MAP.get(i);
}
发现状态=空;
对于(状态s:values()){
如果(i==s.state){
发现=s;
枚举映射put(i,s);
打破
}
}
发现退货;
}
}

您可以使用静态块:

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;
    }
}
公共枚举状态{
A(0)、B(1)、C(2);
受保护的静态最终哈希映射枚举映射=
新的HashMap();
静止的{
对于(状态:Status.values()){
枚举映射放置(status.state,status);
}
}
私有最终整数状态;
私有状态(整数状态){
this.state=状态;
}
}
枚举映射的这一(尽管很长)单行定义是最终的且不可变的,如果您添加更多,它将包含所有状态值。作为公共成员共享是安全的-不允许进行后续更改,因为声明使用了
MAP.copyOf()

这张照片是:

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”)

的作用相同。您是否正在尝试从整数序号到其对应的枚举值进行内置转换?有什么不“简单”呢太长了,读不下去了?这个代码有什么讨厌的范围规则?TL;DR你可以这样做,但是你需要把地图初始化放进<代码>静态< /Cuff>块(并使用<代码>枚举,并在分配给常量之前将它包在<代码> unMudiababelpps/Cube >中。@ernest_k在本例中,从序号开始可以,但我也尝试从赋值开始(即,假设0,1,2是4,18,47)不过,我想知道如何做这两个选项,以供参考。@Sweeper,它实际上不允许您将
这个
放在那里。我希望分别是Status.A、Status.B和Status.C。@chrylis小心地选择了一些这样做的问题,但它们以enum为键,但我希望整数是k依我所知,EnumMap不喜欢这样。@Sweeper实际上允许我使用它,但由于种种原因,它不像以前那样使用。然后,当我试图在类外使用它时,它说它找不到包持有者。\@Procerapientie添加了
byState
方法我试图将它全部保密,你的回答帮助我合成了一个solution,如果你检查我的问题,我会根据你的反馈编辑它。哦,这对我来说开始有意义了。这是因为类开始时的代码执行,所以它使用私有构造函数生成自身的实例,然后再生成随机静态块中的内容吗?这可能会使我不需要生成说明是否要使用序号()。另一个问题是,如果它是在构造函数vs static块中完成的,那么它是发生在编译时还是执行时?它们发生在运行时。
static
关键字意味着这部分代码属于类本身,而不是它的实例。Enum实际上是类的特定类型。它的所有字段都可以写成
public static finalA=新状态(1);…
感谢您的澄清,在弄不清楚为什么可以像通用扩展枚举(大写)一样使用和枚举后,我开始了解这一点,现在一切都变得有意义了。我试图避免在类中公开任何内容,尽管这是一个有趣的选项。其他一些答案引导我找到了我需要的内容。@Procerapientie那么您需要在哪里解析映射?从enum类本身内部?是的,我希望唯一显示的内容是受保护的enuming,但我对我的决定很满意,使用静态块的另一个选项可以让它保持内部状态,但是让它属于它的所有者类效果更好。我肯定要读一些关于它到底在做什么的内容。
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;
    }
}
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)));
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