Java - 枚举类

    枚举类:类的对象只有有限个,是确定的。当需要定义一组常量时,建议使用枚举类。
    若枚举类只有一个对象,则可以作为一个单例模式的实现方法。
    枚举类型是一个类,所有的枚举类型都是Enum类的子类。在比较两个枚举类型的值时,永远不需要调用equals,直接使用“==”就可以了。

自定义枚举类

  1. 枚举类对象的属性不允许被改动,所以应该使用private final修饰。
  2. 私有化类的构造器,保证外部不能调用,确保对象的数量是确定的。
class Pay {
	private final String mode;
	//构造器默认也只能是private, 从而保证构造函数只能在内部使用
	private Pay(String mode) {
		this.mode = mode;
	}
	
	// 定义枚举类的对象
	public static final Pay WeChatPay = new Pay("微信支付");
	public static final Pay AliPay = new Pay("支付宝支付");
	public static final Pay BankCard = new Pay("银行卡支付");
	public static final Pay CreditCard = new Pay("信用卡支付");

	public String getMode() {
		return mode;
	}

	public String toString() {
		return mode;
	}
}

public class enumTest {
	public static void main(String[] args) {
		Pay mode1 = Pay.AliPay;
		Pay mode2 = Pay.WeChatPay;
		Pay mode3 = Pay.CreditCard;
		System.out.println("支付方式:" + mode1 + "," + mode2 + "," + mode3);
	}
}

运行结果:支付方式:支付宝支付,微信支付,信用卡支付

使用enum关键字创建枚举类

    使用enum关键字时,多个对象之间要用“,”隔开。
    使用enum关键字的枚举类继承于 java.lang.Enum
    如果没有属性直接写名字。

public enum State {
    NEW,  RUNNABLE, BLOCKED, WAITING,
    TIMED_WAITING, TERMINATED;
}

    所谓枚举类就是有包含有固定数量实例(并且实例的值也固定)的特殊类,如果其含有public构造器,那么在类的外部就可以通过这个构造器来新建实例,显然这时实例的数量和值就不固定了,这与定义枚举类的初衷相矛盾,为了避免这种形象,就对枚举类的构造器默认使用private修饰。如果为枚举类的构造器显式指定其它访问控制符,则会编译出错。枚举被设计成是单例模式,即枚举类型会由JVM在加载的时候,实例化枚举对象,你在枚举类中定义了多少个就会实例化多少个,JVM为了保证每一个枚举类元素的唯一实例,是不会允许外部进行new的,所以会把构造函数设计成private,防止用户生成实例,破坏唯一性。

enum Pay {
    //枚举类的所有实例必须在其首行显式列出,否则它不能产生实例。
    //通过括号赋值,而且必须带有一个参构造器,否则编译出错
	WeChatPay("微信支付"),
	AliPay("支付宝支付"),
	BankCard("银行卡支付"),
	CreditCard("信用卡支付");
	
	private final String mode;
	//构造器默认也只能是private, 从而保证构造函数只能在内部使用
	private Pay(String mode) {
		this.mode = mode;
	}
	
	public String getMode() {
		return mode;
	}

	public String toString() {
		return mode;
	}
}

public class enumTest {
	public static void main(String[] args) {
		Pay mode1 = Pay.AliPay;
		Pay mode2 = Pay.WeChatPay;
		Pay mode3 = Pay.CreditCard;
		System.out.println("支付方式:" + mode1 + "," + mode2 + "," + mode3);
	}
}

Enum类中常用方法

  1. toString():如果不重写,则返回当前枚举类对象常量的名称。
  2. values():返回枚举类的对象数组,可方便的遍历所有的枚举值。Pay[] values = Pay.values();
  3. valueOf(String string):可以把应该字符串转换成对应的枚举类对象(不是对象的属性),要求字符串必须在枚举类中存在,否则抛出 IllegalArgumentException。Pay pay = Pay.valueOf(“WeChatPay”);

使用Enum关键字定义的枚举类实现接口的抽象方法

  1. 实现接口,在enum类中实现抽象方法,每个show方法都一样。
interface Info{ public void show(); }

enum Pay inplements Info{
	...
	public void show(){}
}
  1. 让枚举类的对象分别实现接口中的抽象方法,这样每个对象的show方法都不一样。
interface Info{ public void show(); }

enum Pay inplements Info{
	WeChatPay("微信支付"){
		public void show(){}
	},
	AliPay("支付宝支付"){
		public void show(){}
	},
	BankCard("银行卡支付"){
		public void show(){}
	},
	CreditCard("信用卡支付"){
		public void show(){}
	};
	...
	public void show();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值