c enum能像java一样吗_不一样的Java Enum
Emum是在Java5中引入的新特性,從那開始,它被廣泛的用在不同的Java應用中,相比于C和C++的Enum,Java的Enum功能更加強大。但是很多開發人員暫時還沒意識到它的強大之處,在Enum的一些細節問題上把握的還不到位。Enum的特性及相關資料可以整理出一本書也不為過,這里簡單對Enum做個大概。主要講解以下幾個方面。
Enum的介紹
Enum的特性
Enum的用法
Enum的一些面試題
Enum用法建議
什么是Enum
Enum是一個Java的關鍵字,用于表示一個固定的常用值。例如,每周的天數,每年的月數等。Enum是一種類型,就像Class和Interface可以用于定義一系列的Enum常量
Enum的特性
Enum常量隱式的加上了static和final,一旦被創建就無法修改
Enum提供了是類型安全的(type-safe)
Enum隱式的加上了values()方法,返回一個數組包含所有的Enum常量
兩個Enum常量可以使用 ==或equals()方法比較
Enum可以用在switch語句中,就像int,String。
Enum有自己的名稱空間
Enum可以實現Java接口
可以在Enum中定義構造器
Enum的用法
1 . Enum的聲明,Enum可以聲明在一個類之外或者在類內部,但是不能在方法中。
// 外部聲明Enum
enum Color {
RED,GREEN,BLUE;
}
public class Test
{
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
//內部聲明Enum
public class Test
{
enum Color
{
RED, GREEN, BLUE;
}
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
2 . 在創建Enum常量的時候可以指定值,但是這個時候你需要定義一個成員變量構造器。構造器必須是private的,不然會報編譯錯誤。
public enum Currency {
PENNY(1), NICKLE(5), DIME(10), QUARTER(25);
private int value;
private Currency(int value) {
this.value = value;
}
}
3 . 使用==或equals比較兩個enum
因為enum對象都是繼承自Enum類的,可以看到Enum中的equals方法為。
建議使用==方法,直接比較應該比調用方法的速度更快一些。另外==號還能防止NullPointerException
public final boolean equals(Object other) {
return this==other;
}
4 . 對Enum進行排序的時候,使用compareTo方法。
public final int compareTo(E o) {
Enum> other = (Enum>)o;
Enum self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
5 .有兩個新的集合類EnumMap和EnumSet ,他們兩個是對Set和Map的高性能實現,當有機會使用它們的時候,盡量使用它們。
Enum面試問題
說說Enum的繼承
所有的enums隱式的extend了java.lang.Enum類,因為一個類只能extend一個父親,所以enum不能extend其它的類。
但是Enum可以實現許多接口
Enum的values,ordinal,valueOf方法
enums默認有values(),ordinal()和valueOf()方法。
values()方法返回所有在enum中定義的常量值,以數組形式返回。
ordinal()方法返回每個常量的索引下標,就像數組的下標
valueOf()方法傳入字符串參數,如果enum中存在對應字符串的常量值,則返回對應的enum常量
// 案例代碼
enum Color
{
RED, GREEN, BLUE;
}
public class EnumLearn
{
public static void main(String[] args)
{
Color arr[] = Color.values();
for (Color col : arr)
{
System.out.println(col + " at index "
+ col.ordinal());
}
System.out.println(Color.valueOf("RED"));
}
}
//輸出
RED at index 0
GREEN at index 1
BLUE at index 2
RED
3 . Enum的構造器特性
enum可以有構造器方法,它的構造器方法會在enum類型加載的時候,按常量的個數順序的執行
我們不能直接創建enum對象,因此我們也不能直接調用enum的構造器方法,構造器方法必須是private的
//案例代碼
enum AccountType implements Serializable,Cloneable
{
SAVING, FIXED, CURRENT;
private AccountType()
{
System.out.println("It is a account type");
}
}
class EnumOne
{
public static void main(String[]args)
{
System.out.println(AccountType.FIXED);
}
}
//輸出結果
It is a account type
It is a account type
It is a account type
FIXED
4 . Enum的單例模式優缺點
參考《Effitive Java》,優點大于缺點,因為enum是線程安全的,因此我們無需考慮單例模式的雙重檢查。主要原因:
enum的單例模式簡單
enum是線程安全的
enum的單例模式自己處理序列化 *
// Enum的單例模式 VS 傳統雙重檢查的單例模式
//單例模式,僅需使用一行代碼.
// EasySingleton.INSTANCE,enum中也可以寫其他方法
public enum EasySingleton{
INSTANCE;
}
//傳統模式
public class DoubleCheckedLockingSingleton{
private volatile DoubleCheckedLockingSingleton INSTANCE;
private DoubleCheckedLockingSingleton(){}
public DoubleCheckedLockingSingleton getInstance(){
if(INSTANCE == null){
synchronized(DoubleCheckedLockingSingleton.class){
// 二次檢查
if(INSTANCE == null){
INSTANCE = new DoubleCheckedLockingSingleton();
}
}
}
return INSTANCE;
}
}
5 . Enum的==和equals的區別。
前面有提到。
6 . 我們能使用構造方法創建enum實例嗎?
不能,enum的構造方法必須是私有的。
Enum的用法建議
在能想到使用Enum的時候可以考慮使用Enum。
使用Enum代替定義的相關int類型常量
能用到EnumSet和EnumMap的時候使用它們,后面會再說明它們兩個的用法
最后
看一些Java相關的面試題,發現Enum相關問題出現頻率挺高的,在這里對enum用法做個整理。希望能幫助到大家
參考
總結
以上是生活随笔為你收集整理的c enum能像java一样吗_不一样的Java Enum的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html按钮分享功能实现,一个分享按钮的
- 下一篇: 数字图像处理基础与应用 第四章