枚举类Enum:Core Java 5.6

类Enum
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
	
	private final String name;
	private final int ordinal; //序号
	
	//构造函数
	protected Enum(String name, int ordinal){
		this.name = name;   this.ordinal = ordinal;
	}

	public static  <T extends Enum<T>>T valueOf(Class<T> enumType, String name){
		T result = 		enumType.getConstantDirectory().get(name); // 获取类的所有常量,然后从中找出名称为name的。
		if(result != null) return result;
		...
	}

	public final String name(){  return name;}

	public final int ordinal(){ return ordinal;}

	public String toString(){ return name;}

} 
所有枚举类都是Enum类的子类
public enum Size{
	SMALL, MEDIUM, LARGE, EXTRA_LARGE
}

在用关键字enum定义枚举类时,javac编译器会自动将Size类声明为Enum类的子类。等同于如下代码:

public final class Size extends Enum<Size>{

	private Size(String name,int ordinal){
		super(name, ordinal);
	}
	public static final Size SMALL = new Size("SMALL", 0);
	public static final Size MEDIUM = new Size("MEDIUM", 1);
	public static final Size LARGE = new Size("LARGE", 2);
	public static final Size EXTRA_LARGE = new Size("EXTRA_LARGE", 3);	
}
每个枚举值是对枚举类的一个实例对象的引用

上例代码可以看出,其声明了一个枚举类,它有且只会有四个实例对象,分别由SMLL…四个常量引用。

定义自己的域和方法

自定义的枚举类既然是Enum类的子类,自然也是可以扩展出自己的实例域和方法的,
但是其构造函数必须是private的,因为其只能有常量型的实例对象,
其实例对象常量必须在类的第一行定义,并且以分号结束,没有其他代码时可以不以分号结尾:

public enum Size{

	SMALL("S"),LARGE("L"), ...;
	
	private String abbreviation; // 缩写
	
	private Size(String abbr){
		this.abbreviation = abbr;
	}
	
	public String getAbbr(){
		return abbreviation;
	}
}

枚举类型在单例模式中的应用

因为枚举类的实例必须且只能在定义类的时候就声明和初始化,因此应用于单例模式非常合适。

public enum Singleton{
	INSTANCE;  // 需要引用此实例时,直接Singleton.INSTANCE即可。
	
	private Singleton(){
		// init code ...
	}
}


©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值