簡體   English   中英

Java 1.5枚舉:為什么不能對1.5枚舉使用'findBy'?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM