这个未定义的方法/集合在这个静态初始化程序中做了什么?

时间:2015-01-26 10:12:25

标签: java static initialization

我试图了解ZXing's CharacterSetECI.java在静态初始化程序中的作用

具体来说,我不知道这是怎么回事:

private static final Map<Integer,CharacterSetECI> VALUE_TO_ECI = new HashMap<>();
private static final Map<String,CharacterSetECI> NAME_TO_ECI = new HashMap<>();

static {
  for (CharacterSetECI eci : values()) {
    for (int value : eci.values) {
      VALUE_TO_ECI.put(value, eci);
    }
    NAME_TO_ECI.put(eci.name(), eci);
    for (String name : eci.otherEncodingNames) {
      NAME_TO_ECI.put(name, eci);
    }
  }
}

private final int[] values;

注意在第一个foreach中使用 values(),方法values()未在类中的任何位置定义。最接近它的是它下面定义的 int数组值,但我认为我们可以同意它肯定不包含CharacterSetECI类型的对象。

当我尝试在新类中仅键入此代码片段(创建构造函数,最终实例变量数组和静态初始化程序)时,Eclipse会抱怨values()未定义,但是当我将整个代码复制到在新类中,Eclipse只是抱怨一些类型无法解析但是values()得到了一个传递。我尝试按住Ctrl键并单击值()以查看其引用的内容但它无法点击。

注意

如果您不信任链接,则此类可在ZXing的3.1.0版源代码中找到,可在mavencentral中的com.google.zxing.common包中找到。

1 个答案:

答案 0 :(得分:5)

每个enum都有一个隐式values方法;来自JLS §8.9.3

  

枚举类型E的成员全部如下:

     
      
  • ...

  •   
  • 以下隐式声明的方法:

    /**
    * Returns an array containing the constants of this enum 
    * type, in the order they're declared.  This method may be
    * used to iterate over the constants as follows:
    *
    *    for(E c : E.values())
    *        System.out.println(c);
    *
    * @return an array containing the constants of this enum 
    * type, in the order they're declared
    */
    public static E[] values();
    
  •