在Java中强制初始化枚举类型

Rya*_*chi 12 java enums enumeration

我试图找到一种方法来强制Java加载/初始化枚举类型(嵌套在包含静态Map的类中).

这对我很重要,因为枚举类型具有填充所述映射的构造函数,并且没有明确的方法来初始化此枚举,映射将保持为空.我试图使用Class.forName,但这似乎不起作用.

我想我可以创建一个枚举实例(并将其存储在其他集合或其他东西中),但我想知道是否有一种优雅的方法来做到这一点.

Pet*_*rey 10

引用类时会加载类.这适用于所有类.

您遇到的问题更可能是在任何静态块之前初始化Enum值.即你不能引用构造函数中静态块中的初始化.(通常在构造函数中初始化静态内容是一个坏主意)您需要在静态块中初始化Map,而不是构造函数.

尝试

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

public enum EnumTest { 
  FOO, BAR, BAZ; 

  private static final Map<String,EnumTest> map = new LinkedHashMap<String,EnumTest>(); 
  static { 
      for(EnumTest e : EnumTest.values())
        map.put(e.name(), e); 
  } 

  public static void main(String... args) { 
    System.out.println(EnumTest.map); 
  } 
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*t H 5

你不能把地图的初始化放在Enum类型的静态初始化器中吗?

public enum SomeEnum
{
    Member1, Member2, Member3 ...

    private static Map<K, SomeEnum> map = ...;
    static 
    {
        ...populate map...
    }
    ...
Run Code Online (Sandbox Code Playgroud)

编辑:问题似乎是Enum成员定义需要先来.我想我只是掩盖了这一点.我修复了这个例子.

  • +1 JLS 8.9中有一个很好的例子,在"enum Color"下http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.9 (2认同)