小伙伴们知道枚举吗?这是java中的一个小功能,因为很少使用到所以不常见,今天我们就来聊聊枚举是什么以及枚举的使用吧。
枚举是什么?
一般的说,枚举是一种特殊数据类型,说它特殊是因为,它既是类型却又比类型多了一些特殊约束,这些约束的存在造就了枚举的简洁,安全性以及便捷性。java中定义枚举需要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类(java.lang.Enum是一个抽象类)。枚举类型符合通用模式Class Enum>,而E表示枚举类型的名称。枚举类型的每一个值都映射到protected Enum(String name,int ordinal)构造函数中,在这里,每个值的名称都转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
枚举可以根据Integer、Long、Short或Byte中的任意一种数据类型来创建一种新型变量。这种变量能设置为已经定义的一组之中的一个,有效地防止用户提供无效值。该变量可使代码更加清晰,因为它可以描述特定的值。
枚举怎么使用?
使用场景一:
import java.util.Enumeration; public class Months { public static String[] months = { "JAN" , "FEB" , "MAR" }; public static Enumeration elements() { return new MonthsEnumerator(); } } class MonthsEnumerator implements Enumeration { private int idx = 0; public /*static*/ boolean hasMoreElements() { return (idx < Months.months.length); } public /*static*/ Object nextElement() { return Months.months[idx++]; } }
使用场景二:
/** * 这是比较规范的一个设计: * 它是线程安全的,不可变的,并且很好的解决了序列化中的多实例问题 * 但是它仍然无法规避一个类可以被多个ClassLoader加载,这样仍然会出现多个实例 * 因为按照虚拟机规范:如果相同的一个类同时被多个类加载器加载,虚拟机会认为这几个类不是同一个类,会共存 */ public class Month implements Comparable, java.io.Serializable { public static final Month JAN = new Month("January"); public static final Month FEB = new Month("February", 28); public static final Month MAR = new Month("March"); public static final Month APR = new Month("April", 30); public static final Month MAY = new Month("May"); public static final Month JUN = new Month("June", 30); public static final Month JUL = new Month("July"); public static final Month AUG = new Month("August"); public static final Month SEP = new Month("September", 30); public static final Month OCT = new Month("October"); public static final Month NOV = new Month("November", 30); public static final Month DEC = new Month("December"); private static final Month[] MONTH_ARRAY = { JAN , FEB , MAR , APR , MAY , JUN , JUL , AUG , SEP , OCT , NOV , DEC }; private static int count = 0; private final String name; private final int number; private final int days; private Month(String name) { this(name, 31); } private Month(String name, int days) { this.name = name; this.days = days; this.number = ++count; } public String getName() { return name; } public String getAbbev() { return name.substring(0, Math.min(3, getName() .length())); } public int getNumber() { return number; } public int getDays() { return days; } public String toString() { return name; } @Override public int compareTo(Object o) { return getNumber() - ((Month) o) .getNumber(); } //readResolve这个方法目的是解决序列化的单例问题 //保证该类对象在序列化后,再进行反序列化时使用在jvm中只有一个对象 Object readResolve() throws java.io.ObjectStreamException { return MONTH_ARRAY[number - 1]; } }
从一些场景可以看出,在JDK的枚举类型出现之前,主要依托Enumeration这个枚举器接口,具体的设计需要手动实现,而实现了Enumeration接口的类负责对设计的类似枚举类进行迭代。
这就是枚举的所有介绍了,有关java入门的更多相关知识,请一直关注我们的网站了解吧。