枚举中的错误与静态初始化程序

时间:2012-08-05 13:23:07

标签: java enums

我目前正在开发一个项目(数据库实现),涉及一个名为ElementType的枚举类,其内部枚举名为TypeType。在ElementType内,HashMap<TypeType, ArrayList<ElementType>>将所有ElementType映射到相应的TypeType值。

TypeType的值为

[TEXT, NUMERIC_EXACT, NUMERIC_APPROX, OTHER]

ElementType(及其对应的TypeType)的值为

[CHARACTER(TEXT), CHAR(TEXT), DECIMAL(NUMBER_EXACT), DEC(NUMBER_EXACT), NUMERIC(NUMERIC_EXACT), INTEGER(NUMERIC_EXACT), INT(NUMERIC_EXACT), SMALLINT(NUMERIC_EXACT), FLAT(NUMERIC_APPROX), REAL(NUMERIC_EXACT), DOUBLE_PRECISION(NUMERIC_APPROX), DOUBLE(NUMERIC_APPROX), DATE(OTHER), TIME(OTHER), VARCHAR(OTHER), LONG_VARCHAR(OTHER)]

static {}区域,我有这段代码:

for(ElementType eType : values()) {
    TypeType t = eType.getTYPE();
    if(typeMapping.get(t) != null)
        typeMapping.get(t).add(eType);
    else
        typeMapping.put(t, new ArrayList<ElementType>() {add(eType);});
}

for循环中的所有eType提及都在Eclipse中用红色加下划线。

第一个给出错误eType cannot be resolved

第二个给出eType cannot be resolved to a variable

第三个(ArrayList内)给出了Syntax error on token "eType", VariableDeclaratorId expected after this token

getTYPE()方法是私有的,并返回每个ElementType的TypeType。 typeMapping是上面提到的HashMap。

我不知道造成这种情况的原因或解决方法是什么,有谁知道如何解决这个问题,或者我能做些什么?

2 个答案:

答案 0 :(得分:5)

问题在于:

typeMapping.put(t, new ArrayList<ElementType>() {add(eType);});
                                                ^^^^^^^^^^^^^  

您尝试在静态初始化程序块中创建从ArrayList派生的内部非静态类。如果将其替换为普通new ArrayListalist.add(eType),则可以使用。

您可以使用:

typeMapping.put(t, new ArrayList<ElementType>() {{add(eType);}});

注1:必须有两个开启和关闭大括号。因此终点"double brace initialization"

注意2:对于DBI,您必须在循环中设置eType final

虽然我不得不承认,错误消息 ahem 有点不清楚。

答案 1 :(得分:4)

这是一个编译和工作的例子`Java HotSpot 1.6.0_21':

import java.util.*;

public enum ElementType {

    CHARACTER(TypeType.TEXT), CHAR(TypeType.TEXT), DEC(TypeType.NUMERIC_EXACT);

    public static enum TypeType {
        TEXT, NUMERIC_EXACT;
    }

    private TypeType type;

    private ElementType(TypeType type) {
        this.type = type;
    }

    private static Map<TypeType, List<ElementType>> typeMapping;

    static {
        typeMapping = new HashMap<TypeType, List<ElementType>>();
        for (ElementType eType : values()) {
            TypeType t = eType.type;
            if (!typeMapping.containsKey(t)) {
                typeMapping.put(t, new ArrayList<ElementType>());
            }
            typeMapping.get(t).add(eType);
        }

    }

    public static void main(String[] args) {
        System.out.println(typeMapping);
    }
}

它对你有用吗?