当前位置: 首页 > 后端技术 > Java

一个小而有价值的Java枚举功能!

时间:2023-04-01 20:27:00 Java

枚举介绍在Java5中加入了一个看似很小的特性enum关键字,这使得我们在需要分组使用枚举类型集合时处理起来非常方便。以前,你需要创建一组整型常量,但值本身并不局限于常量集,因此使用它们风险更大,也更难使用。枚举类型是如此常见的需求,以至于C、C++和许多其他语言已经有了它。在Java5之前,Java程序员必须了解很多细节并格外小心才能实现枚举的效果。现在Java也有枚举了,而且比C/C++完备多了。这是一个简单的例子:packagecom.enums;publicenumFileTypeEnum{DOC,XLS,PDF;这里创建了一个名为FileTypeEnum的枚举类型,其中包含3个值。由于枚举类型的实例是常量,因此根据命名约定,它们都是大写的(如果名称包含多个单词,则用下划线分隔)。要使用枚举,请创建对该类型的引用并将其分配给实例:packagecom.enums;publicclassFileTypeEnumCase{publicstaticvoidmain(String[]args){系统。out.println(文档);}}output:DOCenumerationfeatures当你创建枚举时,编译器会自动添加一些有用的特性。例如,它创建了toString()方法,因此您可以轻松地显示枚举实例的名称,正如您从上面示例的输出中看到的那样。编译器还会创建一个ordinal()方法来表示特定枚举常量的声明顺序,以及一个staticvalues()方法来根据枚举常量的声明顺序生成这些常量值的数组。创建枚举时,编译器会为你生成一个相关的类,它继承自Java.lang.Enum。下面的例子展示了Enum提供的一些功能:f+"序数:"+f.ordinal());System.out.print(f.compareTo(FileTypeEnum.DOC)+"");System.out.print(f.equals(FileTypeEnum.DOC)+"");System.out.println(f==FileTypeEnum.DOC);System.out.println(f.getDeclaringClass());System.out.println(f.name());System.out.println("*********************");}}}输出:DOC序号:00truetrueclasscom.enums.FileTypeEnumDOC*********************XLS序号:11falsefalseclasscom.enums.FileTypeEnumXLS********************PDF序号:22falsefalseclasscom.enums.FileTypeEnumPDF********************ordinal()方法返回一个int值,是每个enum实例在声明时的顺序,从0开始。你可以用==来比较enum实例,编译器会自动给你提供equals()和hashCode()方法。Enum类实现了Comparable接口,因此它有一个compareTo()方法。同时,它还实现了Serializable接口。如果我们在枚举实例上调用getDeclaringClass()方法,我们就可以知道它属于哪个枚举类。name()方法返回枚举实例的声明名称,这与使用toString()方法相同。valueOf()是Enum中定义的静态方法。它根据给定的名称返回相应的枚举实例。如果没有具有给定名称的实例,将抛出异常。enum有一个很实用的特性,用在switch语句中:publicclassFileTypeEnumCase{FileTypeEnumfileType;publicFileTypeEnumCase(FileTypeEnumfileType){this.fileType=fileType;}publicvoidgetFileType(){System.out.print("这个文件类型是");switch(fileType){caseDOC:System.out.println("doc");休息;案例XLS:System.out.println("xls");休息;案例PDF:System.out。println("pdf");休息;默认值:System.out.println("此文件类型不匹配!");由于switch从一组有限的可能值中进行选择,因此它非常适合枚举组合。请注意枚举的名称如何更加清楚地说明程序的目的。枚举的values方法前面说过,编译器为你创建的enum类继承自Enum类。但是,如果您查看Enum类,它没有values()方法。但是我们明明用过这种方法,是不是有什么“隐藏”的方法呢?答案是values()是编译器添加的静态方法。编译器还为其添加了一个valueOf()方法。这可能有点令人困惑,Enum类不是已经有valueOf()方法了。但是,Enum中的valueOf()方法需要两个参数,而这个新方法只需要一个参数。由于这里使用的Set只存储方法名,不考虑方法签名,调用Explore.removeAll(Enum)后,只剩下[values]。由于values()方法是由编译器插入到枚举定义中的静态方法,如果将枚举实例向上转换为Enum,则无法访问values()方法。但是Class中有一个getEnumConstants0方法,所以即使Enum接口中没有values0方法,我们仍然可以通过Class对象获取所有的enum实例。实现而不是继承我们已经知道所有枚举都继承自Java.lang.Enum类。由于Java不支持多重继承,您的枚举不能从其他类继承。但是,当我们创建一个新的枚举时,可以同时实现一个或多个接口。在一个接口内部,创建一个实现该接口的枚举来对元素进行分组,可以达到对枚举的元素进行分类和组织的目的。例如,假设您想要使用枚举来表示不同类别的食物,但还希望每个枚举元素仍然属于FileType类型。可以这样实现:packagecom.enums;publicinterfaceFileType{enumImageimplementsFileType{JPG,PNG,GIF;}enumOffice实现FileType{DOC,XLS,PPT;}}对于enum来说,实现接口是使其child分类的唯一途径,所以每一个嵌入FileType的enum都实现了FileType接口。然后我们可以将其实例向上转换为Food,因此上面示例中的所有内容都是FileType。ConstantSpecificMethodsJava的枚举有一个非常有趣的特性,它允许程序员为枚举实例编写方法,从而赋予每个枚举实例不同的行为。要实现常量相关的方法,需要为枚举定义一个或多个抽象方法,然后为每个枚举实例实现抽象方法。参考下面的例子:));}},VERSION{@OverrideStringgetInfo(){返回System.getProperty("java.version");}};抽象字符串getInfo();publicstaticvoidmain(String[]args){for(BaseEnumb:values())System.out.println(b.getInfo());}}Output:2021-8-41.8.0_102通过对应的枚举实例,我们可以调用其上的方法。在面向对象编程中,不同的行为与不同的类相关联。并且通过常量相关的方法,每个枚举实例都可以有自己独特的行为,这似乎表明每个枚举实例就像一个独特的类。在上面的例子中,枚举实例似乎被用作它的“超类”BaseEnum,它在调用getInfo()方法时表现出多态行为。然而,枚举实例和类之间的相似之处到此为止。我们不能真正将枚举实例用作类型。总结关键字enum从一组有限的命名值创建一个新类型,可以用作常规程序组件。这是一个非常有用的功能。您可以使用枚举做很多有趣的事情。虽然Java中的枚举比C或C++中的枚举更成熟,但它仍然是一个“小”功能。有时候正是因为有了它,你才能优雅干净的解决问题。优雅和清晰很重要,它们是区分成功解决方案和失败解决方案的关键。解决方案失败是因为其他人无法理解。最后一篇为初学者提供学习指南,对从业者有参考价值。我坚信编码员也有能力产生洞察力。扫描下方二维码关注、学习、交流!