您的位置:首页 > 其它

自定义枚举类

2015-12-13 22:07 316 查看
前言:说到枚举类,就要说一下单例模式,单例模式是在类本身只创建出一个实例,且外界不能够创建该类的实例。而枚举类与单例类似,要求类只能本身创建有限个数的实例,同样外界不能创建该类实例,可以称之为“多例模式”(名字是我自己取的,没有权威认证)。



1、枚举类的特点。

  (1)所有枚举类的公共父类都是Enum。

  (2)枚举项必须写在枚举类的最前面,每个枚举项之间用逗号隔开,如果枚举项后边没有其他内容,可以不写分号,否则必须要写。

  (3)枚举类中所有的构造器默认且必须是private(和单例模式一样),外部不能够创建该类实例。而且枚举类中可以显式的指明调用哪个构造器。

  (4)枚举类可以有抽象方法,但必须在元素列表声明中以内部类形式实现这些方法。此外,枚举类中还可以定义普通的成员变量和方法。

  (5)枚举类可以象枚举类型一样,在 switch 语句中使用。

2、仿单例模式自定义枚举类。

/**
 * 原始枚举类
 * @author 胡根得
 */
public class Year{
    //定义枚举项,就是四个实例
     public static final Year spring = new Year("spring");
	public static final Year summer = new Year("summer");
	public static final Year autumn = new Year("autumn");
	public static final Year winter = new Year("winter");

	private String name;
    //私有化构造方法,不允许外界创建该类对象
	private Year(String name) {
  		this.name = name;
    	}
    //通过getName方法可以得到枚举项名称
    	public String getName() {
    		return name;
 	}
}
  这就是一个原始的枚举类了。接下来实现一个有抽象方法的枚举类:

/**
 * 带抽象方法的枚举类
 * @author 胡根得
 */
public abstract class Year {
	//内部类的形式定义枚举项
    public static final Year spring = new Year("spring") {
		public void show() {
			System.out.println("我是春天");
		}
	};
	public static final Year summer = new Year("summer") {
		public void show() {
			System.out.println("我是夏天");
		}
	};
	public static final Year autumn = new Year("autumn") {
		public void show() {
			System.out.println("我是秋天");
		}
	};
	public static final Year winter = new Year("winter") {
		public void show() {
			System.out.println("我是冬天");
		}
    	};

	private String name;

	private Year(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}
	
	public abstract void show();
}
 


3、现在的枚举类以及底层实现方式。

  如今定义枚举类,没有上边那么麻烦了,我们只需要这么简单的定义一下就可以实现:

<span style="font-size:14px;">
public enum Year{
	spring,summer,autumn,winter;
}

</span>
小结:虽然如今定义枚举类很方便,但是方便的背后也隐藏了一些细节,那就是它的代码底层也是按照原始的枚举类走的,值得注意的是,不管你在枚举类的构造器前加不加private修饰,底层都是默认加上的,就像接口中的方法默认加上 abstract 修饰一样。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: