环境: JDK8+kotlin 1.1.0
构建工具:Maven 3
项目中有一个定义报警类型的enum类最开始使用java编写, 后来改成了kotlin. IDE和编译都没有提示错误, 运行时却发现错误.ClassNotFoundException, Could not initialize class.
原来是kotlin使用companion代替static, 而enum类是在类初始化时就初始化实例, 如果在enum实例中引入到了companion object中的字段, ide和编译器都不会提示错误, 但是运行那么就会导致enum类初始化失败. 因为初始化实例时, companion object还没有初始化. 引用其字段, 导致NPE, 类初始化失败, 导致ClassNotFoundException, Could not initialize class.
Java代码
public enum AlarmType {
MEMORY("memory", AlarmType.CONTAINER_TYPE, true),
CPU("cpu", AlarmType.CONTAINER_TYPE, true);
public static final int DEFAULT_TYPE = 0;
public static final int CONTAINER_TYPE = 1;
public static final int DOCKER_DAEMON_TYPE = 2;
public static final i