一个类的对象是有限的而且是固定的、比如季节,有四个对象、这种实例有限而且固定的类,我们可以定义成Java类里的枚举类
比如我们不使用enum来创建而是自己定义一个枚举类:
下面定义一个Season类,这个类只能产生四个对象[code=java]package cn.itcast.heima
public class Season
{
//把Season类定义成不可变的,将其属性也定义成final
private final String name;
private final String desc;
public static final Season SPRING = new Season("春天" , "趁春踏青");
public static final Season SUMMER = new Season("夏天" , "夏日炎炎");
public static final Season FALL = new Season("秋天" , "秋高气爽");
public static final Season WINTER = new Season("冬天" , "围炉赏雪");
public static Season getSeaon(int seasonNum)
{
switch(seasonNum)
{
case 1 :
return SPRING;
case 2 :
return SUMMER;
case 3 :
return FALL;
case 4 :
return WINTER;
default :
return null;
}
}
//将构造器定义成private访问权限
private Season(String name , String desc)
{
this.name = name;
this.desc = desc;
}
//只为name和desc属性提供getter方法
public String getName()
{
return this.name;
}
public String getDesc()
{
return this.desc;
}
}[/code]上面定义一个不可变类,包含了四个static final常量属性,这四个常量属性表示这个类能创建的对象,当其他程序使用Season对象的时候,既可以通过Season.SPRING方式取得,也可通过getSeason静态工厂方法来获得,
下面程序示范了如何使用上面定义的类[code=java]package cn.itcast.heima
public class TestSeason
{
public TestSeason(Season s)
{
System.out.println(s.getName() + ",这真是一个"+ s.getDesc() + "的季节");
}
public static void main(String[] args)
{
//直接使用Season的FALL常量代表一个Season对象
new TestSeason(Season.FALL);
}
}[/code]更早以前我们还会这样定义枚举:[code=java]public static final int SEASON_SPRING = 1 ;
public static final int SEASON_SUNMER= 2 ;
public static final int SEASON_FALL= 3 ;
public static final int SEASON_WINTER= 4 ;[/code]注:这种定义简单但是有问题:
1、类型不安全:因为上面每个季节实际是一个int整数,因此完全可以把一个季节当成一个int整数使用,而且他们之间还能相加
2、没有命名空间:当需要使用季节的时候,必须在SPRING前面使用SEASON_前缀,否则程序可能与其他类中的静态常量混淆,
3、打印输出意义没有明确:当我们打印输出某个季节的时候,比如SEASON_SPRING ,实际上书输出1.但是这个1很难让程序员猜测它代表春天
不管是上面两种方式的任何一种,他们在实现时候是有意义的,但是手动实现的时候代码量很大,实现起来也比较麻烦,如过使用枚举关键字来定义则相对简单如下而使用Java中的enum来定义枚举类[code=java]public enum SeasonEnum
{
SPRING,SUMMER,FALL,WINTER;
}[/code]使用枚举类:[code=java]package cn.itcast.heima
public class TestEnum
{
public void judge(SeasonEnum s)
{
//switch语句里的表达式可以是枚举值
switch (s)
{
case SPRING:
System.out.println("春暖花开,正好踏青");
break;
case SUMMER:
System.out.println("夏日炎炎,适合游泳");
break;
case FALL:
System.out.println("秋高气爽,进补及时");
break;
case WINTER:
System.out.println("冬日雪飘,围炉赏雪");
break;
}
}
public static void main(String[] args)
{
//所有枚举类都有一个values方法,返回该枚举类的所有实例
for (SeasonEnum s : SeasonEnum.values())
{
System.out.println(s);
}
new TestEnum().judge(SeasonEnum.SPRING);
}
}[/code]从上面可我们可以看出,使用ENUM关键字定义枚举类不仅实现起来很方便,而且更具有实际的意义
[ 本帖最后由 詹季春 于 2011-07-29 22:44 编辑 ] |