转自:http://blog.csdn.net/qq_27093465/article/details/52180865
JDK1.5引入了新的类型——枚举。在
Java
中它虽然算个“小”功能,却给我的开发带来了“大”方便。
用法一:常量
在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
- public enum Color {
- RED, GREEN, BLANK, YELLOW
- }
用法二:switch
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
- enum Signal {
- GREEN, YELLOW, RED
- }
- public class TrafficLight {
- Signal color = Signal.RED;
- public void change() {
- switch (color) {
- case RED:
- color = Signal.GREEN;
- break;
- case YELLOW:
- color = Signal.RED;
- break;
- case GREEN:
- color = Signal.YELLOW;
- break;
- }
- }
- }
用法三:向枚举中添加新方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
- public enum Color {
- RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
-
- private String name;
- private int index;
-
- private Color(String name, int index) {
- this.name = name;
- this.index = index;
- }
-
- public static String getName(int index) {
- for (Color c : Color.values()) {
- if (c.getIndex() == index) {
- return c.name;
- }
- }
- return null;
- }
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getIndex() {
- return index;
- }
- public void setIndex(int index) {
- this.index = index;
- }
- }
用法四:覆盖枚举的方法
下面给出一个toString()方法覆盖的例子。
- public enum Color {
- RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
-
- private String name;
- private int index;
-
- private Color(String name, int index) {
- this.name = name;
- this.index = index;
- }
-
- @Override
- public String toString() {
- return this.index+"_"+this.name;
- }
- }
用法五:实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
- public interface Behaviour {
- void print();
- String getInfo();
- }
- public enum Color implements Behaviour{
- RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
-
- private String name;
- private int index;
-
- private Color(String name, int index) {
- this.name = name;
- this.index = index;
- }
-
- @Override
- public String getInfo() {
- return this.name;
- }
-
- @Override
- public void print() {
- System.out.println(this.index+":"+this.name);
- }
- }
用法六:使用接口组织枚举
Java代码
- public interface Food {
- enum Coffee implements Food{
- BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
- }
- enum Dessert implements Food{
- FRUIT, CAKE, GELATO
- }
- }
用法七:关于枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
关于枚举的实现细节和原理请参考:
参考资料:《ThinkingInJava》第四版
http://softbeta.iteye.com/blog/1185573
Enum抽象类常见方法
Enum是所有 Java 语言枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:
返回类型 | 方法名称 | 方法说明 |
---|
int | compareTo(E o) | 比较此枚举与指定对象的顺序 |
boolean | equals(Object other) | 当指定对象等于此枚举常量时,返回 true。 |
Class<?> | getDeclaringClass() | 返回与此枚举常量的枚举类型相对应的 Class 对象 |
String | name() | 返回此枚举常量的名称,在其枚举声明中对其进行声明 |
int | ordinal() | 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) |
String | toString() | 返回枚举常量的名称,它包含在声明中 |
static<T extends Enum<T>> T | static valueOf(Class<T> enumType, String name) | 返回带指定名称的指定枚举类型的枚举常量。 |
- package com.lxk.enumTest;
-
-
-
-
-
-
- public class EnumTest {
- public static void main(String[] args) {
- forEnum();
- useEnumInJava();
- }
-
-
-
-
- private static void forEnum() {
- for (SimpleEnum simpleEnum : SimpleEnum.values()) {
- System.out.println(simpleEnum + " ordinal " + simpleEnum.ordinal());
- }
- System.out.println("------------------");
- for (TYPE type : TYPE.values()) {
- System.out.println("type = " + type + " type.name = " + type.name() + " typeName = " + type.getTypeName() + " ordinal = " + type.ordinal());
- }
- }
-
-
-
-
- private static void useEnumInJava() {
- String typeName = "f5";
- TYPE type = TYPE.fromTypeName(typeName);
- if (TYPE.BALANCE.equals(type)) {
- System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
- } else {
- System.out.println("大师兄代码错误");
- }
-
- }
-
-
-
-
-
- private enum SimpleEnum {
- SPRING,
- SUMMER,
- AUTUMN,
- WINTER
- }
-
-
-
-
-
- private enum TYPE {
- FIREWALL("firewall"),
- SECRET("secretMac"),
- BALANCE("f5");
-
- private String typeName;
-
- TYPE(String typeName) {
- this.typeName = typeName;
- }
-
-
-
-
-
-
- public static TYPE fromTypeName(String typeName) {
- for (TYPE type : TYPE.values()) {
- if (type.getTypeName().equals(typeName)) {
- return type;
- }
- }
- return null;
- }
-
- public String getTypeName() {
- return this.typeName;
- }
- }
- }
- package com.lxk.enumTest;
-
-
-
-
-
-
- public class EnumTest {
- public static void main(String[] args) {
- forEnum();
- useEnumInJava();
- }
-
-
-
-
- private static void forEnum() {
- for (SimpleEnum simpleEnum : SimpleEnum.values()) {
- System.out.println(simpleEnum + " ordinal " + simpleEnum.ordinal());
- }
- System.out.println("------------------");
- for (TYPE type : TYPE.values()) {
- System.out.println("type = " + type + " type.name = " + type.name() + " typeName = " + type.getTypeName() + " ordinal = " + type.ordinal());
- }
- }
-
-
-
-
- private static void useEnumInJava() {
- String typeName = "f5";
- TYPE type = TYPE.fromTypeName(typeName);
- if (TYPE.BALANCE.equals(type)) {
- System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
- } else {
- System.out.println("大师兄代码错误");
- }
-
- }
-
-
-
-
-
- private enum SimpleEnum {
- SPRING,
- SUMMER,
- AUTUMN,
- WINTER
- }
-
-
-
-
-
- private enum TYPE {
- FIREWALL("firewall"),
- SECRET("secretMac"),
- BALANCE("f5");
-
- private String typeName;
-
- TYPE(String typeName) {
- this.typeName = typeName;
- }
-
-
-
-
-
-
- public static TYPE fromTypeName(String typeName) {
- for (TYPE type : TYPE.values()) {
- if (type.getTypeName().equals(typeName)) {
- return type;
- }
- }
- return null;
- }
-
- public String getTypeName() {
- return this.typeName;
- }
- }
- }
- private static void testSwitchCase() {
- String typeName = "f5";
-
-
-
- TypeEnum typeEnum = TypeEnum.fromTypeName(typeName);
- if (typeEnum == null) {
- return;
- }
- switch (typeEnum) {
- case FIREWALL:
- System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());
- System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());
- System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());
- break;
- case SECRET:
- System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());
- System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());
- System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());
- break;
- case BALANCE:
- System.out.println("枚举名称(即默认自带的属性 name 的值)是:" + typeEnum.name());
- System.out.println("排序值(默认自带的属性 ordinal 的值)是:" + typeEnum.ordinal());
- System.out.println("枚举的自定义属性 typeName 的值是:" + typeEnum.getTypeName());
- break;
- default:
- System.out.println("default");
- }
- }
- package com.lxk.enumTest;
-
-
-
-
-
-
- public class EnumTest {
- public static void main(String[] args) {
- forEnum();
- useEnumInJava();
- }
-
-
-
-
- private static void forEnum() {
- for (SimpleEnum simpleEnum : SimpleEnum.values()) {
- System.out.println(simpleEnum + " ordinal " + simpleEnum.ordinal());
- }
- System.out.println("------------------");
- for (TYPE type : TYPE.values()) {
- System.out.println("type = " + type + " type.name = " + type.name() + " typeName = " + type.getTypeName() + " ordinal = " + type.ordinal());
- }
- }
-
-
-
-
- private static void useEnumInJava() {
- String typeName = "f5";
- TYPE type = TYPE.fromTypeName(typeName);
- if (TYPE.BALANCE.equals(type)) {
- System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
- } else {
- System.out.println("大师兄代码错误");
- }
-
- }
-
-
-
-
-
- private enum SimpleEnum {
- SPRING,
- SUMMER,
- AUTUMN,
- WINTER
- }
-
-
-
-
-
- private enum TYPE {
- FIREWALL("firewall"),
- SECRET("secretMac"),
- BALANCE("f5");
-
- private String typeName;
-
- TYPE(String typeName) {
- this.typeName = typeName;
- }
-
-
-
-
-
-
- public static TYPE fromTypeName(String typeName) {
- for (TYPE type : TYPE.values()) {
- if (type.getTypeName().equals(typeName)) {
- return type;
- }
- }
- return null;
- }
-
- public String getTypeName() {
- return this.typeName;
- }
- }
- }
枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等的,不是必须使用equals方法的哟。
- package com.lxk.enumTest;
-
-
-
-
-
-
- public class EnumTest {
- public static void main(String[] args) {
- forEnum();
- useEnumInJava();
- }
-
-
-
-
- private static void forEnum() {
- for (SimpleEnum simpleEnum : SimpleEnum.values()) {
- System.out.println(simpleEnum + " ordinal " + simpleEnum.ordinal());
- }
- System.out.println("------------------");
- for (TYPE type : TYPE.values()) {
- System.out.println("type = " + type + " type.name = " + type.name() + " typeName = " + type.getTypeName() + " ordinal = " + type.ordinal());
- }
- }
-
-
-
-
- private static void useEnumInJava() {
- String typeName = "f5";
- TYPE type = TYPE.fromTypeName(typeName);
- if (TYPE.BALANCE.equals(type)) {
- System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
- } else {
- System.out.println("大师兄代码错误");
- }
-
- }
-
-
-
-
-
- private enum SimpleEnum {
- SPRING,
- SUMMER,
- AUTUMN,
- WINTER
- }
-
-
-
-
-
- private enum TYPE {
- FIREWALL("firewall"),
- SECRET("secretMac"),
- BALANCE("f5");
-
- private String typeName;
-
- TYPE(String typeName) {
- this.typeName = typeName;
- }
-
-
-
-
-
-
- public static TYPE fromTypeName(String typeName) {
- for (TYPE type : TYPE.values()) {
- if (type.getTypeName().equals(typeName)) {
- return type;
- }
- }
- return null;
- }
-
- public String getTypeName() {
- return this.typeName;
- }
- }
- }
先看测试代码:
-
-
-
- private static void testEnumEqual() {
- GameEnum s1 = GameEnum.BIG;
- GameEnum s2 = GameEnum.BIG;
- GameEnum ss1 = GameEnum.SMALL;
- System.out.println("s1 == s2:" + (s1 == s2));
- System.out.println("s1.equals(s2):" + (s1.equals(s2)));
-
- System.out.println("s1 == ss1:" + (s1 == ss1));
- System.out.println("s1.equals(ss1):" + (s1.equals(ss1)));
- }
再看使用的枚举代码:
-
-
-
- public enum GameEnum{
- BIG,
- SMALL,
- FATTER
- }
最后是代码执行的结果图:
结果是:
可以看到,使用== 和使用equals方法的执行结果是一样的。
为什么呢?
可以看下图,因为在Enum类里面,已经重写了equals方法,而方法里面比较就是直接使用==,来比较2个对象的。所以,你在外边直接使用==也是可以的。
- package com.lxk.enumTest;
-
-
-
-
-
-
- public class EnumTest {
- public static void main(String[] args) {
- forEnum();
- useEnumInJava();
- }
-
-
-
-
- private static void forEnum() {
- for (SimpleEnum simpleEnum : SimpleEnum.values()) {
- System.out.println(simpleEnum + " ordinal " + simpleEnum.ordinal());
- }
- System.out.println("------------------");
- for (TYPE type : TYPE.values()) {
- System.out.println("type = " + type + " type.name = " + type.name() + " typeName = " + type.getTypeName() + " ordinal = " + type.ordinal());
- }
- }
-
-
-
-
- private static void useEnumInJava() {
- String typeName = "f5";
- TYPE type = TYPE.fromTypeName(typeName);
- if (TYPE.BALANCE.equals(type)) {
- System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
- } else {
- System.out.println("大师兄代码错误");
- }
-
- }
-
-
-
-
-
- private enum SimpleEnum {
- SPRING,
- SUMMER,
- AUTUMN,
- WINTER
- }
-
-
-
-
-
- private enum TYPE {
- FIREWALL("firewall"),
- SECRET("secretMac"),
- BALANCE("f5");
-
- private String typeName;
-
- TYPE(String typeName) {
- this.typeName = typeName;
- }
-
-
-
-
-
-
- public static TYPE fromTypeName(String typeName) {
- for (TYPE type : TYPE.values()) {
- if (type.getTypeName().equals(typeName)) {
- return type;
- }
- }
- return null;
- }
-
- public String getTypeName() {
- return this.typeName;
- }
- }
- }