一、枚舉類型
enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
枚舉類的常用方法
- name(); 返回enum實例聲明時的名字。
- ordinal(); 返回一個int值,表示enum實例在聲明的次序。
- equals(); 返回布爾值,enum實例判斷相等
- compareTo() 比較enum實例與指定對象的順序
- values(); 返回enum實例的數(shù)組
- valueOf(String name) 由名稱獲取枚舉類中定義的常量
枚舉類的真面目
用javap查看一個枚舉類的字節(jié)碼
Compiled from "Shrubbery.java"
public final class enumtest.Shrubbery extends java.lang.Enum<enumtest.Shrubbery> {
public static final enumtest.Shrubbery GROUND;
public static final enumtest.Shrubbery CRAWLING;
public static final enumtest.Shrubbery HANGING;
public static enumtest.Shrubbery[] values();
public static enumtest.Shrubbery valueOf(java.lang.String);
static {};
}
- Shrubbery枚舉變成了一個final修飾的類,也就是說,它不能被繼承啦。
- Shrubbery是java.lang.Enum的子類。
- Shrubbery定義的枚舉值都是public static final修飾的,即都是靜態(tài)常量。
- 當(dāng)一個Java類第一次被真正使用到的時候靜態(tài)資源被初始化、Java類的加載和初始化過程都是線程安全的。
向枚舉中添加新的方法
因為枚舉本質(zhì)上就是Enum的子類,所以可以給他添加任意的方法。
public enum OrderStatusEnum {
UNPAID(0, "未付款"), PAID(1, "已付款"), SENDED(2, "已發(fā)貨"), FINISH(3, "已完成"),;
//成員變量
private int index;
private String desc;
//get方法
public int getIndex() {
return index;
}
public String getDesc() {
return desc;
}
//構(gòu)造器方法
OrderStatusEnum(int index, String desc) {
this.index = index;
this.desc = desc;
}
//普通方法
public static OrderStatusEnum of(int index){
for (OrderStatusEnum temp : values()) {
if (temp.getIndex() == index) {
return temp;
}
}
return null;
}
}
枚舉實現(xiàn)接口
所有枚舉類都繼承于java.lang.Enum,所以枚舉不能再繼承其他類了。但是枚舉可以實現(xiàn)接口
public interface ISeasonBehaviour {
void showSeasonBeauty();
String getSeasonName();
}
public enum SeasonEnum implements ISeasonBehaviour {
SPRING(1,"春天"),SUMMER(2,"夏天"),FALL(3,"秋天"),WINTER(4,"冬天"),
;
private int index;
private String name;
SeasonEnum(int index, String name) {
this.index = index;
this.name = name;
}
public int getIndex() {
return index;
}
public String getName() {
return name;
}
//接口方法
@Override
public void showSeasonBeauty() {
System.out.println("welcome to " + this.name);
}
//接口方法
@Override
public String getSeasonName() {
return this.name;
}
}
枚舉類比較是用==還是equals
不管用==還是equals,都是可以的。其實枚舉的equals方法,就是用==比較的.
枚舉實現(xiàn)的單例
- 枚舉單例寫法簡單
- 枚舉可解決線程安全問題
- 枚舉可解決反序列化會破壞單例的問題
public class SingletonEnumTest {
public enum SingletonEnum {
INSTANCE,;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) {
SingletonEnum.INSTANCE.setName("jay@huaxiao");
System.out.println(SingletonEnum.INSTANCE.getName());
}
}