这个 undefined method/collection 在这个静态初始化器中做了什么?

What does this undefined method/collection do in this static initializer?

我正在尝试了解 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() 未在 class 中的任何位置定义。最接近它的是它下面定义的 int array values,但我想我们可以同意它肯定不包含 CharacterSetECI 类型对象。

当我试图在一个新的 class 中只输入这段代码时(创建一个构造函数、最终实例变量数组和静态初始值设定项),Eclipse 抱怨 values() 是未定义的,但是当我将整个代码复制到一个新的 class 中,Eclipse 只是抱怨一些类型无法解析,但 values() 得到了通过。我尝试按住 ctrl 并单击 values() 以查看它引用的内容,但它不可单击。

:

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

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

The members of an enum type E are all of the following:

  • ...

  • The following implicitly declared methods:

    /**
    * 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();