在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java高级特性之枚举

2017-2-7 13:40| 发布者: zhangjf| 查看: 468| 评论: 0

摘要: 在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下public static final int MAN = 0;public static final int WOMAN = 1;复制代码相信很多小伙伴,在实际开发中也是那 ...

在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下

  1. public static final int MAN = 0;
  2. public static final int WOMAN = 1;
复制代码

相信很多小伙伴,在实际开发中也是那么干的,既然这样已经能实现枚举的功能,为什么还要引入枚举呢?我们接着往下看当我们需要是同这组“int枚举”是代码如下

  1. public void showSex(int sex){
  2. switch(sex){
  3. case MAN:
  4. System.out.println("this is a boy");
  5. break;
  6. case WOMAN:
  7. System.out.println("this is a Girl");
  8. break;
  9. }
  10. }
复制代码

看起来这些貌似也没什么问题,但是我们知道,一个项目基本都是基于团队开发,或许只有你自己知道int类型的1代表gril,0代表Boy。其他同事看到这个函数根本不知道其中的含义,这样的代码很明显阅读性很差,从而会造成沟通成本很高。我们接着往下看,现在你为你的func写了很nice的注释,傻子都能看得懂(0 boy,1 gril)。但是项目组不可避免的总会出现那么一两个傻子,非要给你传个3进来,而且这样的错误编译器不会报任何错误,运行时会造成什么bug,这个只有乔老爷知道了。所以这样的代码是极不安全的。使用枚举就能很好的避免上面的问题,接下来我们就来理一理枚举的用法。
枚举用于存储数量有限的一组固定的数据集。使用场景:上面说到的性别的表示,一年四级春夏秋冬的表示,一周七天的表示,颜色的表示等等。
枚举的简单用法

  1. // 普通枚举
  2. public enum ColorEnum {
  3. white, red, green, blue;
  4. }
  5. /**
  6. *
  7. * 枚举中有一个自带的静态方法values(),返回enum实例的数据并且该数组中的元素顺序和声明时的顺序一样
  8. * 枚举也可以像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法
  9. */
  10. public enum SeasonEnum {
  11. //注:枚举写在最前面,否则编译出错
  12. spring, summer, autumn, winter;
  13. private final static String position = "test";
  14. public static SeasonEnum getSeason() {
  15. if ("test".equals(position))
  16. return spring;
  17. else
  18. return winter;
  19. }
  20. }
  21. /**
  22. * 带构造器的枚举
  23. * 必须带有一个参构造器和一个属性跟方法,否则编译出错
  24. *
  25. */
  26. public enum Mode {
  27. PULLDOWN("下拉"), PULLUP("上拉");
  28. private final String value;
  29. /**
  30. * 构造器默认也只能是private, 从而保证构造函数只能在内部使用
  31. *
  32. */
  33. private Mode(String value) {
  34. this.value = value;
  35. }
  36. public String getValue() {
  37. return value;
  38. }
  39. }
复制代码

枚举中还有一个ordinal()方法返回一个int值,这是每个enum实例在声明时的次序,从0开始。枚举类还实现了Compareable接口,所以他具有compareTo()方法。同时还实现了Serializable接口,还自动为你提供了equals()和hashCode()方法。除了不能继承一个枚举类之外,我们基本上可以把枚举类当成一个常规的Java类,可以往其中添加新的方法,包括抽象方法甚至main方法。
现在我们用枚举来实现上面的那个性别函数

  1. public enum EnumSex {
  2. MAN, WOMAN
  3. }
  4. public static void showSex(EnumSex EnumSex) {
  5. switch (EnumSex) {
  6. case MAN:
  7. System.out.println("this is a boy");
  8. break;
  9. case WOMAN:
  10. System.out.println("this is a girl");
  11. break;
  12. }
  13. }
  14. public static void main(String[] args) {
  15. showSex(EnumSex.MAN);
  16. // showSex(EnumSex.Renyao) 编译报错
  17. }
复制代码

这样既有很好的阅读性又避免的安全性问题

来自: http://blog.csdn.net/soul_code/article/details/50440183

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 04:18

Copyright 2015-2025 djqfx

返回顶部