0
点赞
收藏
分享

微信扫一扫

六、Java 枚举类

十里一走马 2022-03-18 阅读 54

枚举类的介绍

Java 枚举类是一个特殊的类,一般用来表示有限且固定的对象,例如季节类,它只有四个对象(春、夏、秋、冬)。
早期我们可能会直接使用简单的静态常量来表示枚举类,例如下面代码

public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINTER = 4;

这种定义很简单明了,同时存在以下问题:

  • 类型不安全:上面的季节实际上都是一个 int 整数,完全可以进行加法运算 SEASON_SPRING+SEASON_SUMMER,这样的代码完全正常。
  • 打印输出意义不明确:当输出某个季节时,实际上输出的是其代表的数字,通过这个数字很难猜测是代表的什么意思。

此时,我们就需要枚举类来起到作用了,拿上面的例子举例,使用枚举类 enum 关键字来代替上面的代码:

public enum SeasonEnum
{
    //所有实例需要在枚举类的第一行显式列出。
    SPRING,SUMMER,FALL,WINTER;
}

枚举类和普通类的对比

  • 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,而不是默认继承 Object 类,因此枚举类不能显示继承其他父类。
  • 使用 enum 定义的非抽象的枚举类默认会使用 final 修饰,因此不能派生子类,即无法被继承。
  • 枚举类的构造器只能使用 private 进行修饰,如果忽略了构造器的访问控制符,则默认使用 private 修饰。
  • 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远无法产生实例。这些实例,系统会自动添加 public static final 进行修饰,无须程序员显式添加。
  • 只能定义出 enum 的实例,无法通过 new 操作符创建 enum 的实例。

枚举类的方法

  • public static<T extends Enum valueOf(ClassenumType,String name):这是一个静态方法,用于返回指定枚举类中指定名称的枚举值,name 必须与声明的枚举值全匹配,负责会报错。
  • int compareTo (E o)用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例做比较。该枚举位于指定枚举之后,返回正整数,在指定枚举之前返回负整数,否则返回零。
  • int ordinal()返回枚举值在枚举类的索引值,第一个位置是0。
  • values()返回 enum 实例的数组,而且该数组的元素顺序和 enum 中声明的顺序是一致的。(用于遍历)
  • Sting name()返回枚举常量名称,一般选择使用toSting()。
  • String toSting()返回枚举常量名称,与 name 相似。

枚举类的自定义

枚举类也可以像普通类一样来定义成员变量、方法和构造器,以及实现一个或多个接口。

public enum Gender
{
    //所有实例需要在枚举类的第一行显式列出。
    MALE("男"),FEMALE("女"):
    
    //定义实例变量
    private final String name;
    
    //枚举类的构造器只能使用 private 修饰
    private Gender(String name)
    {
        this.name = neam;
    }
    
        public String getName()
    {
        return this.name;
    }
    
    //防止传入的值错误,进行相应的判断
	public void setName(String name){
        switch(this)
        {
            case MALE:
                if(name.equals("男"))
                {
                    this.name = name;
                }
                else
                {
                    System.out.println("参数错误");
                    return;
                }break;
            case FEMALE:
                if(name.equals("女"))
                {
                    this.name = name;
                }
                else
                {
                    System.out.println("参数错误");
                    return;
                }break;
        }
}

}

包含抽象方法的枚举类

并不是所有的枚举类都是用了 final 修饰,非抽象的枚举类才默认使用 final 修饰。对于一个抽象的枚举类(只要包含了抽象方法),系统默认使用 abstract 修饰,而不是使用 final 修饰。
下述代码,枚举类 Operation 让定义的四个值对 eval()提供不同的实现。

   public enum Operation{
        PLUS
                {
                    public double eval(double x, double y){
                        return x+y;
                    }
                },
        MINUS
                {
                    public double eval(double x, double y){
                        return x-y;
                    }
                },
        TIMES
                {
                    public double eval(double x, double y){
                        return x*y;
                    }
                },
        DIVIDE
                {
                    public double eval(double x, double y){
                        return x/y;
                    }
                };
       //为枚举类定义一个抽象方法,并且由不同的枚举值提供不同的实现
        public abstract double eval(double x, double y);
    }

    public static void main(String[] args) {
        System.out.println(Operation.PLUS.eval(3, 4));
        System.out.println(Operation.MINUS.eval(3, 4));
        System.out.println(Operation.TIMES.eval(3, 4));
        System.out.println(Operation.DIVIDE.eval(3, 4));
    }
举报

相关推荐

0 条评论