\backspace
class Color {
private String title;
private static final Color RED = new Color("红色");
private static final Color GREEN = new Color("绿色");
private static final Color BLUE = new Color("蓝色");
private Color(String title) {
this.title = title;
}
public static Color getInstance(int ch) {
switch (ch) {
case 1:
return RED;
case 2:
return GREEN;
case 3:
return BLUE;
default:
return null;
}
}
public String toString() {
return this.title;
}
}
public class MainClass {
public static void main(String[] args) {
Color red = Color.getInstance(1);
System.out.println(red);
}
}
package com.alpha;
enum Color { // 定义枚举类
RED, GREEN, BLUE;
}
public class MainClass {
public static void main(String[] args) {
Color red = Color.RED;
System.out.println(red);
}
}
package com.alpha;
enum Color { // 定义枚举类
红色, 绿色, 蓝色;
}
public class MainClass {
public static void main(String[] args) {
Color red = Color.红色;
System.out.println(red);
}
}
package com.alpha;
enum Color {
RED("红色"), GREEN("绿色"), BLUE("蓝色");
private String title;
private Color(String title) {
this.title = title;
}
public String toString() {
return this.title;
}
}
public class MainClass {
public static void main(String[] args) {
for (Color c : Color.values()) {
System.out.println(c);
}
}
}
此时与之前定义的多例设计模式操作方式完全相同,而且代码更加简短。
枚举还可以实现接口。
范例: 枚举实现接口
package com.alpha;
interface Message {
public String getTitle();
}
enum Color implements Message {
RED("红色"), GREEN("绿色"), BLUE("蓝色");
private String title;
private Color(String title) {
this.title = title;
}
public String toString() {
return this.title;
}
public String getTitle() {
return this.title;
}
}
public class MainClass {
public static void main(String[] args) {
Message msg = Color.RED;
System.out.println(msg.getTitle());
}
}
枚举里面最变态的一种做法是可以在每一个对象后面使用匿名内部类的形式实现抽象方法。
范例: 另外一种接口的实现
package com.alpha;
interface Message {
public String getTitle();
}
enum Color implements Message {
RED("红色") {
public String getTitle() {
return "自己的" + this;
}
}, GREEN("绿色") {
public String getTitle() {
return "自己的" + this;
}
}, BLUE("蓝色") {
public String getTitle() {
return "自己的" + this;
}
};
private String title;
private Color(String title) {
this.title = title;
}
public String toString() {
return this.title;
}
public String getTitle() {
return this.title;
}
}
public class MainClass {
public static void main(String[] args) {
Message msg = Color.RED;
System.out.println(msg.getTitle());
}
}
更变态的是枚举里面还可以直接定义抽象方法。此时每一个枚举对象必须分别覆写抽象方法。
范例: 定义抽象方法并覆写
package com.alpha;
enum Color {
RED("红色") {
public String getTitle() {
return "自己的" + this;
}
}, GREEN("绿色") {
public String getTitle() {
return "自己的" + this;
}
}, BLUE("蓝色") {
public String getTitle() {
return "自己的" + this;
}
};
private String title;
private Color(String title) {
this.title = title;
}
public String toString() {
return this.title;
}
public abstract String getTitle();
}
public class MainClass {
public static void main(String[] args) {
System.out.println(Color.RED.getTitle());
}
}
整个过程里面发现枚举的功能真的很强大,强大到没人使了。
枚举的实际作用
枚举可以直接在switch上使用。
package com.alpha;
enum Color {
RED, GREEN, BLUE;
}
public class MainClass {
public static void main(String[] args) {
Color c = Color.RED;
switch(c) {
case RED:
System.out.println("这是红色");
break;
case GREEN:
System.out.println("这是绿色");
break;
case BLUE:
System.out.println("这是蓝色");
break;
}
}
}
尝试正常的使用枚举。
package com.alpha;
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 "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
public class MainClass {
public static void main(String[] args) {
System.out.println(new Person("Omega", 24, Sex.MALE));
}
}