iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中的枚举相关知识点总结
  • 681
分享到

Java中的枚举相关知识点总结

2023-06-15 16:06:23 681人浏览 泡泡鱼
摘要

这篇文章主要讲解了“Java中的枚举相关知识点总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的枚举相关知识点总结”吧!Java中的枚举枚举通常是一组相关的常量集合,其他编程语言

这篇文章主要讲解了“Java中的枚举相关知识点总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的枚举相关知识点总结”吧!

Java中的枚举

枚举通常是一组相关的常量集合,其他编程语言很早就开始用枚举了,比如c++。从jdk1.5起,Java也开始支持枚举类型。

枚举是一种特殊的数据类型,它既是一种类(class)类型却又比类类型多了些特殊的约束,这些约束也造就了枚举类型的简洁性、安全性以及便捷性。

在Java中,通过enum来声明枚举类型,默认继承自java.lang.Enum。所以声明枚举类时无法再继承其他类。

枚举声明

在生活中我们会经常辨认方向,东南西北,它们的名称、属性等基本都是确定的,我们就可以将其声明为枚举类型:

public enum Direction {    EAST, WEST, NORTH, SOUTH; }

同样,每周七天也可以声明成枚举类型:

enum Day {     MONDAY, TUESDAY, WEDNESDAY,     THURSDAY, FRIDAY, SATURDAY, SUNDAY }

在没有枚举或没使用枚举的情况下,并不是说不可以定义变量,我们可以通过类或接口进行常量的定义:

public class Day {      public static final int MONDAY =1;      public static final int TUESDAY=2;      public static final int WEDNESDAY=3;      public static final int THURSDAY=4;      public static final int FRIDAY=5;      public static final int SATURDAY=6;      public static final int SUNDAY=7;  }

但这样存在许多不足,如在类型安全和使用方便性上。如果存在定义int值相同的变量,混淆的几率还是很大的,编译器也不会提出任何警告。因此,当能使用枚举的时候,并不提倡这种写法。

枚举的底层实现

上面我们已经说了,枚举是一个特殊的类,每一个枚举项本质上都是枚举类自身的实例。

因此,上面枚举类Direction可以通过下面代码进行示例:

final class Direction extends Enum{     public final static Direction EAST = new Direction();     public final static Direction WEST = new Direction();     public final static Direction NORTH = new Direction();     public final static Direction SOUTH = new Direction(); }

首先通过javac命令对Direction进行编译,然后通过javap命令来查看一下对应class文件内容:

boGon:enums apple$ javap Direction.class  Compiled from "Direction.java" public final class com.choupangxia.enums.Direction extends java.lang.Enum<com.choupangxia.enums.Direction> {   public static final com.choupangxia.enums.Direction EAST;   public static final com.choupangxia.enums.Direction WEST;   public static final com.choupangxia.enums.Direction NORTH;   public static final com.choupangxia.enums.Direction SOUTH;   public static com.choupangxia.enums.Direction[] values();   public static com.choupangxia.enums.Direction valueOf(java.lang.String);   static {}; }

可以看到,一个枚举在经过编译器编译过后,变成了一个抽象类,它继承了java.lang.Enum;而枚举中定义的枚举常量,变成了相应的public  static final属性,而且其类型就抽象类的类型,名字就是枚举常量的名字。

枚举使用实例

通过上面的反编译我们可以看到,枚举的选项本质上就是public static final的变量,所以就把它当做这样的变量使用即可。

public class EnumExample {     public static void main(String[] args) {         Direction north = Direction.NORTH;         System.out.println(north);        //Prints NORTH     } }

枚举的ordinal()方法

ordinal()方法用于获取枚举变量在枚举类中声明的顺序,下标从0开始,与数组中的下标很相似。它的设计是用于EumSet和EnumMap复杂的基于枚举的数据结构使用。

Direction.EAST.ordinal();     //0   Direction.NORTH.ordinal();    //2

需要注意的是如果枚举项声明的位置发生了变化,那么ordinal方法的值也随之变化。所以,进来避免使用该方法。不然,当枚举项比较多时,别人在中间增删一项,会导致后续的所有顺序变化。

枚举的values()和valueOf()

values()方法可获取枚举类中的所有变量,并作为数组返回:

Direction[] directions = Direction.values();   for (Direction d : directions) {     System.out.println(d); }   //Output:   EAST WEST NORTH SOUTH

values()方法是由编译器插入到枚举类中的static方法,而它的父类Enum中并不存在这个方法。

valueOf(String  name)方法与Enum类中的valueOf方法的作用类似根据名称获取枚举变量,同样是由编译器生成的,但更简洁些,只需传递一个参数。

Direction east = Direction.valueOf("EAST");           System.out.println(east);   //Output:   EAST

枚举命名约定

按照约定,枚举属于常量,因此采用所有字母大写,下划线分割的风格(UPPER_CASE)。也就是说枚举类名与普通类约定一样,而枚举中的变量与静态变量的命名规范一致。

枚举的构造方法

默认情况下,枚举类是不需要构造方法的,默认的变量就是声明时的字符串。当然,你也可以通过自定义构造方法,来初始化枚举的一些状态信息。通常情况下,我们会在构造参数中传入两个参数,比如,一个编码,一个描述。

以上面的方向为例:

public enum Direction {     // enum fields     EAST(0), WEST(180), NORTH(90), SOUTH(270);       // constructor     private Direction(final int angle) {         this.angle = angle;     }       // internal state     private int angle;       public int getAngle() {         return angle;     } }

如果我们想访问每个方向的角度,可以通过简单的方法调用:

Direction north = Direction.NORTH;           System.out.println(north);                      //NORTH   System.out.println(north.getAngle());           //90   System.out.println(Direction.NORTH.getAngle()); //90

枚举中的方法

枚举就是一个特殊的类,因此也可以像普通的类一样拥有方法和属性。在枚举中不仅可以声明具体的方法,还可以声明抽象方法。

方法的访问权限可以是private、protected和public。可以通过这些方法返回枚举项的值,也可以做一些内部的私有处理。

public enum Direction {     // enum fields     EAST, WEST, NORTH, SOUTH;           protected String printDirection() {         String message = &quot;You are moving in &quot; + this + &quot; direction&quot;;         System.out.println( message );         return message;     } }

对应方法的使用如下:

Direction.NORTH.printDirection();  Direction.EAST.printDirection();

枚举类中还可以定义抽象的方法,但每个枚举项中必须实现对应的抽象方法:

public enum Direction  {     // enum fields     EAST {         @Override         public String printDirection() {             String message = &quot;You are moving in east. You will face sun in morning time.&quot;;             return message;         }     },     WEST {         @Override         public String printDirection() {             String message = &quot;You are moving in west. You will face sun in evening time.&quot;;             return message;         }     },     NORTH {         @Override         public String printDirection() {             String message = &quot;You are moving in north. You will face head in daytime.&quot;;             return message;         }     },     SOUTH {         @Override         public String printDirection() {             String message = &quot;You are moving in south. Sea ahead.&quot;;             return message;         }     };       public abstract String printDirection(); }

抽象方法的调用,与普通方法一样:

Direction.NORTH.printDirection();  Direction.EAST.printDirection();

通过这种方式就可以轻而易举地定义每个枚举实例的不同行为方式。比如需要每个枚举项都打印出方向的名称,就可以定义这么一个抽象的方法。

上面的实例enum类似乎表现出了多态的特性,可惜的是枚举类型的实例终究不能作为类型传递使用。下面的方式编译器都无法通过:

//无法通过编译,Direction.NORTH是个实例对象  public void text(Direction.NORTH instance){ }

枚举的继承

上面已经提到过枚举继承自java.lang.Enum,Enum是一个抽象类:

public abstract class Enum<E extends Enum<E>>         implements Comparable<E>, Serializable {     // ... }

也就是说,所有的枚举类都支持比较(Comparable)和序列化(Serializable)的特性。也正因为所有的枚举类都继承了Enum,所以无法再继承其他类了,但是可以实现接口。

枚举的比较

所有的枚举默认都是Comparable和单例的,因此可以通过equals方法进行比较,甚至可以直接用双等号“==”进行比较。

Direction east = Direction.EAST; Direction eastNew = Direction.valueOf("EAST");   System.out.println( east == eastNew );           //true System.out.println( east.equals( eastNew ) );    //true

枚举集合:EnumSet和EnumMap

在java.util包下引入了两个枚举集合类:EnumSet和EnumMap。

EnumSet

EnumSet类的定义如下:

public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>     implements Cloneable, java.io.Serializable{     // ... }

EnumSet是与枚举类型一起使用的专用Set集合,EnumSet中所有元素都必须是枚举类型。与其他Set接口的实现类HashSet/TreeSet不同的是,EnumSet在内部实现是位向量。

位向量是一种极为高效的位运算操作,由于直接存储和操作都是bit,因此EnumSet空间和时间性能都十分可观,足以媲美传统上基于int的“位标志”的运算,关键是我们可像操作set集合一般来操作位运算。

EnumSet不允许使用null元素,试图插入null将抛出  NullPointerException,但测试判断是否存在null元素或移除null元素则不会抛出异常,与大多数Collection实现一样,EnumSet不是线程安全的,在多线程环境下需注意数据同步问题。

使用实例:

public class Test {    public static void main(String[] args) {      Set enumSet = EnumSet.of(  Direction.EAST,                                 Direction.WEST,                                 Direction.NORTH,                                 Direction.SOUTH                               );    }  }

EnumMap

EnumMap的声明如下:

public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>     implements java.io.Serializable, Cloneable {}

与EnumSet类似,EnumMap是一个特殊的Map,Map的Key必须是枚举类型。EnumMap内部是通过数组实现的,效率比普通的Map更高一些。EnumMap的key值不能为null,并且EnumMap也不是线程安全的。

EnumMap使用实例如下:

public class Test {   public static void main(String[] args){     //Keys can be only of type Direction     Map enumMap = new EnumMap(Direction.class);       //Populate the Map     enumMap.put(Direction.EAST, Direction.EAST.getAngle());     enumMap.put(Direction.WEST, Direction.WEST.getAngle());     enumMap.put(Direction.NORTH, Direction.NORTH.getAngle());     enumMap.put(Direction.SOUTH, Direction.SOUTH.getAngle());   } }

枚举与switch

使用switch进行条件判断时,条件参数一般只能是整型,字符型,同时也支持枚举型,在java7后switch也对字符串进行了支持。

使用实例如下:

enum Color {GREEN,RED,BLUE}  public class EnumDemo4 {      public static void printName(Color color){         switch (color){             //无需使用Color进行引用             case BLUE:                  System.out.println("蓝色");                 break;             case RED:                 System.out.println("红色");                 break;             case GREEN:                 System.out.println("绿色");                 break;         }     }      public static void main(String[] args){         printName(Color.BLUE);         printName(Color.RED);         printName(Color.GREEN);     } }

枚举与单例

单例模式是日常使用中最常见的设计模式之一了,单例的实现有很多种实现方法(饿汉模式、懒汉模式等),这里就不再赘述,只以一个最普通的单例来做对照,进而看看基于枚举如何来实现单例模式。

饿汉模式的实现:

public class Singleton {      private static Singleton instance = new Singleton();      private Singleton() {     }      public static Singleton getInstance() {         return instance;     } }

简单直接,缺点是可能在还不需要时就把实例创建出来了,没起到lazy loading的效果。优点就是实现简单,而且安全可靠。

这样一个单例场景,如果通过枚举进行实现如下:

public enum Singleton {      INSTANCE;      public void doSomething() {         System.out.println("doSomething");     } }

在effective  java中说道,最佳的单例实现模式就是枚举模式。利用枚举的特性,让JVM来帮我们保证线程安全和单一实例的问题。除此之外,写法还特别简单。

直接通过Singleton.INSTANCE.doSomething()的方式调用即可。方便、简洁又安全。

感谢各位的阅读,以上就是“Java中的枚举相关知识点总结”的内容了,经过本文的学习后,相信大家对Java中的枚举相关知识点总结这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java中的枚举相关知识点总结

本文链接: https://www.lsjlt.com/news/280838.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中的枚举相关知识点总结
    这篇文章主要讲解了“Java中的枚举相关知识点总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的枚举相关知识点总结”吧!Java中的枚举枚举通常是一组相关的常量集合,其他编程语言...
    99+
    2023-06-15
  • HTML相关知识点总结
    目录简介HTML文档和网页的关系呢?HTML的标签样子?HTML基本概念标签元素属性注释编码规则HTML常用元素标题段落链接跳转页面:跳转锚点图片列表有序列表无序列表定义列表表格块表...
    99+
    2024-04-02
  • Java中类与对象的相关知识点总结
    目录一、面向过程与面向对象的理解二、类与对象的理解与认识三、类的成员1.字段/属性/成员变量2.对null的基本认识3.方法 (method)4.static 关键字四、封装1. p...
    99+
    2024-04-02
  • Redis 事务知识点相关总结
    目录01 事务简介02 命令错误导致的事务提交失败,所有命令都不执行03 运行时错误导致数据错误04 丢弃事务05 watch命令06 总结Redis中的事务介绍  &nb...
    99+
    2024-04-02
  • 总结HTML相关知识
    这篇文章主要介绍“总结HTML相关知识”,在日常操作中,相信很多人在总结HTML相关知识问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”总结HTML相关知识”的疑惑有所帮助!接...
    99+
    2024-04-02
  • Java与Mysql锁相关知识总结
    目录锁的定义锁的实现JVM中的锁synchronizedReentrantLockMysql 锁共享锁(S) 与排它锁(X)作用范围意向锁作用范围记录锁间隙锁Next-Key Loc...
    99+
    2023-05-16
    Java与MySQL中的锁 Java中使用Mysql数据库实现锁 java mysql锁实现
  • java类加载相关知识总结
    目录类加载器代码示例ClassLoader 中的两个方法类加载器 类加载器作用 负责将.class文件(存储的物理文件)加载到内存中 类加载器过程 加载:通过...
    99+
    2024-04-02
  • 云服务器相关知识点总结
    云服务器是一种虚拟的、服务器化的服务,可以提供按需使用、按量计费的服务,可以实现弹性扩展、自动负载均衡、快速响应、高可靠性等一系列功能,是许多企业和开发者的重要选择。以下是一些云服务器相关的知识点总结: 什么是云服务器:云服务器是一种通...
    99+
    2023-10-26
    知识点 服务器
  • Java并发容器相关知识总结
    目录一、并发容器1.1 JDK 提供的并发容器总结1.2 ConcurrentHashMap1.3 CopyOnWriteArrayList1.3.1 CopyOnWriteArra...
    99+
    2024-04-02
  • Spring Cache相关知识总结
    简介  Spring 从 3.1 开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.Cac...
    99+
    2024-04-02
  • Android Insets相关知识总结
    目录什么是Insets?Insets相关类InsetsStateInsetsStateControllerInsetsSourceInsetsSourceConsumer(ImeIn...
    99+
    2024-04-02
  • Java集合的总体框架相关知识总结
    目录一、集合概述二、集合在开发中的应用三、集合存储的数据四、集合的包五、集合的两大类一、集合概述 数组其实就是一个集合。集合实际上就是一个容器。可以来容纳其它的数据。 二、集合在开发...
    99+
    2024-04-02
  • mysql中null(IFNULL,COALESCE和NULLIF)相关知识点总结
    本文实例讲述了mysql中null(IFNULL,COALESCE和NULLIF)相关知识点。分享给大家供大家参考,具体如下: 在MySQL中,NULL值表示一个未知值,它不同于0或空字符串'',并且不等于...
    99+
    2024-04-02
  • java中Supplier知识点总结
    1、说明 这个接口是提供者的意思,只有一个抽象的get,没有默认的方法和静态的方法,导入一个泛T,get方法,返回一个泛T。 supplier也用于创建对象,但与传统的创建对象语法不...
    99+
    2024-04-02
  • 总结Python变量的相关知识
    一、变量的定义 程序中,数据都是临时存储在内存中,为了更快速的查找或使用这个数据,通常我们把这个数据在内存中存储之后,给整个数据定义一个名称,这个名称就是变量。 变量就是在存储数据...
    99+
    2024-04-02
  • Java基础之并发相关知识总结
    目录一、Java并发是什么?二、怎么做?三、分工四、同步五、互斥六、总结一、Java并发是什么? 用学术定义来说就是 并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行...
    99+
    2024-04-02
  • Java数组与堆栈相关知识总结
    一、数组创建 1.1 声明并赋值 int[] a = {1,2,3}; 1.2 声明数组名开辟空间并且赋值 int[] a; a = new int[]{1,2,3}; ...
    99+
    2024-04-02
  • Java基础之引用相关知识总结
    目录一、引用的定义二、问题三、引用的分类四、应用场景五、源码六、总结一、引用的定义 在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据存储的数值代表的...
    99+
    2024-04-02
  • 云服务器相关知识点总结报告
    一、云服务器的基本概念 云服务器是一种常见的计算资源,通常由大型企业或云服务提供商提供。云服务器是一种虚拟化技术,可以将多个计算资源组合成一个虚拟服务器,并通过互联网连接在一起。用户可以通过云服务器访问和管理各种云服务,包括云存储、云数据...
    99+
    2023-10-27
    知识点 总结报告 服务器
  • Android字体相关知识总结
    目录一、Android 默认字体介绍二、textStyle三、typeface四、fontFamily 五、textStyle,typeface,fontFamily 三者...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作