一个枚举类型的基类for j2se 1.4

Posted on 2006-04-26 22:09 iceboundrock 阅读(908) 评论(0)  编辑  收藏 所属分类: J2SE随笔
 1 import  java.util.HashMap;
 2
 3 /**
 4  * 枚举类型的基类
 5  *  @author  Richard Lee
 6  *
 7   */

 8 public   abstract   class  EnumBase  {
 9
10      ////////////////////////////////////////// /
11      // 成员变量
12      private   final  String name;
13      private   int  value  =   - 1 ;
14
15     
16      ////////////////////////////////////////// /
17      // 类静态变量
18      private   static   final  HashMap valueCollection  =   new  HashMap();
19      private   static   final  HashMap nameCollection  =   new  HashMap();
20     
21      ////////////////////////////////////////// /
22      // 类静态方法
23      public   static  EnumBase valueOf(Class enumType ,  int  value) {
24          return  (EnumBase)valueCollection.get(getEnumValueKey(enumType, value));
25     }

26     
27      public   static  EnumBase parse(Class enumType , String s) {
28          return  (EnumBase)nameCollection.get(getEnumNameKey(enumType , s));
29     }

30     
31      private   static  String getEnumValueKey(Class enumClass,  int  value)  {
32          return  enumClass.getName()  +   " , "   +  value;
33     }

34
35      private   static  String getEnumNameKey(Class enumType , String name) {
36          return  enumType  +   " , "   +  name;
37     }

38     
39      ////////////////////////////////////////// /
40      // 构造函数
41      protected  EnumBase(String name) {
42         checkName(name);
43          this .name  =  name;
44         nameCollection.put(getEnumNameKey(name) ,  this );
45     }

46     
47      protected  EnumBase(String name ,  int  value) {
48          this (name);
49         
50         checkValue(value);
51          this .value  =  value;
52         valueCollection.put(getEnumValueKey(value) ,  this );
53     }

54
55     
56      ////////////////////////////////////////// /
57      // 成员函数
58      private  String getEnumNameKey(String name)  {
59          return  getEnumNameKey( this .getClass() , name);
60     }

61
62      private   void  checkName(String name)  {
63          if ( null   ==  name  ||   "" .equals(name)) {
64              throw   new  IllegalArgumentException( " Element name can not be null or empty. " );
65         }

66          if (nameCollection.containsKey(getEnumNameKey(name))) {
67              throw   new  IllegalStateException( " The name of enum element already exist. " );
68         }

69     }

70     
71      private   void  checkValue( int  value)  {
72          if (value  <   0 ) {
73              throw   new  IllegalArgumentException( " Element value must not less than 0. " );
74         }

75          if (valueCollection.containsKey(getEnumValueKey(value))) {
76              throw   new  IllegalStateException( " This value of enum element already exist. " );
77         }

78     }

79
80      private  String getEnumValueKey( int  value)  {
81          return  getEnumValueKey( this .getClass() , value);
82     }

83
84      public  String toString()  {
85          return  name;
86     }

87     
88      public   int  getValue()  {
89          if (value  >   - 1 ) {
90              return  value;
91         }
else {
92              throw   new  IllegalStateException( " This enum class has no value " );
93         }

94     }

95 }

96

使用范例:

public   class  VaildEnum  extends  EnumBase  {

 
protected  VaildEnum(String name ,  int  value)  {
  
super (name , value);
 }

 
 
public   static   final  VaildEnum Rule  =   new  VaildEnum( " Rule "  ,  1 );
 
public   static   final  VaildEnum OU  =   new  VaildEnum( " OU "  ,  2 );
}

该枚举基类对于j2sdk中常用的整型常量或者字符串型常量的优点:1.  类型安全。2.性能提高(比字符串常量型)。3.在IDE中使用时会有提示,无需翻看SDK文档。
缺点:1.编写略微麻烦。

如果发现代码中的bugs,欢迎您评论,非常感谢。


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 10, comments - 15, trackbacks - 0, articles - 0

Copyright © iceboundrock