java枚举使用怎么配置?java枚举是什么?

TheDisguiser 2020-05-05 19:32:18 java常见问答 6911

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