a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 160|回复: 1

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

[复制链接]
发表于 2012-8-4 12:19:50 | 显示全部楼层 |阅读模式
Java SE 5之前,Java程序员在需要使用枚举类型时,必须了解很多细节并需要格外仔细,以正确地产生enum的效果。  0 G, [, m! R7 o+ S
现在Java也有了enum,并且它的功能比C/C++中的枚举类型要完备得多。  
9 I/ W3 U( Z8 k3 o! L* J8 mJava中定义一个枚举类型,如下:  
  F  |/ l  T8 L//Rmb.java  / l5 }2 o  K8 m/ S) k* e) F
/** *//**  
! ]! h+ v  H$ A) \. a  z% Y * 表示人民币中的几种面值的enum类型  ) h, d* x' \6 b
* @author autumn  
- M9 Y7 ?+ H) X1 {3 { */  
9 C9 }3 r( W3 o: N% Jpublic enum Rmb ...{  / k9 y( }/ ~8 r
  /** *//**  1 V4 r( e/ W" L) I8 h  D/ L7 ^1 H
   * 壹角  8 y* K  t$ h& i6 y
   */  / A2 C& o2 r% h" n% U( l; `: E
  YIJIAO,  % @+ @" f; s- g8 l( z
7 V0 s8 b! Q; B3 u$ E
  /** *//**  6 ?; ]& d2 }9 O5 p- a# q
   * 伍角  * N2 w  C8 {! R6 \7 n% n" ]
   */  
2 a  C. \$ V+ M7 \1 t; _  o' q/ {# ~  WUJIAO,  
8 ~1 ~5 {4 y" F
/ y, _* ~+ F" h" X+ e; J  /** *//**  
0 v" d% M* e' w  k% f$ {   * 壹圆  . d' \; T5 E6 |, G$ Z9 J
   */  
+ W* g4 h# G! [  YIYUAN,  
, u) ^9 {# o# X6 S. d0 O- P4 }. Y* @3 M9 U9 d# X7 \; ?
  /** *//**  ) A3 Z! d" ]2 s
   * 伍圆  $ b" ]0 D0 N1 d) p
   */  
, T7 x# \6 r. k# A/ [  WUYUAN,  1 f0 A. ], x1 U: R7 [

) p5 N0 O& T* d- V# `  /** *//**  
1 x* \: r/ O8 |, f- A   * 拾圆  
0 W8 m" j0 ^" R   */  
# Y0 i6 M- E) M* a  SHIYUAN,  2 H# b0 }) C6 p( `: {7 Q& A

8 V# t* X" K$ Y; ?4 A) k* {  /** *//**  0 e4 K/ }6 A9 v" {" G3 M
   * 伍拾圆  2 j4 {/ q# ?) ~0 R7 l) n
   */  " d& C5 a0 A& D6 T% {" }9 s
  WUSHIYUAN,  
( i5 k, j6 Z3 V; I# `$ k  Q: G7 x$ |/ H5 c. ?
  /** *//**  
/ d$ E/ R$ J2 d  E   * 壹佰圆  $ t3 ?8 C0 Q! Y2 W3 C! H, w) r! R
   */  
6 j5 S7 ]: s* D- b" y1 P* O2 c  F! [  YIBAIYUAN  / ?* x* u/ n! Z% Q& b% T9 l
}  / u' I3 I' l) ^" O1 J& r

0 ]- Y$ _2 }* q这里创建了一个名为Rmb的枚举类型,它具有7个实例(值)。  
0 y1 g/ A$ O! G4 H  u: o枚举类型可以定义在一个单独的java源文件中(如上),也可以定义在其他java类内部。例如:  8 ~. J0 M' U; K1 N* D
public class Card ...{  
( `$ B; M2 c  V5 I9 o2 _: B( z. f    public enum Rank ...{ DEUCE, THREE, FOUR, FIVE, SIX,  8 \8 r3 M! `, b0 I
        SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }  
1 f) T7 W0 u1 }$ A8 W5 o8 b. N. G
  f. J! t$ c( L2 F& w( Y    public enum Suit ...{ CLUBS, DIAMONDS, HEARTS, SPADES }  
- c- O2 ^5 o" v- W8 e: ^
7 v6 T8 H9 x9 r, F6 Q. u( \    private final Rank rank;  
! Y4 K! {% H4 n7 q4 S' v! g& K    private final Suit suit;  6 A6 s. E: v, h# @$ b) n9 D
    private Card(Rank rank, Suit suit) ...{  
3 }+ x  T* f0 v4 v4 u/ t; b1 Y        this.rank = rank;  3 P/ X( G- `6 w9 d) N2 h1 i. F
        this.suit = suit;  
* m  @7 l; X7 a6 @    }    b. z2 u6 A) M  c$ x1 I, n
* y2 ~5 T* ^8 s
    public Rank rank() ...{ return rank; }    a9 n% P* [# w5 ]3 k. E
    public Suit suit() ...{ return suit; }  
6 l6 t% U- r' x( b- g0 R5 A% \: W0 y    public String toString() ...{ return rank + " of " + suit; }  $ ]1 x2 D+ e3 d
}
回复

使用道具 举报

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

JavaSE5中的枚举类型的使用方法

枚举类型的实例是常量(public static final),因此按命名惯例,它们都用大写字母表示。  
% S% ?; F0 H$ o3 ^" C; `' x现在,你可以使用这个Rmb的枚举类型了。例如:  
, q. g1 i) }$ ~: C) kRmb aRMB = Rmb.YIBAIYUAN;  : e6 y- P, ^+ @
enum看起来像个新的数据类型,实际上enum就是一个类,它继承自Java SE 5的库中 java.lang.Enum,并有自己的方法。我们使用enum关键字时,编译器会生成对应的类。  
. V- @7 |) p* s' ?$ c% n2 p. E有关enum类的方法,大家可以自行查看API文档。  7 |7 i, l0 O5 t8 j5 R* l
这里介绍一个特别实用的特性,即它可以在switch语句内使用:  1 r$ A% ~  ~* J+ t
//EnumTest.java  
: L/ X3 L4 z) }* k9 y* k" k- _* Y9 c  ]$ B$ _
/** *//**  
8 J5 E# ]# E$ N! n( Y * enum测试  
* t& G; r# ?/ u) t. {. x' P * @author autumn  8 B9 S2 B5 k9 l3 C0 _' J
*/  
' b8 o: K: u3 N* ppublic class EnumTest ...{  ) S: F5 J! M4 @4 o/ m

2 R  U8 o5 C9 ~; E  public static void main(String[] args) ...{  1 u0 m; R, `" U3 A. d9 L4 W
    Rmb aRmb = Rmb.WUYUAN;  ( f" h: }. S) G' r5 R9 D
    descRmb(aRmb);  $ q# U4 [! r, C! S/ X/ g5 D
  }  
+ }% C( Z1 W% C. {3 {& w/ J! f# t: ?% W9 `$ d+ o
  /** *//**  
1 m% _2 F& a- D: T   * 描述Rmb类型的方法  
6 z. u" S+ j% c& H5 n$ R   * @param aRMB Rmb类型的值  
8 z8 Y  T- X- P+ q% q5 ?( }   */  
1 X$ [3 n4 m, q# K  L  public static void descRmb(Rmb aRMB) ...{  
" B, @! T6 z  s8 D2 |) U    switch (aRMB) ...{  + W9 l  u  [4 p0 i
      case YIJIAO:  7 b+ |/ \6 e4 k# l( `% X
        System.out.println("这是一张壹角的人民币。");  
6 M  S: y9 K2 J& M" w        break;  1 x7 d8 n# u) o0 M6 v. h; m$ \
      case WUJIAO:  ( @* E1 d0 u% }  X' B: c
        System.out.println("这是一张伍角的人民币。");  
( O( h# U& a; U8 L" @        break;  - I+ E8 R% ]: z) [! c  x" c. z& Q
      case YIYUAN:  * x2 Z) z9 r7 m6 ~- a+ s
        System.out.println("这是一张壹圆的人民币。");  
4 {4 G+ J1 V/ T# w8 x/ V+ t        break;  
4 ?8 _4 b* n: R2 D* `/ a      case WUYUAN:  ; m+ T8 T0 P" \- m5 l" h: X
        System.out.println("这是一张伍圆的人民币。");  
" V4 q' r) u# \        break;  
# a! ?7 F0 v1 N+ _7 R/ {2 w      case SHIYUAN:  & C) {1 H( T  \6 K8 D2 P! w9 a& @: ]- W
        System.out.println("这是一张拾圆的人民币。");  
: B) ^% U' B5 O1 \  J        break;  # X" w5 r! I) w( [& w) `% W2 S
      case WUSHIYUAN:  
: l" V% q" e! f! b& m  _2 l        System.out.println("这是一张伍拾圆的人民币。");  
, @3 u; k, I6 k        break;  
% p( y  c5 o! E+ @9 u      case YIBAIYUAN:  
# @& Z: |. @) ^1 e        System.out.println("这是一张壹佰圆的人民币。");  
4 w! L' t  }7 Y- }. B        break;  # {4 Y9 \& A$ o# d4 N+ E8 w
      default:  
4 t0 @0 i- c2 @# C8 L        System.out.println("好像没有这个面值的人民币吧。。。");  ( m* U! _0 z+ L* E
    }  
. g1 ]9 z) u: h$ |4 d1 A1 g  p  }  
0 o6 ~* ~4 F) I$ B7 ?6 h) B8 ^}  " N8 X! Z; p: _2 E

9 b  U1 {' h3 C/ [3 \+ N: E5 n
7 N/ O2 v! l* X/ L& u! fswitch是要在有限的可能值集合中进行选择,所以它与enum正是绝佳的组合。  $ o9 ]( {3 q( }/ C' W1 u
在Java SE 5之前,你必须花费大量的精力去保证与其等价的枚举类型是安全可用的,而现在,我们可以使用enum关键字类来创建枚举类型,然后直接使用所得到的类型,而不用过多地考虑它们。  - m) m1 O  p! z
另外,我们使用enum的时候完全可以把它当成一个普通的类。  
2 Y# A* c3 e- T1 e~我们可以在enum中添加新方法,甚至可以有main()方法。(如果要添加自己的方法,必须在enum实例序列的最后添加一个分号,而且,方法或属性只能定义在enum实例之后。)  
" t8 b; u* t; `# q6 I~我们可以覆盖enum的方法。  9 x, G; V/ n7 L. g
~由于Java不支持多继承,编译器为我们创建的enum类已经继承了java.lang.Enum类,所以我们定义的enum不能再继承其他任何类。  . y) @# E5 f- W9 I
~enum可以实现一个或多个接口。  
. r( v# E/ U3 e  P$ ?~还有很多枚举类型的特性,它可以跟多态、泛型、反射等特性结合使用。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 08:20 , Processed in 0.185731 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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