这个 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();
我正在尝试了解 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();