desc 枚举类型id_枚举系列(一):手动实现枚举类

在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有四个对象;再比如行星类,目前只有9个对象。这种实例有限而且固定的类,在Java里被称为枚举类。如果需要手动实现枚举类,可以采用如下方式:

(1).通过private把构造器隐藏起来。

(2).把这个类的所有可能实例都使用public static final修饰的类变量来保存。

(3).如果有必要,可以提供一些静态方法,允许其他程序根据特定参数来获取与之匹配的示例。

下面程序定义一个Season类,这个类只能产生四个对象,该Season类被定义成一个枚举类。

public class Season

{

//把Season类定义成不可变的,将其Field也定义成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 getSeason(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;

}

}

上面的Season类是一个不可变类,在上面的Season类中包含了4个static final常量的Field,这四个常量Field就代表了该类所能创建的对象。当其他程序需要使用Season对象时,即可通过如Season.SPRING的方式来取得Season对象,也可通过getSeason静态工程方法来获取Season对象。

下面程序演示了如何使用Season类。

public class SeasonTest {

public SeasonTest(Season s) {

System.out.println(s.getName() + ",这真是一个" + s.getDesc() + "的季节");

}

public static void main(String[] args) {

// 直接使用Season的FALL常量代表一个Season对象

new SeasonTest(Season.FALL);

}

}

从上面程序中不难看出,使用枚举类可以使程序更加健壮,避免创建对象的随意性。有的程序员喜欢使用简单的静态常量来表示这种情况。

public static final int SEASON_SPRING = 1;

public static final int SEASON_SUMMER = 2;

public static final int SEASON_FALL = 3;

public static final int SEASON_WINTER = 14;

这种定义方式简单明了,但存在如下几个问题:

(1).类型不安全:因为上面的每个季节实际上是一个int整数,因此完全可以把一个季节当成一个int整数使用,例如进行加法运算SEASON_SPRING+SEASON_SUMMER,这样的代码完全正常。

(2).没有命名空间:当需要使用季节时,必须在SPRING前使用SEASON_前缀,否则程序可能与其他类中的静态常量混淆。

(3).打印输出的意义不明确:当我们打印输出某个季节时,例如打印SEASON_SPRING,实际上输出的是1,这个1很难猜测它代表了春天。

从这个意义上面来看,枚举类的存在的确很有意义,但是手动定义枚举类的代码量比较大,实现起来也比较麻烦,所以Java从JDK1.5后就增加了对枚举类的支持。

附:源代码示例

github地址:点击查看

码云地址:点击查看

打赏

f815bb64db1a27a2cf73a0fe01e32de8.png

微信扫一扫,打赏作者吧~欢迎关注人生设计师的微信公众账号

公众号ID:longjiazuoA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值