Java之枚举类
Posted 大凌轩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之枚举类相关的知识,希望对你有一定的参考价值。
有时候,变量的取值只在一个有限的集合内。
例如:pizza的大小只有小、中、大和超大这四种尺寸。当然,可以将这些尺寸分别编码为1、2、3、4或者S、M、L、X。但这样存在着一定的隐患。在变量中很有可能保存的是一个错误的值(如0和m)。
针对这种情况,可以自定义枚举类型。枚举类型包括有限个命名的值。例如,
enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
现在,可以声明这种类型的变量:
Size s = Size.MEDIUM;
Size类型的变量只能存储到这个类型声明中给定的某个枚举值,或者null值,null表示这个变量没有设置任何值。
下面是他的完整代码加运行结果:
package enums; import java.util.Scanner; /** * 详解请看:Java核心技术(原书第十版)p188-189 * @author 大凌轩 * */ public class EnumTest { public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.print("Enter a size:(SMALL,MEDIUM,LARGE,EXTRA_LARGE)"); String input=in.next().toUpperCase(); //这里解释下此处toUpperCase方法,就是将你键盘输入的字母格式化为大写,下面有运行图 Size size=Enum.valueOf(Size.class, input); System.out.println("size="+size); System.out.println("abbreviation="+size.getAbbreviation()); if(size==Size.EXTRA_LARGE) System.out.println("Good job--you paid attention to the _."); } } enum Size{ SMALL("S"),MEDIUM("M"),LAREG("L"),EXTRA_LARGE("XL"); private Size(String abbreviation){this.abbreviation=abbreviation;} public String getAbbreviation(){return abbreviation;} private String abbreviation; }
下面为了自己以后方便理解,对其进行详细解释:
public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。
因此,在比较两个枚举类型的值时,永远不要调用equals,而直接使用“= =”就可以了。
如果需要的话,可以在枚举类型中添加一些构造器、方法和域。当然,构造器只是在构造枚举常量的时候被调用。小面是一个示例:
public enum Size{ SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL"); private String abbreviation; private Size(String abbreviation){this.abbreviation=abbreviation;} public String getAbbreviation(){return abbreviation;} }
所有的枚举类型都是Enum类的子类。它们继承了这个类的许多方法。其中最有用的一个是toString,这个方法能够返回枚举常量名。例如,Size.SMALL.toString()将返回字符串“SMALL”。
toString的逆方法是静态方法valueOf。例如,语句:
Size s = Enum.valueOf(Size.class,"SMALL");
将s设置成Size.SMALL。
每个枚举类型都有一个静态的values方法,它将返回一个包含全部枚举值的数组。例如,如下调用
Size[] values = Size.values();
返回包含元素Size.SMALL,Size.MEDIUM,Size.LARGE,Size.EXTRA_LARGE的数组。
ordinal方法返回enum声明中枚举常量的位置,位置从0开始计数。例如:Size.MEDIUM.ordinal()返回1。
代码其实是最能体现出知识内容的载体,上面的解释其实起不到太大的作用,你读懂了代码,也就知道个八九不离十了。
以上是我看《Core Java Volume I-Fundamentals》第十版的笔记
关于枚举的实现细节和原理也可参考《ThinkingInJava》第四版:http://blog.lichengwu.cn/java/2011/09/26/the-usage-of-enum-in-java/
以上是关于Java之枚举类的主要内容,如果未能解决你的问题,请参考以下文章