Java枚举问题

时间:2015-12-29 00:40:58

标签: java enums

我有一个下面的程序,我的枚举值为“2”,但它没有按照预期的方式工作。任何帮助将不胜感激。

package com.deepak.streams;

import com.google.common.collect.ImmutableMap;

import java.util.HashMap;
import java.util.Map;

public class Demo2 {

public static void main(String[] args) {
    if (Scores.scoreMap.containsKey("2")) {
        System.out.println("Contains Value");
    } else {
        System.out.println("Does not contains Value");
    }
}

public enum Scores {

    PASS(1), FAIL(2), MATRIC(3), PROMOTED(4);

    private Integer alias;
    private static final Map<Object, Scores> scoreMap;

    Scores(Integer iAlias) {
        alias = iAlias;
    }

    static {
        final Map<Object, Scores> tmpMap = new HashMap<Object, Scores>();
        for(final Scores scores : Scores.values()) {
            tmpMap.put(scores.alias, scores);
            tmpMap.put(scores.name(), scores);
        }
        scoreMap = ImmutableMap.copyOf(tmpMap);
    }

    public Integer getAlias() {
        return alias;
    }

    public static Scores getStudentScoreEnum(Integer intVal) {
        return getScores(intVal);
    }

    public static Scores getStudentScoreEnum(String strVal) {
        return getScores(strVal);
    }

    private static Scores getScores(Object objVal) {
        if(null != objVal && !scoreMap.containsKey(objVal)) {
            throw new IllegalArgumentException("Unknown Value: " + objVal);
        }
        return scoreMap.get(objVal);
    }
}

}

2 个答案:

答案 0 :(得分:3)

您的地图密钥是Object

    final Map<Object, Scores> tmpMap = new HashMap<Object, Scores>();

这意味着它可以是任何Java Object。当您使用put两次时:

    tmpMap.put(scores.alias, scores);
    tmpMap.put(scores.name(), scores);

您的地图现在将包含两个新密钥。第一个是Integer,因为参数scores.aliasInteger。第二个是String

当您在"2"上执行查找时,它找不到Integer密钥,因为"2"String"2".equals(x)任何false不是x的{​​{1}}是String。简而言之,字符串"2"不等于Integer 2。

如果您确实想要使用整数的String表示来查找键,那么在添加到地图时,您需要使用String作为键。那就是:

tmpMap.put(scores.alias.toString(), scores); 

最好的办法是将地图声明为String键,而不是Object,以便在编译时捕获这样的问题 - 除非你真的希望能够使用IntegerString值来进行查找。

答案 1 :(得分:0)

您的地图包含整数2的绑定,而不是字符串"2"。名称映射将为"MATRIC" -> enumValue