a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 150|回复: 1

[红帽认证] 红帽认证辅导:JavaSE5中的枚举类型的使用方法

[复制链接]
发表于 2012-8-4 12:19:50 | 显示全部楼层 |阅读模式
Java SE 5之前,Java程序员在需要使用枚举类型时,必须了解很多细节并需要格外仔细,以正确地产生enum的效果。  % ~" {. G0 b/ l! s) u$ B3 N
现在Java也有了enum,并且它的功能比C/C++中的枚举类型要完备得多。  1 B/ Q6 o, q* c" Z
Java中定义一个枚举类型,如下:  
: y/ V6 c; K+ K; m7 D" }+ A//Rmb.java  
. C6 V1 J+ r, B0 @# I/** *//**  % }) |) B1 |1 C1 R1 `2 I
* 表示人民币中的几种面值的enum类型  ) }" ^2 s! i2 l1 e
* @author autumn  
7 S8 y, X, U. m, R */  
3 Z" g" ^7 d  \5 h0 P- j( {public enum Rmb ...{  ' v3 R# J- z% t% K" }/ T5 @: U
  /** *//**  ) ]! r# N+ |& h6 v( U
   * 壹角  1 I) r" [  I8 F( f. Z. g/ d
   */  1 N5 c/ x/ A( {. U3 w
  YIJIAO,  7 N9 ?+ F  Z% P! c( \+ S

% {; n. v3 s3 Z5 V# C  /** *//**    Y: n* c  P3 z/ R
   * 伍角  ) ]6 h& r5 P4 W1 \
   */  & {" c( p# q6 d, _' s4 `7 g
  WUJIAO,  
% g) |% S2 \; R6 o8 d+ p$ \) Q4 T4 k( ?
  /** *//**  8 D8 G, [$ G' k8 B1 p
   * 壹圆  
) ~3 K; S$ I2 I6 i   */  
% f, ]% g6 |( `- _1 s' v) }& V$ u$ q  YIYUAN,  # B! D  @1 I1 M* C6 v% [  E
/ j' u+ f0 @6 N0 H" p& C, L
  /** *//**  
, ~2 U1 d- c, e* [   * 伍圆  
6 O  s5 S" E# r; z: {3 p   */  0 O- O/ f& H% P: M
  WUYUAN,  ! d9 r( \0 I3 L- R# m. b0 W

* @: W: E* m/ J4 f: J  /** *//**  : ]2 o# k4 Q! o4 t
   * 拾圆  ; X, F2 v' X3 _: }% ]
   */  5 E" N5 Q; G3 i
  SHIYUAN,  8 J7 b# [3 k& r7 U4 Y, o

- [6 e' @! Q* N' U- t* Q( P- w  /** *//**  
1 x: f' R% O( g; n   * 伍拾圆  7 F% W+ M0 G* a( \9 H1 a% [' P8 O( w
   */  
9 q: K# e# I' W- K! d7 m: l1 M  WUSHIYUAN,  7 S: P8 p/ {$ ?7 G, J2 ?6 |( m

2 @4 ]# d$ _& j8 E  y; v1 b, s  /** *//**  
  _; g2 g; @; ^& x7 _9 a! A+ e   * 壹佰圆  
, \1 p) j( w5 x5 m. L. G/ Z+ R& Y7 |   */  
  h( U% q* \+ i  YIBAIYUAN  ; k$ H- Z/ k4 o& D
}  - i* m' S; i6 m

4 E' L. K. D6 }2 L) u这里创建了一个名为Rmb的枚举类型,它具有7个实例(值)。  1 h; p' X$ K# \
枚举类型可以定义在一个单独的java源文件中(如上),也可以定义在其他java类内部。例如:  8 G2 d/ U* H8 P& @
public class Card ...{  
/ Y9 ]4 ~" H* D7 N0 t    public enum Rank ...{ DEUCE, THREE, FOUR, FIVE, SIX,  + j+ Q0 y' \+ K  H$ t
        SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }  
! P+ n" \8 c' F1 f( A0 g% e* P/ k) |8 ~4 B# |% y
    public enum Suit ...{ CLUBS, DIAMONDS, HEARTS, SPADES }  
0 p3 @7 x% i% B; `  ^; k
# h9 r. {& H( A8 W% k: X) Y/ r    private final Rank rank;  : [& H& ?8 V+ d# O2 p1 x2 R! U7 b* r$ q
    private final Suit suit;  
+ U& |8 g" q9 p" G# |( X; n    private Card(Rank rank, Suit suit) ...{  8 g+ @9 ~7 K; {5 \1 g8 f
        this.rank = rank;  
( \6 v/ d  Y; }, R) `( t        this.suit = suit;  
; n# Y- }. l% c+ Z% ?    }  
0 q, W& J4 M6 W: t, D. i, G5 \  C. V, U# w
    public Rank rank() ...{ return rank; }  
5 M3 d5 v* E( u0 c    public Suit suit() ...{ return suit; }  
& b! Q9 C: {) f4 z& \: M0 ]    public String toString() ...{ return rank + " of " + suit; }  
6 _1 z3 o/ H0 D' q7 k$ W0 |/ L}
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:19:51 | 显示全部楼层

红帽认证辅导:JavaSE5中的枚举类型的使用方法

枚举类型的实例是常量(public static final),因此按命名惯例,它们都用大写字母表示。  
: X* v. s- N$ Q) ?8 t9 y6 ?- ^, j现在,你可以使用这个Rmb的枚举类型了。例如:  
8 N4 [( U& s5 y* RRmb aRMB = Rmb.YIBAIYUAN;  
* o7 f. X. w( W6 p! V* eenum看起来像个新的数据类型,实际上enum就是一个类,它继承自Java SE 5的库中 java.lang.Enum,并有自己的方法。我们使用enum关键字时,编译器会生成对应的类。  
. h4 u. T2 X- S5 J6 j: O有关enum类的方法,大家可以自行查看API文档。  
. Q5 `/ v& P5 u1 S6 p3 ^5 _$ O3 V这里介绍一个特别实用的特性,即它可以在switch语句内使用:  
! H3 |- {# a. H+ K//EnumTest.java  8 P( f) x. _0 T2 s- b  {

' i" b( @+ B3 U$ Z/ M/** *//**  
% U8 v) M3 V6 D0 [9 L" M# z( _ * enum测试  
! p; G8 ?; N( w# Z: R- s; M; v3 |& O * @author autumn  
( t1 j8 M+ _% O5 p& I3 o- m+ J */  
2 |3 J8 t- _3 a# R& Q" E2 L( Fpublic class EnumTest ...{  . U1 Y8 N' }! K' w7 W8 G
7 @& s" K4 D/ T6 M3 y  _& Q
  public static void main(String[] args) ...{  7 G" |7 T+ _: I. F- D
    Rmb aRmb = Rmb.WUYUAN;  * u! ]6 |  N' S5 s5 m5 m+ A
    descRmb(aRmb);  
& W3 O' m+ h& K; f6 U# j  }  . P* m3 D" \- t5 P+ e  m9 k

3 [) ~& M. g( Z- Q/ p+ A5 ~8 X  /** *//**  ; ~! ^9 L+ g4 v/ q  h4 W% r
   * 描述Rmb类型的方法  8 y. p9 K" L$ `8 C; s6 G; i
   * @param aRMB Rmb类型的值  - C/ [2 v. _3 U2 X4 Z& @6 m1 @7 v( I
   */  : Z; h2 M& \# S# x! G
  public static void descRmb(Rmb aRMB) ...{  / x: L1 ^/ e: @$ A* U
    switch (aRMB) ...{  ; P/ Y8 D. u; F: C. H: c9 H
      case YIJIAO:  
  C6 K' S+ P8 w% @5 g" b( \        System.out.println("这是一张壹角的人民币。");  
4 f4 r& ]+ x) a+ G        break;  6 n/ L7 w5 w7 F' R3 P9 R# T
      case WUJIAO:  
& A/ p; P+ A0 x) n& a3 y, Q        System.out.println("这是一张伍角的人民币。");  
: n2 u; t( j, h4 {7 C5 O4 O' s        break;  
/ y& E* x; h" ^* j      case YIYUAN:  
" p" u) P2 r7 b& H# e        System.out.println("这是一张壹圆的人民币。");  ; U$ @8 {' s, K2 @5 w) I- B; e& o
        break;  
9 X; z! z2 _8 @3 R      case WUYUAN:  
. n3 r  J! {& q' K! D) h! i# A5 D        System.out.println("这是一张伍圆的人民币。");  0 ~% V$ b. ?- y# c: W* m' b  z! h
        break;  
8 a6 g3 L( E8 y      case SHIYUAN:  
, D  k3 v- l4 d! B8 \        System.out.println("这是一张拾圆的人民币。");  1 [8 R4 y; \4 [# E
        break;  
% m% M' X4 W2 _: Z3 K7 o3 v      case WUSHIYUAN:  
: s- [7 X7 L( K4 {* h/ {0 H- T        System.out.println("这是一张伍拾圆的人民币。");  
8 i" {2 P# ]. P' ?8 @: u        break;  ) v& v+ Z- G: u+ [0 E4 r
      case YIBAIYUAN:  2 C' i* D- f' p4 @$ L5 `/ f2 B
        System.out.println("这是一张壹佰圆的人民币。");  
: K: A# ^' x$ R. R        break;  
% N% _) E5 u! g7 S0 L      default:  3 \; v) y$ ]8 |+ v
        System.out.println("好像没有这个面值的人民币吧。。。");  
" g4 g0 T2 K8 s  _4 k' _6 O    }  8 G. P1 }! O8 T- G+ w# |& L
  }  8 {7 X/ f0 [8 c! X/ }1 P5 K! y
}  
" }' e* \, R+ i  ]# W6 V' |. i/ r& v  t4 f# c& P7 p" C) h
7 n$ Q8 I! `% O) l0 m$ }) W* q5 O
switch是要在有限的可能值集合中进行选择,所以它与enum正是绝佳的组合。  ! q% O, n0 Y3 K
在Java SE 5之前,你必须花费大量的精力去保证与其等价的枚举类型是安全可用的,而现在,我们可以使用enum关键字类来创建枚举类型,然后直接使用所得到的类型,而不用过多地考虑它们。  
3 d! K, r# b; f/ `9 ~另外,我们使用enum的时候完全可以把它当成一个普通的类。  
5 L8 ^" u& W& ?. I9 p~我们可以在enum中添加新方法,甚至可以有main()方法。(如果要添加自己的方法,必须在enum实例序列的最后添加一个分号,而且,方法或属性只能定义在enum实例之后。)  1 x, z# v2 p9 k7 V8 L7 n2 B
~我们可以覆盖enum的方法。  
7 }. @3 e% T4 ]' r# e  o~由于Java不支持多继承,编译器为我们创建的enum类已经继承了java.lang.Enum类,所以我们定义的enum不能再继承其他任何类。  
& s1 ~7 u0 a+ ?' @7 V~enum可以实现一个或多个接口。  ' L, C# Y! H1 `' C
~还有很多枚举类型的特性,它可以跟多态、泛型、反射等特性结合使用。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-8 07:35 , Processed in 0.177570 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表