[英]Java 1.5 Enum: Why can't I use 'findBy' with 1.5 enums?
鑒於以下代碼,
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認為任一映射都為null。 但為什么??
我還能如何實現枚舉的查找器? 我寧願不使用java.util.EnumMap類,主要是因為我想更好地理解枚舉的內部工作。
謝謝
將枚舉常量視為Java類的公共靜態最終成員。 像所有靜態成員一樣,它們按源順序初始化。 因此,常量是在映射之前初始化的,因此在構造函數中引用映射時,您將獲得null指針異常,因為映射尚未初始化。
盡管使用Java語法無法實現,但簡單的解決方案是在枚舉之前聲明映射-但這是不可能的,因此,下一個最好的事情就是在常量之后的靜態塊中初始化映射:例如
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;
...
}
在靜態枚舉其余枚舉之前構造實例。 如果地圖為null,則使用“ getter”構建地圖。
因為這都是在enum類的靜態初始化內發生的,所以它本質上是線程安全的-您不必使用syncyize塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.