1.多例设计模式
在学习枚举前,我们得了解一下一下多例设计模式,多例模式是为了限制本类实例化对象的产生个数
多例设计模式的特点:构造方法私有化,类内部需要提供若干个实例化对象,后面过static方法返回。
- eg.
/*
定义一个描述颜色的多例类(表示有限个数的对象的类),
构造方法私有化以后在类的内部提供对象
*/
class Color{
private String name;//在多例中标识对象
//首先构造方法私有化
private static Color RED = new Color("Red");
private static Color YELLO = new Color("yello");
private static Color BLUE = new Color("Blue");
private Color(String name){
this.name = name;
}
public static Color getInstance(String colorName){
switch(colorName){
case "Red":
return RED;
case "YELLO":
return YELLO;
case "BLUE":
return BLUE;
default:
return null;
}
}
//覆写toString,为了直接输出名字
public String toString(){
return this.name;
}
}
public class Test1 {
public static void main(String[] args) {
Color red = Color.getInstance("Red");
Color blue = Color.getInstance("Blue");
System.out.println(red);
System.out.println(blue);
}
}
2.用枚举优化多例设计模式
多例模式的目的是限制本类实例化对象的产生个数。但是如果对象过分多则会很麻烦,所以在JDK1.5有了枚举,上述多例代码可以用枚举来替代。
- eg.
enum Color2 {
RED2,BLUE2;
}
public class Test2 {
public static void main(String[] args) {
Color2 red2 = Color2.RED2;
Color2 blue2 = Color2.BLUE2;
System.out.println(red2);
System.out.println(blue2);
}
}
enum并不是一个新的结构,使用enum定义的枚举默认继承Enum枚举类。因此enum定义的枚举结构实际上就是一个多例类。
3.Enum常用的三个方法
3.1 ordinal():返回枚举对象下标,默认第一个对象编号为0。
3.2 name():返回枚举对象名称,默认与对象名称保持一致。
3.3 values():返回所有枚举对象。
eg.
enum Color3 {
RED3,BLUE3,YELLOW3
}
public class Test3 {
public static void main(String[] args) {
Color3 red3 = Color3.RED3;
//ordinal()方法返回他的枚举编号,name()方法返回枚举名称(默认与对象名称保持一致)
System.out.println(red3.ordinal() + " = " + red3.name());
//values()返回所有枚举对象
Color3[] colors = Color3.values();
for (Color3 color3:colors) {
System.out.println(color3);
}
}
}
4.枚举中支持定义其它结构
如构造方法,普通属性,普通方法等(类里面有什么东西,他里面就有什么)
当枚举类中还包含有其他结构,枚举对象的定义必须放在首行。
eg.
//enum Color3实际就是class Color3 只是名称不同
enum Color4 {
//默认通过无参构造产生,此时定义了有参构造之后,必须给里面传参
RED4("红"),BLUE4("蓝"),YELLOW4("黄");
//如果想修改名字,可以扩展一个普通的名称, 但是这三个是通过无参构造传入的,想将title传入需要有参构造
private String title;
private Color4(String title){
this.title = title;
}
public String toString(){
return this.title;
}
}
public class Test4 {
public static void main(String[] args) {
Color4 red4 = Color4.RED4;
System.out.println(red4);
}
}
枚举可以实现接口,枚举中的对象成为接口对象。
eg.
/*
枚举实现接口
*/
interface IColor {
//由于这个方法被覆写,那么枚举类中的这三个对象就自动变成了ICOlor()对象
String getTitle5();
}
enum Color5 implements IColor {
RED5("红"),BLUE5("蓝"),YELLOW5("黄");
private String title5;
private Color5(String title5){
this.title5 = title5;
}
public String toString(){
return this.title5;
}
public String getTitle5() {
return title5;
}
}
public class Test5 {
public static void main(String[] args) {
IColor color5 = Color5.RED5;//此时这个枚举对象就自动向上转型变成了接口对象
System.out.println(color5.getTitle5());
}
}