枚举类:类的对象只有有限个,是确定的。当需要定义一组常量时,建议使用枚举类。
若枚举类只有一个对象,则可以作为一个单例模式的实现方法。
枚举类型是一个类,所有的枚举类型都是Enum类的子类。在比较两个枚举类型的值时,永远不需要调用equals,直接使用“==”就可以了。
自定义枚举类
- 枚举类对象的属性不允许被改动,所以应该使用private final修饰。
- 私有化类的构造器,保证外部不能调用,确保对象的数量是确定的。
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类中常用方法
- toString():如果不重写,则返回当前枚举类对象常量的名称。
- values():返回枚举类的对象数组,可方便的遍历所有的枚举值。Pay[] values = Pay.values();
- valueOf(String string):可以把应该字符串转换成对应的枚举类对象(不是对象的属性),要求字符串必须在枚举类中存在,否则抛出 IllegalArgumentException。Pay pay = Pay.valueOf(“WeChatPay”);
使用Enum关键字定义的枚举类实现接口的抽象方法
- 实现接口,在enum类中实现抽象方法,每个show方法都一样。
interface Info{ public void show(); }
enum Pay inplements Info{
...
public void show(){}
}
- 让枚举类的对象分别实现接口中的抽象方法,这样每个对象的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();
}