我试图了解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包中找到。
答案 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();