`
chenlong_1988
  • 浏览: 182991 次
  • 性别: Icon_minigender_2
社区版块
存档分类

enum

 
阅读更多

 



  1. java枚举(enum)学习  
  2. 来自:www.java1995.org 作者: 爪娃   
  3. 2009-06-06 浏览(138) 评论(0) 发表评论   
  4. 摘要: Java中的枚举是在JDK1.5才引进的,使用enum为关键字,是一种新的类型,允许用常量来表示数据片断。所有的枚举类型都是java.lang.Enum类的子类,枚举内的常量用‘,’分隔开,若后面还有语句,则最后一个常量后面要用‘;’,枚举...  
  5. Java中的枚举是在JDK1.5才引进的,使用enum为关键字,是一种新的类型,允许用常量来表示数据片断。所有的枚举类型都是java.lang.Enum类的子类,枚举内的常量用‘,’分隔开,若后面还有语句,则最后一个常量后面要用‘;’,枚举中的常量默认都是public static final,这就是为什么枚举中的常量建议全大写的原因,虽然它默认是public static final,但你在声明常量时却不能显式使用public static final,否则编译器反而会报错误。枚举常量实际就是格举类型的实例,它的初始化是依靠java.lang.Enum类的构造方法来的,见下:  
  6.     
  7. Java代码    
  8. 1.  // java.lang.Enum中定义的构造函数,         
  9. 2.  // 两个参数分别是定义的枚举常量名称以及它所在的次序。         
  10. 3.  protected Enum(String name, int ordinal) {         
  11. 4.          
  12. 5.    this.name = name;         
  13. 6.          
  14. 7.    this.ordinal = ordinal;         
  15. 8.          
  16. 9.  }       
  17.    
  18. 第一个枚举常量的值默认是0,其它的依次加1.  
  19. 下面先看下简单的枚举类的定义:  
  20. Java代码    
  21. 1.  public enum Colors{      
  22. 2.     RED,BLUE,GREEN,YELLOW,GRAY;      
  23. 3.     //GRAY后面若没有其它的语句,则其后面的分号可不写,若后面有语句则必须添加      
  24. 4.  }     
  25.    
  26. 下面看个简单的应用:  
  27.    
  28. Java代码    
  29. 1.  package com.iwtxokhtd.enums;      
  30. 2.       
  31. 3.  /**    
  32. 4.   * @author Administrator    
  33. 5.   *    
  34. 6.   */     
  35. 7.  public enum Colors {      
  36. 8.       
  37. 9.      /**    
  38. 10.      * 定义一个颜色枚举类    
  39. 11.      */     
  40. 12.     RED,      
  41. 13.     GREEN,      
  42. 14.     BLUE,      
  43. 15.     YELLOW,      
  44. 16.     GRAY;      
  45. 17. }      
  46. 18/**    
  47. 19.  * 测试枚举类型    
  48. 20.  */     
  49. 21package com.iwtxokhtd.enums;      
  50. 22.      
  51. 23/**    
  52. 24.  * @author Administrator    
  53. 25.  *    
  54. 26.  */     
  55. 27public class EnumTest {      
  56. 28.      
  57. 29.     public static void printColor(Colors color){      
  58. 30.         //用switch,在jdk1.5以后其参数支持enum,而不仅仅是int,short,char,byte      
  59. 31.         switch(color){      
  60. 32.         case RED:      
  61. 33.             System.out.println("这是红色");      
  62. 34.             break;      
  63. 35.         case GREEN:      
  64. 36.             System.out.println("这是绿色");      
  65. 37.             break;      
  66. 38.         case BLUE:      
  67. 39.             System.out.println("这是蓝色");      
  68. 40.             break;      
  69. 41.         case YELLOW:      
  70. 42.             System.out.println("这是黄色");      
  71. 43.             break;      
  72. 44.         case GRAY:      
  73. 45.             System.out.println("这是灰色");      
  74. 46.             break;      
  75. 47.             default:      
  76. 48.                 System.out.println("其它色");      
  77. 49.         }      
  78. 50.     }      
  79. 51.     public static void main(String []args){      
  80. 52.         //打印蓝色      
  81. 53.         printColor(Colors.BLUE);      
  82. 54.     }      
  83. 55. }     
  84.    
  85.    
  86. 使用EnumMap  
  87. EnumMap是为枚举类型定做的Map实现,它比其它的Map实现能更高效地完成枚举类型实例到值的映射,EnumMap内部使用枚举类型的ordinal()方法得到当前实例的声明次序。  
  88. 见示例:  
  89.    
  90. Java代码    
  91. 1.  /**    
  92. 2.   * EnumMap测试    
  93. 3.   */     
  94. 4.  package com.iwtxokhtd.enums;      
  95. 5.       
  96. 6.  import java.util.EnumMap;      
  97. 7.       
  98. 8.  /**    
  99. 9.   * @author Administrator    
  100. 10.  *    
  101. 11.  */     
  102. 12public class EnumMapTest {      
  103. 13.      
  104. 14.     private  EnumMap<Colors,String> colors=new EnumMap<Colors,String>(Colors.class);      
  105. 15.     public EnumMapTest(){      
  106. 16.         colors.put(Colors.RED, "红色");      
  107. 17.         colors.put(Colors.BLUE, "蓝色");      
  108. 18.         colors.put(Colors.GRAY, "灰色");      
  109. 19.         colors.put(Colors.GREEN, "绿色");      
  110. 20.         colors.put(Colors.YELLOW, "黄色");      
  111. 21.     }      
  112. 22.     //取得颜色      
  113. 23.     public  String getColor(Colors color){      
  114. 24.         return  colors.get(color);      
  115. 25.     }      
  116. 26.     public static void main(String []args){      
  117. 27.         System.out.println(new EnumMapTest().getColor(Colors.BLUE));      
  118. 28.     }      
  119. 29.           
  120. 30. }     
  121.    
  122. 枚举其实是个类,下面来看看枚举作为一个类的使用:  
  123.    
  124. 下面我们将以前的那些类定义放到一个类中,见代码:  
  125.    
  126.    
  127. Java代码    
  128. 1.  /**    
  129. 2.   * 枚举改造    
  130. 3.   */     
  131. 4.  package com.iwtxokhtd.enums;      
  132. 5.       
  133. 6.  import java.util.EnumSet;      
  134. 7.       
  135. 8.  /**    
  136. 9.   * @author Administrator    
  137. 10.  *    
  138. 11.  */     
  139. 12enum AnotherColors{      
  140. 13.     RED,GREEN,BLUE,YELLOW,GRAY;      
  141. 14.     public  String  printColor(){      
  142. 15.         switch(this){      
  143. 16.         case RED:      
  144. 17.             return "这是红色";      
  145. 18.         case GREEN:      
  146. 19.             return "这是绿色";      
  147. 20.         case BLUE:      
  148. 21.             return "这是蓝色";      
  149. 22.         case YELLOW:      
  150. 23.             return "这是黄色";      
  151. 24.         case GRAY:      
  152. 25.             return "这是灰色";      
  153. 26.         default:      
  154. 27.             return "其它色";      
  155. 28.         }      
  156. 29.     }      
  157. 30. }      
  158. 31public class OneClassTest {      
  159. 32.      
  160. 33.     public static void main(String []args){      
  161. 34.         //EnumSet.allOf()是指以AnotherColors的全部变量为Set的值,详情见JDK文档      
  162. 35.         for(AnotherColors color:EnumSet.allOf(AnotherColors.class)){      
  163. 36.             System.out.println("定义的颜色信息是:"+color.printColor());      
  164. 37.                   
  165. 38.         }      
  166. 39.     }      
  167. 40. }     
  168.    
  169. 枚举类型也允许定义自己的构造方法如:  
  170.    
  171. Java代码    
  172. 1.  /**    
  173. 2.   * 枚举类型允许定义自己的构造方法    
  174. 3.   */     
  175. 4.  package com.iwtxokhtd.enums;      
  176. 5.       
  177. 6.  import java.util.EnumSet;      
  178. 7.       
  179. 8.  /**    
  180. 9.   * @author Administrator    
  181. 10.  *    
  182. 11.  */     
  183. 12enum ConstructorEnum{      
  184. 13.     RED("red","红色"),      
  185. 14.     GREEN("green","绿色"),      
  186. 15.     BLUE("blue","蓝色"),      
  187. 16.     YELLOW("yellow","黄色"),      
  188. 17.     GRAY("gray","灰色");      
  189. 18.           
  190. 19.     //枚举类的字段或属性必须定义在枚举常量的后面      
  191. 20.     private String color;      
  192. 21.     private String message;      
  193. 22.     //默认是private型      
  194. 23.     ConstructorEnum(String color,String message){      
  195. 24.               
  196. 25.         this.color=color;      
  197. 26.         this.message=message;      
  198. 27.     }      
  199. 28.     public String getColor() {      
  200. 29.         return color;      
  201. 30.     }      
  202. 31.     public String getMessage() {      
  203. 32.         return message;      
  204. 33.     }      
  205. 34. }      
  206. 35public class NewEnumTest {      
  207. 36.      
  208. 37.     public static void main(String []args){      
  209. 38.         for(ConstructorEnum color:EnumSet.allOf(ConstructorEnum.class)){      
  210. 39.             System.out.println("颜色键为:"+color.getColor());      
  211. 40.             System.out.println("颜色值为:"+color.getMessage());      
  212. 41.         }      
  213. 42.     }      
  214. 43. }     
  215.    
  216.    
  217.    
  218. 使用枚举类型注意事项:  
  219. (1) 枚举类型不能使用extends关键字,但是可以使用implements关键字。这样我们可以把不同枚举类型共有的行为提取到接口中,来规范枚举类型的行为。   
  220. (2) 枚举类型的自定义构造函数并不能覆盖默认执行的构造函数,它会跟在默认构造函数之后执行。   
  221. (3) 枚举类型的自定义构造函数必须是私有的,但你不能显式加private,否则会出错  
  222.  (4)枚举类型中枚举常量的定义必须放在最上面,其后才能是变量和方法的定义。  
  223.    
  224. 下面学下枚举类的自定义方法,见代码:  
  225.    
  226.    
  227. Java代码  
  228. 1.  /**    
  229. 2.   * 在枚举类里使用自定义方法    
  230. 3.   */     
  231. 4.  package com.iwtxokhtd.enums;      
  232. 5.       
  233. 6.  import java.util.EnumSet;      
  234. 7.       
  235. 8.  /**    
  236. 9.   * @author Administrator    
  237. 10.  *    
  238. 11.  */     
  239. 12enum MethodEnum{      
  240. 13.     RED{      
  241. 14.         public void printColor(){      
  242. 15.             System.out.println("红色");      
  243. 16.         }      
  244. 17.     },      
  245. 18.           
  246. 19.     GREEN{      
  247. 20.         public void printColor(){      
  248. 21.             System.out.println("绿色");      
  249. 22.         }      
  250. 23.     },      
  251. 24.           
  252. 25.     BLUE{      
  253. 26.         public void printColor(){      
  254. 27.             System.out.println("蓝色");      
  255. 28.         }      
  256. 29.     },      
  257. 30.           
  258. 31.     YELLOW{      
  259. 32.         public void printColor(){      
  260. 33.             System.out.println("黄色");      
  261. 34.         }      
  262. 35.     },      
  263. 36.           
  264. 37.     GRAY{      
  265. 38.         public void printColor(){      
  266. 39.             System.out.println("灰色");      
  267. 40.         }      
  268. 41.     };      
  269. 42.     public  abstract void printColor();      
  270. 43. }      
  271. 44public  class MethodEnumTest {      
  272. 45.      
  273. 46.     //测试使用自定义的方法来打印枚举类的常量值      
  274. 47.     public static void main(String []args){      
  275. 48.         for(MethodEnum color:EnumSet.allOf(MethodEnum.class)){      
  276. 49.             color.printColor();      
  277. 50.         }      
  278. 51.     }      
  279. 52. }     
  280.    
  281.    
  282. 下面来看下,如何通过相关的数据反过来查找枚举类中的项,解释见下面的代码:  
  283. Java代码  
  284. 1.  /**    
  285. 2.   * 通过相关的数据来查找对应的枚举项    
  286. 3.   */     
  287. 4.  package com.iwtxokhtd.enums;      
  288. 5.       
  289. 6.  import java.util.EnumSet;      
  290. 7.  import java.util.HashMap;      
  291. 8.  import java.util.Map;      
  292. 9.       
  293. 10/**    
  294. 11.  * @author Administrator    
  295. 12.  *    
  296. 13.  */     
  297. 14enum SearchEnum{      
  298. 15.     RED(0),      
  299. 16.     GREEN(1),      
  300. 17.     BLUE(2),      
  301. 18.     YELLOW(3),      
  302. 19.     GRAY(4);      
  303. 20.     //使用静态的Map把相关的数据与枚举项关联起来      
  304. 21.     private static final Map<Integer,SearchEnum> search=new HashMap<Integer,SearchEnum>();       
  305. 22.     //把有的关联项放到Map里      
  306. 23.     static{      
  307. 24.         for(SearchEnum color:EnumSet.allOf(SearchEnum.class)){      
  308. 25.             search.put(color.getI(), color);      
  309. 26.         }      
  310. 27.     }      
  311. 28.     private int i;      
  312. 29.     SearchEnum(int i){      
  313. 30.         this.i=i;      
  314. 31.     }      
  315. 32.     public int getI(){      
  316. 33.         return i;      
  317. 34.     }      
  318. 35.     //查找      
  319. 36.     public static SearchEnum get(int i){      
  320. 37.         return search.get(i);      
  321. 38.     }      
  322. 39. }      
  323. 40public class SearchEnumTest {      
  324. 41.     //测试查找      
  325. 42.     public static void main(String []args){      
  326. 43.         //查找BLUE      
  327. 44.         System.out.println(SearchEnum.get(2));      
  328. 45.     }      
  329. 46. }     
  330.    
  331. 枚举的学习先到这里,注意:枚举在某些场合使用还是比较方便的,如:定义时间日期常量、颜色常量、身高离散常量、物品的尺寸等,但千万不要滥用。  

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics