感受一下Java中的“枚举类型”

上一篇 / 下一篇  2012-07-24 09:56:22 / 个人分类:Java

!^\E5N/jq0  学习枚举的第一个疑问:为什么不用static final字段替代51Testing软件测试网&{qkY$B W)z

51Testing软件测试网0YjEH1B2t9jo"fa

   我想几乎每一个学习Java语言的人在学习枚举的时候首先的一个疑问就是“为什么不用static final字段替代?”,有这个疑问就说明你已经摸索到了枚举类型的最主要功能:以统一命名的常量来替换变化无常的直接量,这是毫无疑问是枚举的最主要作 用,在大多数情况下,用static final是足够的,所以N多知名的源码里我们会经常看到用static final字段定义的一系列常量;那么为什么要用枚举呢?有几个原因:

JN-Df OO0

/F)RP%?9v0  枚举的元素是一个实例,所以也是一个类型,相对字段更具有扩展性:扩展自段、方法、遍历;

q1a)~CL(Y6B0

}-T AKt0  枚举的申明类也是一个类型,相对于一段的字段申明的所属类,它提供了很多针对枚举的方法,如values();51Testing软件测试网d^yz^#qev

51Testing软件测试网-MA [ocI'a0h/c

  枚举访问、比较是兼具性能(ordinal)、及可读性(name)的;

XR3s"x!{n4dqB6s*~0

4aqPQ P$t.O"UI0  枚举在Java里即是一种需要死记硬背的语法,也是一种需要好好理解的设计

R0oTj7Ub051Testing软件测试网B.^a0Pg6Q;tm

  (体会大于解说)51Testing软件测试网(N+~L4ur5@W

51Testing软件测试网4R'h+iSl

  原理51Testing软件测试网n9]6L'~"RE xm!x\%R

b{![+y3b0   枚举提供了一套特定的、仅针对编译时的语法(在运行时枚举被翻译为普通类);为“枚举”这个功能提供了一套量身定制的语法。用于在“枚举”这个特定场合 提供方便快捷、及相对可扩展的功能,而不需要开发人员自己再重新实现一套。enum这个东西,相对于class来说,前者仅是编译时的一个东西,在运行时 enum也被翻译成了class,换句话说,没有enum,Java语言仍然保持相同强大的功能,只是在处理“枚举”这一类需求时,程序员可能会更头疼一 点。

u)` m[HlH051Testing软件测试网BGx,kf7B;kXW

  枚举这个东西让我记起了小时候一件事情,买折扇;那时记得电视里经常放关于郑板桥的电视剧,郑板桥胸前经常有一把写着“郑板桥”三 大字的析扇,所以那时流行起了拆扇风,记得镇上有一家小店的折扇卖得非常好,与一般小店不一样的是,那家卖折扇的老板书法也相当不错(至少我们那时看起来 也是有模有样),所以每次买扇子时,我们都会要求老板帮忙在扇子上写上我们的名字,这样这个老板的扇子“推销”就相当成功;其它枚举这个功能,就相当于当 年Sun老板(现在是oracle)在推销Java这把扇子上写上名字,虽然即使老板不写,我们自己也可以写,但是写得怎么样,或许更好?或许更差?但总 的来说,老板写的还是有一定水准的,而且我们肯定是可以省力的。51Testing软件测试网D?:r-Y9v

51Testing软件测试网I/@t L&UcT

  语法特征

7A.W6uZ0Y,OY Gz0

-Ce/vah$d"m5x0  一句话搞定

z!N%ok-k M0
enum A{BigA, SmallA{ String extField; void doSomeThing(){}; }, LargeA}
51Testing软件测试网g M$p)kC-YK4|

  如果我们用class语法来实现,相当于(仅是相当于,只为了让大家了解到用原始的语法实现枚举的功能有多么复杂):

["_Ol0D0
  1. final class A extends Enum{  
  2. //编译器给我们生成的字段、方法, 如values();  
  3. //相关构造函数 
  4. static final A BigA = new A("BigA"0);  
  5. staitc final A SmaillA = new A("SmallA"1){  
  6. void doSomeThing(){}  
  7. }  
  8. static final A BigA = new A("LargeA"3);  
  9. }

/CN9n5E)o#e2C0  隐藏特性

#j$O#|G+|v051Testing软件测试网w{'p.e Gu

  元素与元素间的区别用odinal字段,值从0开始依次递增51Testing软件测试网+m,k8oR/rP ^

,Q\#[&y/n0  元素的打印标记用name字段

Lg'w8i!Ng4s;dy~!J0

.oN4f;\]$\"Y/x0  枚举元素编译后都是static final修饰51Testing软件测试网#v HNCBk

U4GUp"@&s$Aw0  枚举申明类至少用final修饰51Testing软件测试网xWf OQw6`

51Testing软件测试网PgsB?

  枚举申明类如果是其它类的成员类,那么编译后默认会加static修饰,变成静态员类51Testing软件测试网|_r0|x K X:A/F

51Testing软件测试网QcT a6[:T!d7uC

  枚举在编译时会自动加上一些“方法”,如values();

-zw\/l @2rx051Testing软件测试网x t:_ `ZY

  枚举类编译时自动继承Enum<E extend Enum<E>>类,所以不能再继承其它类

2iIu1ak ]0

+b9k:l_Z`0  枚举的语法一定要好好理解51Testing软件测试网|uoMp*n9v


TAG:

 

评分:0

我来说两句

Open Toolbar