所有的枚舉類都繼承自 Enum,因為 Java 不支援多繼承,所以枚舉無法繼承其它類。
但是,枚舉與普通類一樣,可以實現介面。
package mark.demo;public class EnumDemo {public static void main(String[] args) {for (Color color : Color.values()) {color.setColor();}}interface Paint {public void setColor();}public enum Color implements Paint {RED("red color", 0), GREEN("green color", 1), BLUE("blue color", 2), YELLOW("yellow color", 3);Color(String name, int id) {_name = name;_id = id;}private String _name;private int _id;public String getName() {return _name;}public int getId() {return _id;}// @Override// public String toString() {// return this._name.toUpperCase();// }@Overridepublic void setColor() {System.out.println("Current paint color: " + _name);}}}
自訂介面 Paint,枚舉 Color 實現該介面。
試想一下,為 Paint 選擇 color 的同時是否可以指定 Paint 的類型呢?
那麼,我們改造這個 Paint 介面:
interface Paint {public void setColor();public void setType();}
枚舉 Color 實現 Paint:
public enum Color implements Paint {RED("red color", 0), GREEN("green color", 1), BLUE("blue color", 2), YELLOW("yellow color", 3);Color(String name, int id) {_name = name;_id = id;}private String _name;private int _id;public String getName() {return _name;}public int getId() {return _id;}// @Override// public String toString() {// return this._name.toUpperCase();// }@Overridepublic void setColor() {System.out.println("Current paint color: " + _name);}@Overridepublic void setType() {System.out.println("Current paint type: " + "How to determine??");}}
把這個問題具體化:
在選擇 RED 的同時,我想選擇類型為 5 號的 paint
在選擇 GREEN 的同時,我想選擇類型為 1 號的 paint,如何處理?
....
(這裡只是為了說明枚舉的功能,不是為了更好的找到解決上述問題的方法,請勿跑題!)
在前面的部落格 Java 枚舉:理解枚舉本質 中說到,
枚舉的常量值本質就是枚舉對象,那麼我們可以採用匿名內部類來解決這個問題!
package mark.demo;public class EnumDemo {public static void main(String[] args) {for (Color color : Color.values()) {color.setColor();color.setType();}}interface Paint {public void setColor();public void setType();}public enum Color implements Paint {RED("red color", 0) {@Overridepublic void setColor() {System.out.println("Current paint color: " + RED._name);}@Overridepublic void setType() {System.out.println("Current paint type: " + "5");}},GREEN("green color", 1) {@Overridepublic void setColor() {System.out.println("Current paint color: " + GREEN._name);}@Overridepublic void setType() {System.out.println("Current paint type: " + "1");}},BLUE("blue color", 2) {@Overridepublic void setColor() {System.out.println("Current paint color: " + BLUE._name);}@Overridepublic void setType() {System.out.println("Current paint type: " + "12");}},YELLOW("yellow color", 3) {@Overridepublic void setColor() {System.out.println("Current paint color: " + YELLOW._name);}@Overridepublic void setType() {System.out.println("Current paint type: " + "80");}};Color(String name, int id) {_name = name;_id = id;}private String _name;private int _id;public String getName() {return _name;}public int getId() {return _id;}}}
為了呈現不同的 Paint,枚舉可以讓其每個枚舉值實現介面。
推薦一篇部落格:小談Java Enum的多態性