如何避免使用HashMap的实现类型

时间:2015-08-13 09:55:44

标签: java hashmap

之前它是

 public static final Map<BigInteger, String> CONTRACT_STATUS_LIST = new HashMap<BigInteger, String>()

更改后

public static final Map<BigInteger, String> CONTRACT_STATUS_LIST = new HashMap<BigInteger, String>(){{
    put(Constants.STATUS_CANCELLED, "Cancelled");
    put(Constants.STATUS_TERMINATED, "Terminated");
}};

获取错误消息:

Class definition changed (and this is unsupported)
Added elements: public static final java.util.Map com.Constants.CONTRACT_STATUS_LIST
Removed elements: public static final java.util.HashMap com.Constants.CONTRACT_STATUS_LIST
java.lang.RuntimeException: java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the schema (add/remove fields)

2 个答案:

答案 0 :(得分:1)

您似乎试图将某种默认值放入该静态地图中。

这应该在一个单独的静态初始化程序块中完成,放在字段初始化之后:

public static final Map<BigInteger, String> CONTRACT_STATUS_LIST = new HashMap<BigInteger, String>();

static {
    CONTRACT_STATUS_LIST.put(Constants.STATUS_CANCELLED, "Cancelled");
    CONTRACT_STATUS_LIST.put(Constants.STATUS_TERMINATED, "Terminated");
};

顺便说一句:您可能不希望将BigInteger用于任何类型的枚举键。当你想要的只是你Constants类中的十几个甚至几千个键实例中唯一的值时,这些对象是巨大的。首选int / Integerenum或类似内容。

编辑:关于BigInteger的足迹的旁边是基于jdk7并且在评论中受到挑战。我在jdk8u45中为整数范围值做了一个简单的基准测试,并找到了Integer与BigInteger足迹的因子3,这无疑是“巨大的”。尽管如此,在我看来,BigInteger只应该用于需要大数字算术的时候。相反,我总是尝试使用简单类型,包括String(在基准测试中,测试范围平均仍然比BigInteger少8个字节)。 (范围[0,100k [,整数~15B,长~30B,字符串~40B,BigInteger~48B)的平均值

答案 1 :(得分:0)

下面的代码工作正常:

public class Test {
    public static final Map<BigInteger, String> CONTRACT_STATUS_LIST = new HashMap<BigInteger, String>(){{
        put(BigInteger.ONE, "Cancelled");
        put(BigInteger.ZERO, "Terminated");
    }};

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