深入学习java枚举的应用

作者:laozhang 时间:2022-10-27 19:56:34 

一.枚举和静态常量区别

讲到枚举我们首先思考,它和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;  }}

测试类

深入学习java枚举的应用

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

来源:https://www.cnblogs.com/qdhxhz/p/8337514.html

标签:java,枚举,应用
0
投稿

猜你喜欢

  • Unity实现10天签到系统

    2022-07-11 23:40:01
  • Java二维数组计算集合总结

    2023-02-15 16:38:14
  • Java实现AES算法的实例代码

    2021-09-25 15:05:52
  • C# WPF 自定义按钮的方法

    2021-08-30 23:42:11
  • 关于idea引入spring boot <parent></parent>父依赖标红问题

    2021-11-23 09:42:12
  • C#通过xpath查找xml指定元素的方法

    2023-06-22 11:55:29
  • android实现点击按钮控制图片切换

    2022-10-16 02:38:55
  • java8从list集合中取出某一属性的值的集合案例

    2023-04-30 01:51:49
  • 老生常谈java中的fail-fast机制

    2022-01-27 15:31:50
  • 详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)

    2022-02-19 03:54:29
  • java 二叉查找树实例代码

    2022-07-23 22:54:28
  • Spring中的后置处理器BeanPostProcessor详解

    2023-02-24 00:50:03
  • SpringBoot配置Actuator组件,实现系统监控

    2021-10-27 07:46:48
  • Flutter混合开发详解

    2023-05-15 11:10:54
  • Visual C#中如何使用IComparable和IComparer接口

    2021-12-17 20:01:02
  • 彻底搞懂Java多线程(一)

    2023-08-02 10:42:30
  • Android EventBus 3.0.0 使用总结(必看篇)

    2023-09-06 06:32:41
  • java 对数和指数计算方式

    2022-08-27 16:50:07
  • Android内存泄漏的轻松解决方法

    2023-08-27 01:51:30
  • Spring+SpringMVC+JDBC实现登录的示例(附源码)

    2021-11-16 08:29:56
  • asp之家 软件编程 m.aspxhome.com