目錄
多例與枚舉
多例設計模式:構造方法私有化,內部提供有若干個實例化對象,通過static方法返回
例:設計一個描述顏色基色的多例類
class Color {
private static final Color RED = new Color("RED");
private static final Color GREEN = new Color("GREEN");
private static final Color BLUE = new Color("BLUE");
private String title;
private Color(String title) { //構造方法私有化
this.title = title;
}
public static Color getInstance(int ch) {
switch(ch) {
case 0:
return RED;
case 1:
return GREEN;
case 2:
return BLUE;
default:
return null;
}
}
public String toString() {
return this.title;
}
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(Color.getInstance(0));
}
}
這是JDK1.5之前的做法,目的是限制本類實例化對象的產生個數。但是從JDK1.5開始有了枚舉, 以上代碼基於枚舉開發編寫如下:
enum Color {
RED,GREEN,BLUE;
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(Color.RED);
}
}
輸出結果和上面的多例代碼一致,都輸出RED。
從中可以看出,所謂枚舉就是一種高級的多例設計模式。
Enum類
關鍵字定義的JDK1.5提供了enum關鍵字,但是enum並不是一種新的結構,相反它只是對一種類型的包裝:使用enum關鍵字定義的枚舉類本質上 就相當於一個class定義的類繼承了java.lang.Enum父類。
Enum類中有以下方法:
- 構造方法:protected Enum(String name, int ordinal)
當定義枚舉類中的對象時自動設置序號和名字
- 取得枚舉名字:public final String name()
- 取得枚舉序號:public final int ordinal()
例:觀察方法的使用
enum Color {
RED,GREEN,BLUE
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(Color.RED.ordinal() + "=" + Color.RED.name());
}
}
輸出結果:0=RED
如果調用enum中的順序爲:
enum Color {
GREEN,RED,BLUE
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(Color.RED.ordinal() + "=" + Color.RED.name());
}
}
輸出結果爲:1=RED
Enum中還有方法可以取得所有的枚舉數據:values()返回的是一個枚舉的對象數組。
例:取得所有的枚舉數據
enum Color {
GREEN,RED,BLUE
}
public class TestDemo {
public static void main(String[] args) {
for(Color temp: Color.values()) {
System.out.println(temp.ordinal() + "=" + temp.name());
}
}
}
輸出結果:
0=GREEN
1=RED
2=BLUE
面試題:請解釋enum和Enum的區別
- enum是一個關鍵字,使用enum定義的枚舉類本質上就相當於一個類繼承了Enum這個抽象類
枚舉中定義其他結構
多例是在類中產生的,其中可定義方法,考慮到這個因素,設計了枚舉方案:可以在枚舉裏定義屬性、方法等。
enum Color {
//因爲沒有無參構造函數
RED("紅色"),GREEN("綠色"),BLUE("藍色"); //如果定義有很多內容,枚舉對象必須寫在第一行
private String title;
private Color(String title) { //構造方法絕對不能夠使用public
this.title = title;
}
public String toString() { //覆寫Object中的方法
return this.title;
}
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(Color.RED);
}
}
輸出結果爲:紅色
枚舉本身還可以實現接口,這樣枚舉中的每一個對象實際上就都變爲了接口對象。
例:讓枚舉實現接口
interface IColor{
public String getColor();
}
enum Color implements IColor{ //實現了IColor接口
//因爲沒有無參構造函數
RED("紅色"),GREEN("綠色"),BLUE("藍色"); //如果定義有很多內容,枚舉對象必須寫在第一行
private String title;
private Color(String title) { //構造方法絕對不能夠使用public
this.title = title;
}
public String toString() { //覆寫Object中的方法
return this.title;
}
@Override
public String getColor() {
return this.title;
}
}
public class TestDemo {
public static void main(String[] args) {
IColor ic = Color.GREEN;
System.out.println(ic.getColor() );
}
}
輸出結果爲:綠色
這些只能說是枚舉的擴展特點,其他語言裏的枚舉沒這麼高級。
枚舉應用
枚舉最大的特點是隻有指定的幾個對象可以使用。枚舉還支持switch:
enum Sex {
MALE,FEMALE;
}
public class TestDemo {
public static void main(String[] args) {
switch(Sex.MALE) {
case MALE: //不能寫成Sex.MALE
System.out.println("是男人");
break;
case FEMALE:
System.out.println("是女人");
break;
}
}
}