/**
 * 枚举:
 * 数据的值不能任意,必须有范围使用到枚举
 * 例子:
 * ennm Grade{
 *  A,B,C,D,E;
 * }
 */
public class grade {
	
	/*
	 * 没有枚举的时候,实现枚举的功能
	 */
	public final static grade A = new grade();
	public static final grade B = new grade();
	public static final grade C = new grade();
	public static final grade D = new grade();
	public static final grade E = new grade();

	// 首先私有的构造方法,防止在外部创建类的实例对象
	private grade() {
	}
	
	/*
	 * enum Grade就相当于一个gradele类
	 * enum类是很特殊的一个类,实际上它是一个抽象类。
	 * 枚举中可以用抽象方法,但是枚举中的每一个对象都分别实现抽象方法;
	 * 枚举中声明的每一个枚举值都是枚举类的一个实例对象
	 * 可以有构造方法,必须私有
	 * 可以实现接口,继承抽象类
	 * jdk5 扩展了switch 除了接收 int char byte short 还可以接收枚举
	 * 枚举类只有一个枚举值,可以当做单态设计模式
	 */
	enum Grade{
		/*
		 * 这里的A,B,C,D,E都是一个类的实例对象
		 * A相当于public final static grade A = new Grade();
		 * 如果枚举里面写了有参构造方法,必须在A指定构造方法如:A("100-80")
		 * 枚举相当于把这个类的实例对象写入了这个类当中,外部不可见。
		 */
		
		A("100-80") {
			@Override
			public String localValue() {
				return "优";
				
			}
		},B("80-70") {
			@Override
			public String localValue() {
				return "良";
				
			}
		},C("70-60") {
			@Override
			public String localValue() {
				return "及格";
				
			}
		},D("60-0") {
			@Override
			public String localValue() {
				return "差";
				
			}
		};
		
		private String value;
		private Grade(String value){
			this.value=value;
		}
		public String Value(){
			return this.value;
		}
		public abstract String localValue();
	}
	

	
}
import org.junit.Test;


import cn.edu.Enum.grade.Grade;


public class demo {
	
	@Test
	public void test1(){
		System.out.println(Grade.A.localValue());
		
	}
	
	/*
	 * int compareTo(E o) 
	 * 		比较此枚举与指定对象的顺序。
	 * 
	 * Class<E> getDeclaringClass() 
	 * 		返回与此枚举常量的枚举类型相对应的 Class 对象。
	 * 
	 * String name() 
	 * 		返回此枚举常量的名称,在其枚举声明中对其进行声明。
	 * 
	 * int ordinal() 
	 * 		返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
	 * 
	 * String toString() 
	 * 		返回枚举常量的名称,它包含在声明中。
	 * 
	 * static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
	 * 		返回带指定名称的指定枚举类型的枚举常量。
	 */
	
	@Test
	public void test2(){
		//测试通过
		String value="B";
		System.out.println(Grade.valueOf(value));
		
		//测试不通过
		String value1="Y";
		System.out.println(Grade.valueOf(value1));
		
		
		//这个方法常用与测试该String是否是该枚举值当中的
	}
}