当前位置: 首页 > news >正文

Enum枚举类与静态变量和静态数组的区别

Enum枚举类与静态变量和静态数组的区别

  • 组成结构
    • Enum枚举类
    • 静态变量
    • 静态数组
  • 组成结构的区别
    • 相同之处
    • 不同之处
  • 用法使用
    • 相同之处
    • 不同之处

组成结构

先来看下Enum枚举类,静态变量,静态数组的初始化过程,以下面为例子:

public enum FruitEnum {APPLE, ORANGE, BANANA, PEAR, CANTALOUPE, CHERRY, KIWIFRUIT, WATERMELON;static String value = "i";static String[] strings = {"a", "b", "c", "d", "e", "f", "g", "h"};}

Enum枚举类

	/*** 每一个枚举值都分在一个enum**/// access flags 0x4019public final static enum Lcn/abs/FruitEnum; APPLE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; ORANGE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; BANANA// access flags 0x4019public final static enum Lcn/abs/FruitEnum; PEAR// access flags 0x4019public final static enum Lcn/abs/FruitEnum; CANTALOUPE// access flags 0x4019public final static enum Lcn/abs/FruitEnum; CHERRY// access flags 0x4019public final static enum Lcn/abs/FruitEnum; KIWIFRUIT// access flags 0x4019public final static enum Lcn/abs/FruitEnum; WATERMELON/***	一个枚举值初始化一个枚举类对象*	ICONST_* 代表的是枚举序列号**/NEW cn/abs/FruitEnumDUPLDC "APPLE"ICONST_0INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.APPLE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "ORANGE"ICONST_1INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.ORANGE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "BANANA"ICONST_2INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.BANANA : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "PEAR"ICONST_3INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.PEAR : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "CANTALOUPE"ICONST_4INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.CANTALOUPE : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "CHERRY"ICONST_5INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.CHERRY : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "KIWIFRUIT"BIPUSH 6INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.KIWIFRUIT : Lcn/abs/FruitEnum;NEW cn/abs/FruitEnumDUPLDC "WATERMELON"BIPUSH 7INVOKESPECIAL cn/abs/FruitEnum.<init> (Ljava/lang/String;I)VPUTSTATIC cn/abs/FruitEnum.WATERMELON : Lcn/abs/FruitEnum;/***	提取每一个枚举类对象,并封装成一个枚举静态数组 cn/abs/FruitEnum.$VALUES*	ICONST_* 代表数组序列号**/BIPUSH 8ANEWARRAY cn/abs/FruitEnumDUPICONST_0GETSTATIC cn/abs/FruitEnum.APPLE : Lcn/abs/FruitEnum;AASTOREDUPICONST_1GETSTATIC cn/abs/FruitEnum.ORANGE : Lcn/abs/FruitEnum;AASTOREDUPICONST_2GETSTATIC cn/abs/FruitEnum.BANANA : Lcn/abs/FruitEnum;AASTOREDUPICONST_3GETSTATIC cn/abs/FruitEnum.PEAR : Lcn/abs/FruitEnum;AASTOREDUPICONST_4GETSTATIC cn/abs/FruitEnum.CANTALOUPE : Lcn/abs/FruitEnum;AASTOREDUPICONST_5GETSTATIC cn/abs/FruitEnum.CHERRY : Lcn/abs/FruitEnum;AASTOREDUPBIPUSH 6GETSTATIC cn/abs/FruitEnum.KIWIFRUIT : Lcn/abs/FruitEnum;AASTOREDUPBIPUSH 7GETSTATIC cn/abs/FruitEnum.WATERMELON : Lcn/abs/FruitEnum;AASTOREPUTSTATIC cn/abs/FruitEnum.$VALUES : [Lcn/abs/FruitEnum;

可以看出Enum枚举类会将每一个枚举值都包装成一个带有枚举序列号的枚举类对象,然后再将枚举类对象封装成一个枚举数组。

另外,如上图所示(例如:public final static enum Lcn/abs/FruitEnum; APPLE)enum 用了 final 来修饰,Enum枚举类是不能够修改值。

静态变量

    LDC "i"PUTSTATIC cn/abs/FruitEnum.value : Ljava/lang/String;

从上面可以发现静态变量等同于一个枚举值初始化一个枚举类对象的环节。

静态数组

ANEWARRAY java/lang/StringDUPICONST_0LDC "a"AASTOREDUPICONST_1LDC "b"AASTOREDUPICONST_2LDC "c"AASTOREDUPICONST_3LDC "d"AASTOREDUPICONST_4LDC "e"AASTOREDUPICONST_5LDC "f"AASTOREDUPBIPUSH 6LDC "g"AASTOREDUPBIPUSH 7LDC "h"AASTOREPUTSTATIC cn/abs/FruitEnum.strings : [Ljava/lang/String;

由此可见静态数组等同于把每一个枚举类对象封装成一个枚举数组的环节。

组成结构的区别

相同之处

  1. Enum枚举类在中间把一个枚举值包装成一个枚举类对象,这跟静态变量是一样的操作和结构。
  2. Enum枚举类最后也是封装成了一个静态数组,这是跟静态数组一样的最终结构形态。

不同之处

  1. Enum枚举类会把每一个枚举值都包装成一个枚举类对象后再封装成一个静态数组,而不是像静态数组把每一个数值都直接封装到一个静态数组中。
  2. Enum枚举类比静态变量多了对静态数组的封装。

用法使用

相同之处

  1. Enum枚举类,静态变量和静态数组都是一经定义不可变更。
  2. Enum枚举类,静态变量和静态数组都是存放在Metaspace中。

不同之处

  1. Enum枚举类具有枚举序列号,可以通过枚举类对象方法ordinal()提取,能够利用此枚举序列号进行枚举类对象的序列比较和排序,而静态数组可以按照stream流方式进行操作。
  2. Enum枚举类都是通过<Enum Clazz>.<Enum Value>来获取枚举值,使用上安全,不会出现越界,而静态数组需要通过指定index来获取数值,在指定index的时候不能保证index不越界,index越界会抛出错误异常,例如:ArrayIndexOutOfBoundsException,IndexOutOfBoundsException。
  3. 静态数组可以通过index直接获取值,Enum枚举类则是通过直观的名字获取值。
  4. Enum枚举可以在switch()中运用,静态变量和静态数组不能代表类型又代表不同数值没有办法在switch()中使用。
  5. Enum枚举类的枚举值就是枚举对象的名字,元素类型单一,并且需要匹配对象名字的命名规范。而静态变量和静态数组可以应用于不同的元素类型,包括基本类型和对象类型。

http://www.mrgr.cn/news/82108.html

相关文章:

  • Java(四十三)递归
  • Android 检测设备是否 Root
  • 记录:导出功能:接收文件流数据进行导出(vue3)
  • 初学STM32 --- 外部SRAM
  • 【SQL】进阶知识 -- SQL创建表的几种方法
  • 赛博周刊·2024年度工具精选(画板二维码类)
  • 单片机-LED实验
  • Edge如何获得纯净的启动界面
  • 线段树保姆级教程
  • CT 扫描显示 USB-C 电缆可能隐藏复杂的恶意硬件
  • 【paddle】初次尝试
  • C++新特性||线程协程
  • 论文实现:Reactive Nonholonomic Trajectory Generation via Parametric Optimal Control
  • 算法-判断快乐数
  • Scrapy和Selenium结合使用完整步骤
  • 物品租赁系统的设计与实现
  • C语言实现贪吃蛇游戏
  • C++新特性||线程协程(代码解析1)
  • 探索 .idea 文件夹:Java Maven 工程的隐形守护者
  • c#String和StringBuilder
  • UE5材质节点SimpleGrassWind
  • Unity-Mirror网络框架-从入门到精通之Mirror简介
  • Linux(13)——网络概述
  • NLP模型工程化部署
  • Mybatis 为什么不需要给Mapper接口写实现类,为什么要使用代理而不是硬编码?
  • 数据库的概念和操作