枚举介绍

488 阅读2分钟

在Java1.5中,Java增加了一个新的类型Enum。

我们先来看一个常见的枚举定义:

public enum Size {
	SMALL, MEDIUM, LARGE, EXTRA_LARGE;
}

这个声明定义的是一个类,它有4个实例。 如果我们将其反编译,我们会得到这样的代码

public final class Size extends Enum { // 继承自Enum,标记为final class
    // 每个实例均为全局唯一:
    public static final Size SMALL = new Size();
    public static final Size MEDIUM = new Size();
    public static final Size LARGE = new Size();
    public static final Size EXTRA_LARGE = new Size();
    // private构造方法,确保外部无法调用new操作符:
    private Size() {}
}

上面这个反编译我是参考的枚举类 - 廖雪峰网站上。

我使用了Jdk自带的javap来编译,但是却没有实例化的代码。使用了Fernflower进行了反编译,但是它直接反编译成了枚举类,不是我想要的结果。后来我又看了Java enum 枚举类的编译实现这篇文章,作者是将查看字节码然后编写出来的,发现实例化是在static静态代码块进行的。

推荐大家自己去编译一下,不然可能会看不懂我上面这段话讲的是什么。因为这里不是本篇文章重点,所以就大概写了一下。如果知道该如何查看反编译的代码(有实例化代码),希望能够告诉我

枚举的比较

我们知道如果要比较两个对象是否相等,我们要使用equals方法,而不是 ==。但是,枚举里的每一个实例都是唯一的,所以我们可以直接使用 ==来比较。

枚举常用方法

所有的枚举类型都是Enum类的子类,继承了这个类的很多方法。

  • toString方法能够返回枚举常量名。比如,Size.SMALL.toString()将返回字符串"SMALL"。
  • toString的逆方法是静态方法valueOf。例如:
Size s = Enum.valueOf(Size.class, "SMALL");

该语句将Size.Small赋值给变量s。

  • 静态values方法,返回一个包含全部枚举值的数组
Size[] values = Size.values();

返回包含SMALL, MEDIUM, LARGE, EXTRA_LARGE的数组

  • ordinal方法返回enum声明中枚举常量的位置,位置从0开始计数。例如:Size.MEDIUM.ordinal() 返回1

枚举添加构造器和方法

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;
    }
}

参考文章