Enum(枚举类型)的应用

一.前言

    在我们日常的开发过程中,我们经常定义使用常量;在Effective Java建议用枚举来替换常量的使用,提高我们代码的质量,总结一下枚举定义常量的基本使用

二.枚举类型说明

     1.枚举是一种数据类型,在jdk1.6版本才开始引入;

     2.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内;

     3.枚举定义了一组业务类型相同的成员且成员的语义清晰;

三.常量与枚举类型对比说明

  常量存在问题:

          1) 无法限制开发员继承/实现接口.

          2) 开发员能够在子接口里继续添加常量.而这些常量可能得不到祖先层的支持.

          3) 常量作为参数时,是String,int等弱类型,开发员可以传入没有在常量接口里定义的值,这个问题无法通过编译器发现.

          4) 由于开发员可以直接写常量值, 所以不能用==对比,只能用equals对比,不能优化性能

          5) 开发员在没有参考资料时,不可能知道某个int型的参数到底应该赋什么内容.

          6) 编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译所有引用常量的类,因为里面存的是旧值.

 枚举解决了以上所有问题,主要体现在:

          1) 私有构造函数,避免被继承和扩展.

          2) 定义方法的参数时,必须用枚举常量类类型,如上面的EnumClassA类型,这样就转变成了强类型,不会出现弱类型引起的问题.

          3) 常量值地址唯一,可以用==直接对比,性能会有提高.

          4) 开发员可以根据该参数类型打开对应的类,从而找到定义的常量.

          5) 编译时,没有把常量值编译到代码里,即使常量的值发生变化也不会影响引用常量的类.

四.枚举定义常量例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public  enum  Color {
     
     /**
      * 红色
      */
     RED( "1" ),
     
     /**
      * 黑色
      */
     BANK( "2" ),
     
     /**
      * 白色
      */
     WHITH( "3" );
     
     private  String value;
 
     private  Color(String value) {
         this .value = value;
     }
 
     public  String getValue() {
         return  value;
     }  
 
}

说明:这个小例子定义了几种颜色,红色、黑色、白色分别用1、2、3来表示。在我们的开发使用中就可以用equest调用枚举来进行判断比较操作,提高了复用性,方便修改以及管理提高代码的质量。

枚举常量属于稳态型 

   使用常量接口,我们得对输入值进行检查,确定是否越界,如果常量非常庞大,校验输入就是一件非常麻烦的事情,但这是一个不可逃避的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  void  describe( int  s){
     //s变量不能超越边界,校验条件
     if (s >= 0 && s <4){
         switch (s){
             case  Season.Summer:
                 System. out .println( "Summer is very hot!" );
                 break ;
             case  Season.Winter:
                 System. out .println( "Winter is very cold!" );
                 break ;
         …..
         }
     }
}

我们再来看看枚举常量是否能够避免校验问题,代码如下 

1
2
3
4
5
6
7
8
9
10
11
public  void  describe(Season s){
     switch (s){
         case  Season.Summer:
             System. out .println( "Summer is very hot!" );
             break ;
         case  Season.Winter:
             System. out .println( "Winter is very cold!" );
             break ;
         …...
     }
}

不用校验,已经限定了是Season枚举,所以只能是Season类的四个实例。这也是我们看重枚举的地方:在编译期间限定类型,不允许发生越界的情况。

五.总结

   虽然枚举在很多方面都比接口常量和类常量好用,但是它有一点比不上接口常量和类常量的,就是继承,枚举类型是不能有继承的,也就是说一个枚举常量定义完毕后,除非修改重构,否则无法做扩展。 

六、建议 

    在 项目开发中,推荐使用枚举常量代替接口常量或类常量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值