gpt4 book ai didi

Java 1.5 枚举 : Why can't I use 'findBy' with 1. 5 个枚举?

转载 作者:行者123 更新时间:2023-12-01 16:37:31 24 4
gpt4 key购买 nike

鉴于下面的代码,

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

public enum SearchDataTypes {

FIELD_DATATYPE_TEXT(String.class,"_t"),
FIELD_DATATYPE_INT(Integer.class,"_i"),
FIELD_DATATYPE_LONG(Long.class,"_l"),
FIELD_DATATYPE_FLOAT(Float.class,"_f"),
FIELD_DATATYPE_DOUBLE(Double.class, "_d" ),
FIELD_DATATYPE_DATE(Date.class,"_dt");

SearchDataTypes(final Class<?> clazz, final String affix) {
this.affix = affix;
this.clazz = clazz;
getAffixMap().put(affix, this);
getClassMap().put(clazz, this);
}

public String getFieldName(String objectFieldName) {
return objectFieldName+affix;
}

public String getObjectFieldName(String FieldName) {
int len = FieldName.length();
len -= this.affix.length();
return FieldName.substring(0, len);
}
public static SearchDataTypes findByAffix(String affix) {
SearchDataTypes obj = getAffixMap().get(affix);
assert obj != null;
return obj;
}

public static SearchDataTypes findByClass(Class<?> clazz) {
SearchDataTypes obj = getClassMap().get(clazz);
assert obj != null;
return obj;
}

private String affix;
private Class<?> clazz;

private static Map<Class<?>, SearchDataTypes> classMap = new HashMap<Class<?>, SearchDataTypes>();
private static Map<String, SearchDataTypes> affixMap = new HashMap<String, SearchDataTypes>();

private static Map<Class<?>, SearchDataTypes> getClassMap() { return classMap; }
private static Map<String, SearchDataTypes> getAffixMap() { return affixMap; }


}

枚举类没有被实例化(使用枚举会抛出NoClassDefFoundError),因为初始化期间出现NullPointerException。我假设 JVM 认为任一映射为空。但为什么??

我还能如何实现枚举查找器?我不喜欢使用 java.util.EnumMap 类,主要是因为我想更好地理解枚举的内部工作原理。

谢谢

最佳答案

将枚举常量视为 Java 类的公共(public)静态最终成员。与所有静态成员一样,它们按源代码顺序初始化。因此常量是在映射之前初始化的,因此在构造函数中引用映射时会出现空指针异常,因为映射尚未初始化。

尽管使用 java 语法不可能,但简单的解决方案是在枚举之前声明映射 - 但由于这是不可能的,所以下一个最好的办法就是在常量之后的静态 block 中初始化映射:例如

public enum SearchDataTypes {
...
FIELD_DATATYPE_DATE(Date.class,"_dt");

private static final Map<String,SearchDataTypes> affixMap = new HashMap<String,SearchDataType>();
private static final Map<Class<?>, SearchDataTypes> classMap = new HashMap<Class<?>, SearchDataTypes>()
static {
for (SearchDataType value : values()) {
map.put(value.affix, value);
map.put(value.clazz, value);
}
}

SearchDataTypes(final Class<?> clazz, final String affix) {
this.affix = affix;
...
}

关于Java 1.5 枚举 : Why can't I use 'findBy' with 1. 5 个枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com