枚举优点
如果要求实例化有限个Color对象,可以采用之前学过的多例模式,将构造私有化,在类里实例化对象,然后用静态get方法获取对象,代码如下:
package CODE.Java新特性;
class Color
{
private String colour;
public static final int RED_FLAG=1; //需要定义为static final ,否则在静态get方法的case里无法使用
public static final int GREEN_FLAG=3;
public static final int BLUE_FLAG=5;
private static final Color Red=new Color("red");
private static final Color Green=new Color("green");
private static final Color Blue=new Color("blue");
private Color(String colour)
{
this.colour=colour;
}
public static Color getColor(int flag)
{
switch(flag)
{
case RED_FLAG:
return Red;
case GREEN_FLAG:
return Green;
case BLUE_FLAG:
return Blue;
default:
return null;
}
}
public String toString()
{
return this.colour;
}
}
public class Enum1
{
public static void main(String[] args)
{
Color color=Color.getColor(Color.RED_FLAG);
System.out.println(color); //red
}
}
可以看出用多例模式实例化对象有点麻烦,其实多例模式不实用,在JDK1.5引入枚举,枚举取代了多例模式,对上面例子用枚举代码如下:
enum Color //Color是一个枚举类
{
RED, //枚举对象
GREEN,
BLUE
}
public class Enum1
{
public static void main(String[] args)
{
System.out.println(Color.BLUE); //是对象,而不是对象地址,覆写了toString
}
}
使用enum关键字的枚举结构实际上是默认继承了Enum类的枚举类。即枚举实际上是个类。枚举默认是多例模式。
Enum类:
Enum类(抽象类)中有2大属性:
name :枚举对象名称
ordinal:枚举对象数字下标
public final int ordinal ( ) : 取得枚举对象下标
public final String name( ) : 取得枚举对象名称
既然enum定义的枚举类继承了Enum类,那么Enum类的name( )和ordinal( )方法枚举类都可以使用:
enum Color //Color是一个枚举类
{
RED, //枚举对象
GREEN,
BLUE
}
public class Enum1
{
public static void main(String[] args)
{
Color color=Color.GREEN;
System.out.println("对象:"+color.name()+ " 下标:"+color.ordinal()); //对象:GREEN 下标:1
}
}
取得所有枚举类对象:
枚举类.values( ); //实际上是数组 并且覆写了 toString
比如Color.values();
例子:
enum Color //Color是一个枚举类
{
RED, //枚举对象
GREEN,
BLUE
}
public class Enum1
{
public static void main(String[] args)
{
for(Color tmp:Color.values()) //取得所有的枚举对象
{
System.out.println(tmp); //RED GREEN BLUE 覆写了toString
}
}
}
面试:enum与Enum区别:
- enum是一个关键字,Enum是一个抽象类
- enum定义的枚举类继承了Eunm类
枚举中定其他结构:
- 枚举中若定义构造方法,构造方法必须使用private封装(枚举类是多例类,枚举类外部无法产生对象)
- 枚举中若定义其他结构,枚举类对象声明必须放在首行。
枚举中定义其他结构
enum Color //Color是一个枚举类
{
RED("red"), GREEN("green"), BLUE("blue"); //枚举类对象声明放首行
private String clour;
private Color(String clour) //构造私有化
{
this.clour=clour;
}
public String toString()
{
return this.clour;
}
}
public class Enum1
{
public static void main(String[] args)
{
Color color=Color.GREEN;
System.out.println(color); //green,如果没有在枚举类覆写,输出的是Enum覆写的oString 为GREEN
}
}
枚举类实现接口:
枚举类实现接口
interface IColor //接口
{
String func(); //抽象方法
}
enum Color implements IColor//枚举类实现接口
{
RED("red"), GREEN("green"), BLUE("blue"); //枚举对象
private String clour;
private Color(String clour) //构造私有化
{
this.clour=clour;
}
public String func() //覆写抽象方法
{
return this.clour;
}
}
public class Enum1
{
public static void main(String[] args)
{
IColor ic=Color.BLUE; //枚举类实现了接口后,每个枚举对象变为接口对象
System.out.println(ic.func()); //blue
}
}
当枚举类实现接口后,枚举中的对象自动变为接口对象。
switch支持枚举
switch支持枚举
enum Sex
{
MALE,FEMALE
}
public class Enum1
{
public static void main(String[] args)
{
switch(Sex.MALE) //switch支持枚举对象,但是用处不大,因为已经知道对象
{
case FEMALE:
System.out.println("beautiful");
break;
case MALE:
System.out.println("handsome");
}
}
}
注:尽管switch支持枚举,但是用处不大。
枚举应用:
枚举里面声明了有限个对象,对一些类的实例化对象是有限个可以考虑枚举,比如性别,生肖等。
enum Sex
{
MALE,FEMALE
}
class Person
{
private String name;
private Sex sex; //注意是枚举对象,类型是枚举类
public Person(String name,Sex sex)
{
this.name=name;
this.sex=sex;
}
}
public class Enum1
{
public static void main(String[] args)
{
Person p=new Person("pick",Sex.MALE);
}
}