枚举基类Enum详解

  本文主要是对枚举类型的基类Enum类做一个介绍:

  首先,Enum类位于java.lang包下,根据类的介绍可以发现,Enum类是Java中所有枚举类的父类,将枚举作为一个set或者Map的keys来使用具有很高的效率。

  Enum类是一个抽象类,实现了Comparable和Serializable接口,在类中只有两个成员变量name和ordinal,分别表示枚举的名字和序号均为private,但是提供了两个方法来返回这两个字段分别是name()和ordinal();

  Enum类提供一个为一个构造方法,传入两个参数,分别是name和ordinal,并将这两个值赋给类成员变量name和ordinal,但是这个构造方法是protected类型,程序员不能调用,就不详细说了。

  Enum类具有所有类都具有的方法toString和hashCode和equals,这个toString()方法在这里返回类成员变量name的值。  

  接下来提供一个方法叫做clone(),这个方法没有做任何操作,只是抛出一个异常CloneNotSupportedException,这个方法主要是为了防止枚举类型被clone(设计模式中的拷贝模式),这样做就可以保证枚举是单例的。

  getDeclaringClass()方法用来返回一个枚举常量所在枚举类型的类对象,可以判断两个枚举常量是否属于同一个枚举类e1.geDeclaringClass() == e2.getDeclaring.class();

  valueOf();这个方法的作用是:将枚举e中名字为name的常量返回,比如

  public enum Color{

    RED,BLUE

  }

  public class Client{

    public void  client(){

      Color red = Color.valueOf("RED") 

    }

  }

  Enum类还提供了一个finalize()方法,这个方法没有实现任何代码,这个方法的作用是为了保证枚举不会拥有finalize方法,finalize方法主要是为了在垃圾回收对象的时候做一些额外的清理工作,详情请去看java的垃圾回收机制

  Enum类提供了readObject和readObjectNoData两个方法,这两个方法只抛出了异常,它的作用是为了防止枚举类型被反序列化。

  为什么枚举要禁止clone和禁止反序列化呢?

  因为枚举是一个基于底层实现的一个单例模式,但是单例模式通常可以通过clone和反序列化来实现产生一个单例类多个不同的对象,在这里禁止clone和反序列化就能避免这种情况发生,详情请看设计模式中的单例模式。

时间: 2024-10-25 15:35:56

枚举基类Enum详解的相关文章

Java记录 -22- Java的基类Object详解

Java的基类Object详解 Java的JDK文档要经常查阅使用,最好查看英文的文档. java.lang.Object 类,java.lang包在使用的时候无需显示导入,编译时由编译器自动帮助我们导入. API(Application Programinga Interface),应用编程接口. Object obj = new Object(); System.out.println(obj); System.out.println(obj.toString()); 上面打印的两个内容一样

qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516201 qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等) 本学章节笔记主要详解Item元素(上半场主要涉及anchors锚),因为所有可视化的界面元素都继承于Item,熟悉Item后,不同的继承子类,有其定制的属性(从几个到几十个不等). <Qt实用技巧:在Qt Gui程

Java枚举类enum详解

枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enum.和其它普通类一样,enum同样可以有成员变量.方法.构造器,也可以实现一个或多个接口,区别是: 如果有构造器,必须用private修饰. 枚举类不能派生子类. 枚举类所有的实例必须在第一行显示定义.系统会自动给这些实例加上public static final修饰,无须程序员显示定义. 枚举类默

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 详解

适配器模式(adapter pattern) 枚举器和迭代器 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本的枚举器(Enumeration)和现在的迭代器(Iterator) 可以使用适配器(adapter)进行转换. 适配器(adapter)代码: /** *

Linux学习笔记--Linux文件管理类名利详解

Linux文件管理类命令详解 目录管理: ls.cd.pwd.mkdir.rmdir.tree 文件管理: touch.stat.file.rm.cp.mv.nano 日期管理: touch.clock.hwclock.cal 查看文本: cat.tac.more.less.head.tail cat:连接并显示 -n:在显示时显示每一行的行号 -E:在每行结束处显示 $ Ctrl+C:结束命令 分屏显示: more.less more:向后翻 less: q退出命令 head:查看前n行 ta

halcon导出类---HDevWindowStack详解

在HDevelop中编写好的程序在导出时,Halcon会帮我们转换成我们需要的语言,比如C++.例:HDevelop中有如下语句需要导出: dev_close_window() Halcon导出成C++语言就成了如下语句: if (HDevWindowStack::IsOpen()) close_window(HDevWindowStack::Pop()); 了解MFC的应该不难理解,这两句在底层做了什么!下面让我来讲解一下,呵呵 首先来看看HDevWindowStack这个类,其实这个类很简单

CSS3伪类选择器详解

前面花了两节内容分别在<CSS3基本选择器>和<CSS3属性选择器详解>介绍了CSS3选择器中的基本选择器和属性选择器使用方法,今天要和大家一起学习CSS3选择器中的第三部分,也是最后一部分——伪类选择器.伪类选择器对于大家来说最熟悉的莫过于:link,:focus,:hover之类的了,因为这些在平时中是常用到的伪类选择器,那么先和大家一起简单总结一下CSS中常用的伪类选择器的使用方法,最后把重心放到CSS3新增加的":nth-child"选择器的使用方法.

C# Oracle数据库操作类实例详解

本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接.关闭连接.输出记录集.执行Sql语句,返回带分页功能的dataset .取表里字段的类型和长度等,同时还有哈稀表自动插入数据库等高级任务.需要特别指出的是:在执行SQL语句,返回 DataReader之前一定要先用.read()打开,然后才能读到数据,再用hashTable对数据库进行insert,update,del操作,注意此时只能用默认的数据库连接"connstr". 本文

25.Unity3D手机中Input类touch详解-Unity触屏事件解析到底(Twisted Fate)

首先贴一下Unity支持的模型文件类型,以前没有收集过. Unity支持两种类型的3D文件格式: 1.  通用的"出口型"3D文件 如.fbx..dae..3ds..dxf..obj等文件格式. 2.  3D软件专用的3D文件格式 如Max, Maya, Blender,Cinema4D, Modo, Lightwave & Cheetah3D 等软件所支持的格式,如.MAX, .MB, .MA等等. Unity3D手机中Input类touch详解: 1.Input.touch