- 多例设计模式与枚举
- 使用枚举进行基本操作
多例设计模式与枚举
多例设计模式一定是构造方法私有化,而后在类的内部产生若干个实例化对象。
范例:定义颜色基色的多例设计模式
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));
}
}
以上代码不用枚举也可以实现,不推荐用枚举。