之前它是
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)
答案 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
/ Integer
或enum
或类似内容。
编辑:关于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());
}
}