小伙伴们知道枚举吗?这是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
}
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入门的更多相关知识,请一直关注我们的网站了解吧。