深入学习java枚举的应用

 更新时间:2018年01月24日 12:00:36   投稿:laozhang  
本篇是关于java深入提高学习的相关知识,介绍了枚举的应用等方面内容,有兴趣的朋友参考学习下吧。

一.枚举和静态常量区别

讲到枚举我们首先思考,它和public static final String 修饰的常量有什么不同。

我举枚举的两个优点:

1. 保证了类型安全:调用者无法随意传一个 int或者String 等值;

2.代码可读性非常高;

举个例子:

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如春夏秋冬四个数据元素组成了四季的“数据集”。

你写了方法get(String season),输入的类型只能是String类型,同时要String只能是(春、夏。秋。冬)。

这个时候。你写四个字符串常量

public class Common {
  public static final String SPRING="春";
  public static final String SEASON="夏";
  public static final String SUMMER="秋";
  public static final String AUTUMN="冬";
}

在get方法里放入get(Common.SEASON),确实是把"春",放进去了,但是这个时候你会发现这里面有一个隐患,你get(String season),毕竟放入的是String类型的,如果新同事或者不知情的同事,不知道这个方法里只能放“春、夏、秋、冬”,它放了个其期它字符串比如get("小小“),这个时候,在编译期它是不会报错的,只有运行之后,才发现错了。

为了防止上面的隐患,枚举出现了

  public enum Season {
    SPRING("春"),
    SUMMER("夏"),
    AUTUMN("秋"),
    WINTER("冬");
  .....
}

这个时候,我们修改get方法的传参,改成get(Season   season)   这个时候加入get(Season.SPRING),这就能保证传入的参数只能是这几个。

二.理解枚举

首要我们要明确,其实枚举也是个class类,我写个枚举来理解。

//我们把枚举当做一个普通类
public enum Season {
  SPRING(1,"春"),
  SUMMER(2,"夏" ),
  AUTUMN(3,"秋" ),
  WINTER(4,"冬"); //这里最后一个一定要分号,否则报错
  
  /*我们可以理解成
   *public static final Season SPRING = new Season(1,春); 
   *public static final Season SUMMER = new Season(2,夏); 
   *public static final Season AUTUMN = new Season(3,秋); 
   *public static final Season WINTER = new Season(4,冬); 
   *既然是对象,那下面就很好理解了
   */  
  /*
   * 1.上面对象里放了两个参数,那下面就肯定要有这个类型的构造函数
   * 2.这里是private,因为不能在被new对象了
   */
  private Season(int code,String name) {
    this.name = name;
    this.code = code;
  }
  //对象的属性
  private String name;
  private int code;
  //获取对象属性的方法
  public String getName() {
    return this.name;
  }
  public String getCode() {
    return this.name;
  }
  //通过code获得对象,我们就可以获得对象的其它属性
  public static Season decode(int code) {
    Season season = null;
    for (Season type : Season.values()) {
      if (type.code==code) {
        season = type;
        break;
      }
    }
    return season;
  }
  //重新toString方法
  public String toString() {
    return this.name;
  }
}

上面这个例子,就很好解释了枚举,它和普通类没什么区别,只是用另一种写法创建了几个有属性的对象,这也必须写这样有属性的构造函数,仅此而已。

这里顺便列举下枚举的一些特点:

1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。 
2.  枚举不能在继承其它类了,因为它默认继承了java.lang.Enum 
3.  常量值地址唯一,可以用==直接对比,性能会有提高. 
4.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。 
5.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定。

三.枚举的常见用法

第一种:switch运用

先建一个枚举:

public enum Common {
  INSERT,
  MODIFY,
  DELETE
}
//因为这里是无参的对象,所以可以用系统默认的构造函数。也不用写属性和方法。

在写实现代码

public class CommonUtils {

  public static void getType(Common common){
    Common c=common;
    switch(c)
    {
    case INSERT:
      System.out.println("进行插入操作");
      break;
    case MODIFY:
      System.out.println("进行修改操作");
      break;
    case DELETE:
      System.out.println("进行删除操作");
      break;
    }  
    
  }
  public static void main(String[] args) {
    getType(Common.DELETE); //后台输出:进行删除操作
  }
}

第二种用法,通过key值获得value值获取其它值

枚举类

public enum Season {
  SPRING(1,"春","春天放风筝"),
  SUMMER(2,"夏","夏天去游泳"),
  AUTUMN(3,"秋","秋天去秋游"),
  WINTER(4,"冬","冬天吃火锅"); 
  
  private Season(int code,String name,String bz) {
    this.code = code;
    this.name = name;
    this.bz=bz;
  }
  private int code;
  private String name;
  private String bz;
  public static Season decode(int code) {
    Season season = null;
    for (Season type : Season.values()) {
      if (type.code==code) {
        season = type;
        break;
      }
    }
    return season;
  }
  public int getCode() {
    return code;
  }
  public String getName() {
    return name;
  }
  public String getBz() {
    return bz;
  }

}

测试类

好了,就写这么多,以后有需要会更深入了解。感谢大家对脚本之家的支持。

相关文章

  • Spring MVC策略模式之MethodArgumentResolver源码解析

    Spring MVC策略模式之MethodArgumentResolver源码解析

    这篇文章主要为大家介绍了Spring MVC策略模式之MethodArgumentResolver源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • MyBatis插件机制超详细讲解

    MyBatis插件机制超详细讲解

    MyBatis在四大对象的创建过程中,都会有插件进行介入。插件可以利用动态代理机制一层层的包装目标对象,而实现在目标对象执行目标方法之前进行拦截的效果
    2022-11-11
  • java实现  微博登录、微信登录、qq登录实现代码

    java实现 微博登录、微信登录、qq登录实现代码

    这篇文章主要介绍了java实现 微博登录、微信登录、qq登录实现代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • SpringBoot应用部署于外置Tomcat容器的方法

    SpringBoot应用部署于外置Tomcat容器的方法

    这篇文章主要介绍了SpringBoot应用部署于外置Tomcat容器的方法,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • Springboot项目Aop与拦截器与过滤器横向对比

    Springboot项目Aop与拦截器与过滤器横向对比

    前三篇文章已经介绍过Springboot项目如何实现Aop,拦截器和过滤齐功能,这篇文章主要介绍三者的横向对比,本文有一定的参考价值,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • JavaSE的逻辑控制你了解吗

    JavaSE的逻辑控制你了解吗

    这篇文章主要为大家详细介绍了JavaSE的逻辑控制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java解决青蛙跳台阶问题流程

    Java解决青蛙跳台阶问题流程

    所谓的青蛙跳台阶问题,就是指一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。本文将用Java解决这一问题,需要的可以参考一下
    2022-03-03
  • JAXB简介_动力节点Java学院整理

    JAXB简介_动力节点Java学院整理

    这篇文章主要为大家详细介绍了JAXB简介的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Spring Security配置多个数据源并添加登录验证码的实例代码

    Spring Security配置多个数据源并添加登录验证码的实例代码

    这篇文章主要介绍了Spring Security配置多个数据源并添加登录验证码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 使用SpringBoot请求参数过滤空格

    使用SpringBoot请求参数过滤空格

    这篇文章主要介绍了使用SpringBoot请求参数过滤空格的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论