- 多例設計模式與枚舉
- 使用枚舉進行基本操作
多例設計模式與枚舉
多例設計模式一定是構造方法私有化,而後在類的內部產生若干個實例化對象。
範例:定義顏色基色的多例設計模式
class Color{
private static final Color RED = new Color("紅色");
private static final Color GREEN = new Color("綠色");
private static final Color BLUE = new Color("藍色");
private String title;
private Color(String title){
this.title = title;
}
public String toString(){
return this.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 class Hello{
public static void main(String args[]) {
Color c = Color.getInstance(1);
System.out.println(c);
}
}
麻煩,getInstance()方法沒有意義,內部到底有多少個實例化對象不清楚。因此JDK1.5之後有了一個新的關鍵字:enum,利用這個關鍵字就可以實現與多例相同的功能。
範例:枚舉
enum Color{
RED,GREEN,BLUE;
}
public class Hello{
public static void main(String args[]) {
Color c = Color.GREEN;
System.out.println(c);
}
}
多例是枚舉的設計來源,在多例設計模式之中,所有的對象一定都是static final定義的,那麼就必須使用大寫字母表示。在枚舉裏面最大的支持還在於可以實現所有枚舉對象的遍歷操作。
範例:枚舉的遍歷操作
enum Color{
RED,GREEN,BLUE;
}
public class Hello{
public static void main(String args[]) {
for(Color c:Color.values()){//values(),返回對象數組
System.out.println(c);
}
}
}
枚舉本身就是爲了解決多例設計模式。
java.lang.Enum
嚴格來講使用enum定義的枚舉類不屬於新的結構,因爲本質上就相當於一個類繼承了java.lang.Enum類的形式。觀察Enum類的定義形式:
public abstract class Enum<E extends Enum<E>> extends Object implements Comparable<E>,Serializable
而在Enum類中定義的構造方法:
protected Enum(String name, int ordinal)
只能夠在本包或不同包的子類纔可以調用,其實就是構造方法的封裝。但是在這個構造方法中要接收兩個參數:對象名字name、對象序號ordinal。
在Enum類中有兩個方法可以取得名字和序號:
- 取得名字:public final String name();
- 取得序號:public final int ordinal()。
enum Color{
RED,GREEN,BLUE;
}
public class Hello{
public static void main(String args[]) {
for(Color c:Color.values()){//values(),返回對象數組
System.out.println(c.name()+"-->"+c.ordinal());
}
}
}
枚舉中的序號都是根據枚舉對象的定義順序得來的。
面試題:請解釋Enum與enum的區別?
- enum是JDK1.5之後增加的一個關鍵字用於定義枚舉;
- java.lang.Enum是一個抽象類,使用enum定義的枚舉本質就相當於一個類繼承了Enum。
枚舉中定義其他結構
枚舉在Java中屬於一種特殊的類,可是類中的組成是很豐富的:屬性、方法、構造方法、實現接口、繼承抽象類,這些功能枚舉都有。
enum Color{
RED("紅色"),GREEN("綠色"),BLUE("藍色");//枚舉對象必須卸載首行
private String title;//屬性
private Color(String title){//構造方法必須使用非public
this.title = title;
}
public String toString(){
return this.title;
}
}
public class Hello{
public static void main(String args[]) {
for(Color c:Color.values()){//values(),返回對象數組
System.out.println(c.name()+"-->"+c.ordinal()+"-->"+c);
}
}
}
除了可以定義一些基本結構之外,枚舉也可以實現接口。對於接口的實現有兩種模式。
範例:統一實現接口
interface IMessage{
public String getColor();
}
enum Color implements IMessage{
RED("紅色"),GREEN("綠色"),BLUE("藍色");//枚舉對象必須卸載首行
private String title;//屬性
private Color(String title){//構造方法必須使用非public
this.title = title;
}
public String toString(){
return this.title;
}
@Override
public String getColor() {
return this.title;
}
}
public class Hello{
public static void main(String args[]) {
IMessage msg = Color.RED;
System.out.println(msg.getColor());
}
}
範例:每個枚舉對象採用匿名內部類的方式實現接口
interface IMessage{
public String getColor();
}
enum Color implements IMessage{
RED("紅色"){
public String getColor(){
return "紅色";
}
},GREEN("綠色"){
public String getColor(){
return "綠色";
}
},BLUE("藍色"){
public String getColor(){
return "藍色";
}
};
//枚舉對象必須卸載首行
private String title;//屬性
private Color(String title){//構造方法必須使用非public
this.title = title;
}
public String toString(){
return this.title;
}
}
public class Hello{
public static void main(String args[]) {
IMessage msg = Color.RED;
System.out.println(msg.getColor());
}
}
最神奇的是枚舉裏面還可以定義抽象方法,同時每個枚舉對象要單獨實現抽象方法。
範例:枚舉中定義抽象方法
enum Color{
RED("紅色"){
public String getColor(){
return "紅色";
}
},GREEN("綠色"){
public String getColor(){
return "綠色";
}
},BLUE("藍色"){
public String getColor(){
return "藍色";
}
};
//枚舉對象必須卸載首行
private String title;//屬性
private Color(String title){//構造方法必須使用非public
this.title = title;
}
public String toString(){
return this.title;
}
public abstract String getColor();
}
public class Hello{
public static void main(String args[]) {
System.out.println(Color.RED.getColor());
}
}
以上純屬瞭解概念,別用。
枚舉實際應用
枚舉就是表示一個類的對象選用範圍,那麼下面定義一個表示人的類,裏面有性別。
範例:實現枚舉的應用
enum Sex{
MALE("男"),FEMALE("女");
private String title;
private Sex(String title){
this.title=title;
};
public String toString(){
return this.title;
}
}
class Person{
private String name;
private int age;
private Sex sex;
public Person(String name,int age,Sex sex){
this.name=name;
this.age=age;
this.sex=sex;
}
public String toString(){
return "姓名:"+this.name+",年齡:"+this.age+",性別"+this.sex;
}
}
public class Hello{
public static void main(String args[]) {
System.out.println(new Person("張三",10,Sex.MALE));
}
}
以上代碼不用枚舉也可以實現,不推薦用枚舉。