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

 

你可能感兴趣的:(java)