枚舉基類Enum詳解


  本文主要是對枚舉類型的基類Enum類做一個介紹:

  首先,Enum類位於java.lang包下,根據類的介紹可以發現,Enum類是Java中所有枚舉類的父類,將枚舉作為一個set或者Map的keys來使用具有很高的效率。

  Enum類是一個抽象類,實現了Comparable和Serializable接口,在類中只有兩個成員變量name和ordinal,分別表示枚舉的名字和序號均為private,但是提供了兩個方法來返回這兩個字段分別是name()和ordinal();

  Enum類提供一個為一個構造方法,傳入兩個參數,分別是name和ordinal,並將這兩個值賦給類成員變量name和ordinal,但是這個構造方法是protected類型,程序員不能調用,就不詳細說了。

  Enum類具有所有類都具有的方法toString和hashCode和equals,這個toString()方法在這里返回類成員變量name的值。  

  接下來提供一個方法叫做clone(),這個方法沒有做任何操作,只是拋出一個異常CloneNotSupportedException,這個方法主要是為了防止枚舉類型被clone(設計模式中的拷貝模式),這樣做就可以保證枚舉是單例的。

  getDeclaringClass()方法用來返回一個枚舉常量所在枚舉類型的類對象,可以判斷兩個枚舉常量是否屬於同一個枚舉類e1.geDeclaringClass() == e2.getDeclaring.class();

  valueOf();這個方法的作用是:將枚舉e中名字為name的常量返回,比如

  public enum Color{

    RED,BLUE

  }

  public class Client{

    public void  client(){

      Color red = Color.valueOf("RED") 

    }

  }

  Enum類還提供了一個finalize()方法,這個方法沒有實現任何代碼,這個方法的作用是為了保證枚舉不會擁有finalize方法,finalize方法主要是為了在垃圾回收對象的時候做一些額外的清理工作,詳情請去看java的垃圾回收機制

  Enum類提供了readObject和readObjectNoData兩個方法,這兩個方法只拋出了異常,它的作用是為了防止枚舉類型被反序列化。

 

  為什么枚舉要禁止clone和禁止反序列化呢?

  因為枚舉是一個基於底層實現的一個單例模式,但是單例模式通常可以通過clone和反序列化來實現產生一個單例類多個不同的對象,在這里禁止clone和反序列化就能避免這種情況發生,詳情請看設計模式中的單例模式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM