使用枚舉寥粹,而不用int 常量的原因有哪些兆沙?
- int 常量沒有type safety,表達力不強
- int 常量被編譯到客戶端飞傀,如果int常量發(fā)生變化,則客戶端代碼要重新編譯
- int 常量不便于打印诬烹,debug砸烦,不能以group形式迭代,不方便獲取int常量group的size
說說你對枚舉的理解
- 枚舉類是final類绞吁,不可繼承幢痘,不可創(chuàng)建實例,只有聲明的枚舉常量
- 枚舉類型是instance-controlled家破,它們是單例
- 枚舉提供編譯期類型安全
- 枚舉的常量values不會被編譯到客戶端颜说,所以添加或重新安排一個枚舉類型的常量,不需要重新編譯客戶端代碼
- 可以調(diào)用toString方法把枚舉轉換成可打印字符串
- 枚舉類型可以添加任意的 methods汰聋,fields 以及實現(xiàn)任意的接口
如果想獲取一個枚舉的int值门粪,該怎么辦?
- 不要調(diào)用ordinal()方法去獲取
- 通過使用私有實例域烹困,構造函數(shù)玄妈,以及公有方法來獲取
在枚舉中進行邏輯操作,不要使用位域,應盡量使用EnumSet
在枚舉中拟蜻,不要使用ordinals來索引數(shù)組的下標绎签,應盡量使用EnumMap
盡管你不能繼承一個枚舉類型,但你可以模仿它:寫一個接口酝锅,然后讓枚舉類實現(xiàn)該接口
如果你寫一個工具辜御,需要程序員給源代碼添加信息,請不要用字符串類型的名字模式屈张,而應該采用注釋Annotations擒权,應該優(yōu)先使用java預定義好的注釋類型
在覆蓋超類方法時,一定要用Override注釋符
用不包含方法宣稱的接口(即marker interfaces) 來定義types,比如java 中的 Serializable 接口
marker interfaces和marker annotations相比的優(yōu)勢有哪些阁谆?
- marker interfaces可以使用instances of
- marker interfaces 代碼可以編譯期進行檢查
- marker interfaces 可以更精準的控制標記的粒度
- 如果你的框架中大量使用annotations碳抄,那可以考慮使用marker annotations進行標記;或者 你打算不僅僅標記程序中的類和接口场绿,還用于標記其他元素剖效,可以考慮使用marker annotations進行標記