JDK5新特性:枚举

时间:2019-02-17
本文章向大家介绍JDK5新特性:枚举,主要包括JDK5新特性:枚举使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

枚举

一些程序在运行时,他需要的数据不能是任意的,而必须是一定范围内的值,JDK5以前采用自定义类来解决,JDK5以后可以直接采用枚举解决。

在JDK5之后,使用enum关键字定义一种新的类型,称为枚举类型。

Enum类和enum关键字

使用enum关键字定义的枚举类,实际上就相当于定义了一个类,此类继承了Enum类而已。

无参

class Grade{
    private Grade(){}
    public satic final Grade A = new Grade();
    public satic final Grade B = new Grade();
}

//相当于

enum Grade{
    A,B;
}

带参

import org.junit.Test;

public class Demo {
	@Test
	public void test() {
		print(Grade.B);
	}

	public void print(Grade g) {
		String value = g.getValue();
		System.out.println(value);
	}
}

enum Grade {
	A("100-90"), B("89-80");
	private String value;

	private Grade(String value) {
		this.value = value;
	}

	public String getValue() {
		return this.value;
	}
}

带抽象方法

import org.junit.Test;

public class Demo {
	@Test
	public void test() {
		print(Grade.B);
	}

	public void print(Grade g) {
		String value = g.localeValue();
		System.out.println(value);
	}
}

enum Grade {
	A("100-90") {
		@Override
		public String localeValue() {
			return "优";
		}
	},
	B("89-80") {
		@Override
		public String localeValue() {
			return "良";
 		}
	};
	
	private String value;

	private Grade(String value) {
		this.value = value;
	}

	public String getValue() {
		return this.value;
	}
	
	public abstract String localeValue();
}

注意事项

定义枚举类要用关键字enum;

所有枚举类都是Enum的子类;

枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略;

枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”);

枚举类也可以有抽象方法,但是枚举项必须重写该方法。

Enum类中定义了如下的方法

public class GeadeTest {
	public static void main(String[] args) {
		//创建枚举对象
		Grade gradeA = Grade.A;
		Grade gradeB = Grade.B;
		// int compareTo(E o):自然排序,返回两个枚举项之间相差几位
		System.out.println(gradeA.compareTo(gradeA));
		System.out.println(gradeA.compareTo(gradeB));
		System.out.println(gradeB.compareTo(gradeA));
		System.out.println("---------------");
		// String name():枚举的名字
		System.out.println(gradeA.name());
		System.out.println(gradeB.name());
		System.out.println("---------------");
		// int ordinal():枚举的序号
		System.out.println(gradeA.ordinal());
		System.out.println(gradeB.ordinal());
		System.out.println("---------------");
		// String toString()
		System.out.println(gradeA.toString());
		System.out.println(gradeB.toString());
		System.out.println("---------------");
		// <T> T valueOf(Class<T> type,String name):单个枚举对象
		Grade grade = Enum.valueOf(Grade.class, "A");
		System.out.println(grade.getValue());
		System.out.println("----------------");
		// values():此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便
		Grade[] grades =Grade.values();
		for (Grade g : grades) {
			System.out.println(g);
			System.out.println(g.getValue());
		}
	}
}

枚举:只能在本类中创建实例

REGISTER_SUCCEED//注册成功
REGISTER_FAILED//注册失败