`
chenlong_1988
  • 浏览: 185483 次
  • 性别: 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. 枚举的学习先到这里,注意:枚举在某些场合使用还是比较方便的,如:定义时间日期常量、颜色常量、身高离散常量、物品的尺寸等,但千万不要滥用。  

 

分享到:
评论

相关推荐

    enum类型重定义解决方法

    在编程中,`enum`(枚举)类型是用来定义一组命名的整数常量,它在C++中被广泛使用。然而,在某些情况下,我们可能会遇到`enum`类型的重定义问题,这通常发生在包含不同库或者头文件时,因为这些库可能已经定义了...

    C++中枚举类型(enum)

    ### C++中的枚举类型(Enum) 在C++编程语言中,枚举(`enum`)是一种用户定义的类型,它由一组具有整数值的命名常量组成。这些值可以被程序用来代替数字,使代码更具可读性,并且能够表示特定范围内的固定集合。 ...

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    opc enum 32-64安装包

    OPC Enum 32-64 安装包是一款专为处理32位和64位操作系统设计的OPC组件,确保在不同系统环境下能稳定、高效地工作。 OPC Core Component是OPC技术的核心组成部分,它提供了基本的OPC服务,如数据访问(OPC DA,OPC ...

    WPF 中一组 RadioButton 向 Enum 的绑定

    其中一个常见的需求是将RadioButton组与枚举类型(Enum)进行绑定,以便用户通过选择不同的RadioButton来设置某个属性的值。枚举是一种强大的数据类型,它允许我们定义一组具有特定名称的常量,这些常量通常代表某种...

    enum 结构分析源码

    枚举(enum)在编程语言中是一种非常基础且重要的数据类型,它允许程序员定义一组预定义的常量,这些常量通常表示特定的值或状态。在这个“enum 结构分析源码”资源中,我们主要关注的是C语言中的枚举使用和实现。...

    enum类型被intent所携带时各种情况的示例代码

    然而,对于enum(枚举)类型,由于它不是Android系统默认支持的数据传递类型,所以在使用Intent传递enum时需要特别处理。本教程将详细讲解enum类型如何与Intent结合,以及在不同情况下如何实现数据传输。 首先,让...

    java enum 枚举 学习资料

    "Java Enum 枚举学习资料" Java Enum 枚举学习资料是 Java 编程语言中的一种特殊类型,它主要用来实现一组固定的常量。 Enum 枚举类型是 Java 5 中引入的一种新特性,旨在解决传统的 int 枚举常量的缺陷。 1. 枚举...

    Options:有时在某些情况下,您想在OptionSet中使用Enum或希望Enum由Raw的Int类型支持,但同时也具有String标签

    选项Swift软件包,用于更强大的Enum类型。 目录介绍特征安装用法设置一个MappedValueRepresentable枚举使用MappedValueCollectionRepresented 使用MappedEnum类型的可编码枚举在ESet中使用OptionSet中的EnumSet 将...

    Java enum的用法详解

    Java enum 的用法详解 Java enum(枚举)是一种特殊的数据类型,用于定义一组固定的常量。从 JDK 1.5 开始,Java 引入了 enum 机制,解决了传统的常量定义方式的不足。 用法一:常量 在 JDK 1.5 之前,我们定义...

    枚举语句enum用法详解

    枚举(enum)在编程语言中是一种非常有用的类型,它允许我们定义一组命名常量,这些常量通常代表一组相关的值。在C#中,枚举(enum)被广泛用于增强代码的可读性和可维护性。下面我们将深入探讨C#中的枚举用法。 一...

    Laravel开发-enum

    在Laravel框架中,"enum"(枚举)是一种实用的工具,用于限制特定属性或方法的值只能是预定义的一组。PHP在版本8.0中引入了对枚举的支持,这使得在 Laravel 开发中更加方便地处理固定选项的数据类型。本教程将深入...

    Enum汇总大全详细讲解

    枚举(Enum)在Java中是一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的常量表示方式。以下是对Enum的详细讲解: 1. **基本枚举定义**: ```java enum Color {BLUE, RED, GREEN;} ``` 这是...

    Laravel开发-laravel-enum

    在Laravel框架中,枚举(Enum)是一种实用的工具,可以帮助我们更好地组织代码,提高可读性和可维护性。Laravel Enum库是为Laravel应用程序设计的一个扩展,它允许开发者使用枚举类型来替代传统的常量或字符串,从而...

    Python库 | enum-0.4.7.tar.gz

    在这个场景中,我们关注的是一个名为"enum"的Python库,其版本为0.4.7,封装在"enum-0.4.7.tar.gz"的压缩包文件中。这个压缩包通常包含了库的所有源代码、文档和其他相关资源。 `enum`是Python中的一个内置库,自...

    Java Enum使用Demo源码

    在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义固定的常量集合。它在许多场景下比常量接口或静态final变量更安全、更方便。本篇将通过"Java Enum使用Demo源码"深入探讨Java枚举的用法。 首先,枚举在Java...

    java enum 枚举的spring boot2.x完美实现demo源码

    在Java编程语言中,枚举(`enum`)是一种强大的工具,它允许我们定义一组预定义的常量。在Spring Boot 2.x框架中,枚举的使用可以帮助我们更好地管理和组织代码,提供类型安全和可读性。本篇将深入探讨如何在Spring ...

    PyPI 官网下载 | aenum-1.2.1.tar.gz

    **PyPI 官网下载 | aenum-1.2.1.tar.gz** 在Python编程语言中,`PyPI`(Python Package Index)是官方的软件仓库,它为开发者提供了存储和分享他们创建的Python模块、库和其他软件工具的平台。用户可以方便地通过`...

    DNS,ENUM原理介绍

    简单介绍了DNS和ENUM的原理及在IMS网络中的使用

Global site tag (gtag.js) - Google Analytics