a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 146|回复: 1

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

[复制链接]
发表于 2012-8-4 12:19:50 | 显示全部楼层 |阅读模式
Java SE 5之前,Java程序员在需要使用枚举类型时,必须了解很多细节并需要格外仔细,以正确地产生enum的效果。  + E6 y+ y8 Z5 J" n9 D+ z' k) s
现在Java也有了enum,并且它的功能比C/C++中的枚举类型要完备得多。  : m8 O" _* |. e8 ]0 g
Java中定义一个枚举类型,如下:  3 f- H# x8 E/ w8 K
//Rmb.java  7 \1 O! f) ~8 @" i+ o
/** *//**  8 q* t! O2 s# U1 {6 d
* 表示人民币中的几种面值的enum类型  
+ h: a" P/ N/ F% L7 x2 [ * @author autumn  
" q$ {; J* f& H9 J */  
3 C% N6 l8 j$ I9 M% p, Cpublic enum Rmb ...{  # r% I/ {( L; j
  /** *//**  
6 W: a9 ^4 t6 M   * 壹角  
1 Q( J( M" \! q7 _9 ~8 r  H   */  " Y* Y1 c# S) t! N
  YIJIAO,  
) v. \# b6 U0 \$ c" ~
3 f$ d$ W5 i+ n* x4 \) l- q  /** *//**  ) E8 s3 W, R/ q8 r& z
   * 伍角  
+ Y& b- o9 }' F6 N   */  
2 p" ^2 A$ j. V  WUJIAO,  / M9 ~  `* n, b1 Z0 H

$ H+ a- ~/ B! c5 _  /** *//**  5 `  [8 o0 d5 U3 |) }2 u" K
   * 壹圆  ! M% x  a' U6 o% [
   */  ) t. j  y# H1 w# c& r( Z3 J
  YIYUAN,  
. k/ w+ H' a2 b
. \3 b. L+ v  L1 }) ?4 X  /** *//**  / h% X; K1 m% k% b' ^3 p* o
   * 伍圆  " n/ c; s/ S; F6 n# A! x
   */  
' ^. d5 T4 W. F! [7 N. Y$ m  WUYUAN,  " s8 p4 S# N5 S' x7 P

5 s  ~0 o' S# i! q. y  P  /** *//**  
) @8 d7 c/ I; i" V6 A   * 拾圆  
6 V/ D; u% m* N+ x* A   */  
7 R8 |6 M; P2 A+ u  SHIYUAN,  $ u+ E* ~, o0 ^0 P

% Z3 k7 E! Y, [  /** *//**  
% l) n, m) k2 u0 w5 r9 [2 ~5 q   * 伍拾圆  
) w& j' e1 R* J7 q   */  
% d+ E* q, {. L. f  WUSHIYUAN,  4 ?7 J4 D. o; z2 H8 ~2 [1 B

! F, r( z' U. ^6 J! G4 t2 f  /** *//**  
9 o+ g: f6 [: P   * 壹佰圆  ' Q2 `  l/ A$ H3 P% L
   */  2 c# k1 h3 J$ a  V
  YIBAIYUAN  
8 U6 }5 }+ }! |7 O}  
: D+ `5 J+ H& a/ h, Y6 b" d- Y8 d
" p2 f0 x6 {0 X; W7 r+ x7 Q这里创建了一个名为Rmb的枚举类型,它具有7个实例(值)。  
* v, V/ y9 A5 V: q枚举类型可以定义在一个单独的java源文件中(如上),也可以定义在其他java类内部。例如:  
+ I; t' T7 [# S; l0 E( ipublic class Card ...{  
& B6 c( ^) G' \0 Q3 A! |/ H+ w    public enum Rank ...{ DEUCE, THREE, FOUR, FIVE, SIX,  4 U" X" Y/ ~1 q: K8 T8 E: ~
        SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }  
" \5 d- b( n) t5 I$ h+ N* Y7 [2 Z: v+ O! i8 K8 V
    public enum Suit ...{ CLUBS, DIAMONDS, HEARTS, SPADES }  
( E. a0 J/ P- E9 y2 f! x
- b# ^2 X7 o; {, j4 _. u    private final Rank rank;  
8 d+ d, x* N' G9 b# k    private final Suit suit;  
/ n3 w# \) L8 M/ w1 |3 A# w. M    private Card(Rank rank, Suit suit) ...{  
! D  x( ]" B; x* m; H        this.rank = rank;  & t  x& ]: Y* q4 D* T
        this.suit = suit;  2 f$ `( i5 B! R9 M. ?
    }  ( a' Y7 o$ ]: J/ N# M+ V8 l
6 O; C* v1 y( u" u8 ?5 C$ i" K
    public Rank rank() ...{ return rank; }  , I! C# z% x, r  f; ?, p! {
    public Suit suit() ...{ return suit; }  
6 N7 {( D- E: @1 [4 u7 p    public String toString() ...{ return rank + " of " + suit; }  / s: {8 i' ]2 z' @$ ^  E/ g1 ?/ M$ b
}
回复

使用道具 举报

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

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

枚举类型的实例是常量(public static final),因此按命名惯例,它们都用大写字母表示。  3 N+ H( Q  P- Q
现在,你可以使用这个Rmb的枚举类型了。例如:  % W; X0 d& j3 r$ W! B6 S0 p5 ?: _3 l
Rmb aRMB = Rmb.YIBAIYUAN;  
) }) |( o) F& J/ K. d6 c& genum看起来像个新的数据类型,实际上enum就是一个类,它继承自Java SE 5的库中 java.lang.Enum,并有自己的方法。我们使用enum关键字时,编译器会生成对应的类。  3 k/ q: A5 y, @
有关enum类的方法,大家可以自行查看API文档。  
; G$ Y9 |/ t7 u4 D8 Y/ p6 k这里介绍一个特别实用的特性,即它可以在switch语句内使用:  
4 p6 c: f* |$ s1 O//EnumTest.java  : |( P  L0 t; B0 I; U: d
5 A1 v. ~7 O/ h- z5 L- ?9 X
/** *//**  
* T$ G1 @9 ]' z * enum测试  % L" i' t: i1 z9 `, x
* @author autumn  
) c) \8 I# w8 O( Y: U* @: ~  X */  
1 R; n5 a- L1 s( {  j2 G# Wpublic class EnumTest ...{  4 h5 I: x8 d  g( K! r6 x5 e

$ |3 T/ e! \$ X  public static void main(String[] args) ...{  
( L" `5 X8 }" n$ V( C& O    Rmb aRmb = Rmb.WUYUAN;  / u3 }7 F1 b* }, v, ?
    descRmb(aRmb);  
% e% G. ~6 {1 o, _% y9 p  }  
6 Q; Y# ^2 B0 f% V5 e; V7 _$ G. I9 d0 ?# d- ~
  /** *//**  
) P) Z) M- I: ?8 D9 t9 N$ Y8 p: S# }, t   * 描述Rmb类型的方法  
3 V; u% m3 `3 N   * @param aRMB Rmb类型的值  3 y4 W7 n* ^' j4 i9 P8 ]
   */  * k, R( N2 w( r
  public static void descRmb(Rmb aRMB) ...{  
7 y) N- P/ m" g    switch (aRMB) ...{  
$ Z1 \9 m' b) y# `2 J$ K      case YIJIAO:  
5 V: f1 }/ A6 ^        System.out.println("这是一张壹角的人民币。");  
; S; |; j  A! j) k$ n% Q+ l        break;  
" W0 S9 r% C$ q- {) }      case WUJIAO:  ; W0 L+ x& r" q" I
        System.out.println("这是一张伍角的人民币。");  
0 ?1 ?! M" Y. {% }( }! ?        break;  
, u4 g% W2 I$ M/ X' z1 a      case YIYUAN:  8 J, z( `  B% Y. n
        System.out.println("这是一张壹圆的人民币。");  
% B5 t! G; _$ m' t! x0 r: e        break;  
8 q1 N1 |, m  O3 q2 ~8 ?% }3 k! n      case WUYUAN:  
: i; X# z+ P5 A# b3 H2 I) m        System.out.println("这是一张伍圆的人民币。");  
! {4 J1 {% `6 U! y; Z8 S- c4 o        break;  $ J. Q4 W2 h; O6 G
      case SHIYUAN:  
0 e0 `1 g- T7 z8 R' t  h        System.out.println("这是一张拾圆的人民币。");  ! ], W1 j; M9 Q' T# n" {) H0 K
        break;  
! f- v8 T. c3 F- o: v      case WUSHIYUAN:  
% b  P' |; y& t8 _        System.out.println("这是一张伍拾圆的人民币。");  
5 M7 v2 A; I( D  \! V% a2 e        break;  
+ ]) j' I2 j3 e8 m- n; F" k& B      case YIBAIYUAN:  
( T. e1 ~& Y4 M' [1 u. F        System.out.println("这是一张壹佰圆的人民币。");  
. b" z/ ^# K, \        break;  ) y- l; S% n% n: A+ k
      default:  
% r5 ~* ~3 w' z- u+ b        System.out.println("好像没有这个面值的人民币吧。。。");  
* _1 a" B; J* ~2 c    }  
; o4 c0 k0 M/ {' G4 x9 y1 ^  }  ! J0 |7 Z4 o: r) F7 g4 @2 x
}  
/ D/ m6 C+ x4 D: ^" N4 x& m" V  O* Q+ ]7 z& s, g7 V3 @0 y% k

0 H/ x6 Q* N, A: e& s2 |, B0 Zswitch是要在有限的可能值集合中进行选择,所以它与enum正是绝佳的组合。  
- T0 y( R. P2 b: ?9 m5 z在Java SE 5之前,你必须花费大量的精力去保证与其等价的枚举类型是安全可用的,而现在,我们可以使用enum关键字类来创建枚举类型,然后直接使用所得到的类型,而不用过多地考虑它们。  
4 D' Z2 C5 _3 k4 |* N另外,我们使用enum的时候完全可以把它当成一个普通的类。  2 s* p# q) |* }/ ?! ?
~我们可以在enum中添加新方法,甚至可以有main()方法。(如果要添加自己的方法,必须在enum实例序列的最后添加一个分号,而且,方法或属性只能定义在enum实例之后。)  
4 u/ _/ M: a* f5 j$ E0 t~我们可以覆盖enum的方法。  * _' z: f6 b# W. m0 n
~由于Java不支持多继承,编译器为我们创建的enum类已经继承了java.lang.Enum类,所以我们定义的enum不能再继承其他任何类。  
1 H4 S( g5 {+ H# w5 R~enum可以实现一个或多个接口。  
. ^5 s+ o! z+ g$ X+ H7 r6 C~还有很多枚举类型的特性,它可以跟多态、泛型、反射等特性结合使用。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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