本篇文章给大家分享的是有关JAVA中枚举的特性有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
枚举是类!
在JAVA中,枚举是对象的一个子类。让我们看看所有枚举的基类,Enum(为简洁起见进行了修改)。
public abstract class Enum比; implements 才能,警员,Comparable ,, Serializable { ,private final  String 名称; , ,public final  String 名字(),{ ,,return 名称; ,} , ,private final  int 顺序; , ,public final int 序数(),{ ,,return 顺序; ,} , ,protected Enum(名称、String int 顺序),{ ,,this.name =,名称; ,,this.ordinal =,顺序; ,} , ,public String  toString (), { ,,return 名称; ,} , ,public final  boolean =(Object 其他),{ ,,return 这==; ,} , ,public final int  hashCode (), { ,,return super.hashCode (); ,} , ,public final  int compareTo (E o), { ,,Enum<?祝辞,other =, (Enum<?祝辞)o; ,,Enum 我们可以看的到,这基本上只是一个常规的抽象类,有两个字段,名字和序数。
所以说枚举都是类,所以它们具有常规类的许多特性。
我们能够为枚举提供实例方法,构造函数和字段。我们可以重写toString(),但不能重写hashCode()或等于(对象)。
接下来我们看下我们的枚举示例,操作
, enum Operation { 添加,才能 减、才能 ,乘以 以前,}>这个枚举表示一个操作可以对两个值执行,并将生成一个结果。关于如何实现此功能,您最初的想法可能是使用开关语句,如下所示:
, public int 应用(Operation 操作,int __arg1、, int 最长),{ 开关才能(操作),{ ,,case 添加: ,,,return arg1 +,最长; ,,case 减: ,,,return arg1 作用;最长; ,,case 用: ,,,return arg1 *,最长; ,,默认值: ,,,throw new UnsupportedOperationException()方式; ,} }当然,这样子会有一些问题。
第一个问题是,如果我们将一个新操作添加到我们的枚举操作中,编译器不会通知我们这个开关不能正确处理新操作。
更糟糕的是,如果一个懒惰的开发人员在另一个类中复制或重新编写这些代码,我们可能无法更新它。
第二个问题是默认情况违约,每段程序里面都是必需的,尽管我们知道在正确的代码里它永远不会发生。
这是因为Java编译器知道上面的第一个问题,并且希望确保我们能够处理在不知情的情况下向操作中添加了新枚举。
还好,Java8用函数式编程为我们提供了一个干净的解决方案。
函数枚举实现
因为枚举是类,所以我们可以创建一个枚举字段来保存执行操作的函数。
但是在我们找到解决方案之前,让我们先来看看一些重构。
首先,让我们把开关放在enum类中。
enum Operation { ,添加, ,减、 ,繁殖; , ,public static  int 应用(Operation 操作,int __arg1、, int 最长),{ 开关才能(操作),{ ,,case 添加: ,,,return arg1 +,最长; ,,case 减: ,,,return arg1 作用;最长; ,,case 用: ,,,return arg1 *,最长; ,,默认值: ,,,throw new UnsupportedOperationException()方式; ,,} ,} }我们可以这样做:Operation.apply(操作。添加2 3);
因为我们现在从操作中调用方法,所以我们可以将其更改为实例方法并使用,而不是用操作。应用()来实现,如下所示:
public int 应用(int __arg1, int 最长),{ ,开关(){ case 才能;添加: ,,return arg1  +,最长; case 才能;减: ,,return arg1 作用;最长; case 才能;用: ,,return arg1 *,最长; 默认值:才能 ,,throw new  UnsupportedOperationException()方式; ,} }JAVA中枚举的特性有哪些