目录
一、使用枚举类型
1.1 枚举类型的基本使用
枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类(可以实现接口)。
枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。
枚举类型Day中分别定义了从周一到周日的值,这里要注意,值一般是大写的字母,多个值之间以逗号分隔。同时我们应该知道的是枚举类型可以像类(class)类型一样,定义为一个单独的文件,当然也可以定义在其他类内部,更重要的是枚举常量在类型安全性和便捷性都很有保证,如果出现类型问题编译器也会提示我们改进,但务必记住枚举表示的类型其取值是必须有限的,也就是说每个值都是可以枚举出来的,比如上述描述的一周共有七天。
public class EnumDemo {
public static void main(String[] args){ //直接引用
Day day =Day.MONDAY;
}
}
1.2 枚举类型的介绍
枚举类型是一种特殊的数据类型,它使得变量成为一组预定义常量。所以在需要表示一组固定常量时应尽量使用枚举类型。通过关键字enum来定义枚举类,它和普通类一样可以有构造器、成员变量、方法。
//定义枚举类要用关键字enum
public enum 枚举类名{
枚举项1,枚举项2,枚举项3...;
构造方法
成员变量
成员方法
package IFather;
public class PbPayFactory {
//微信支付类型
public static final String weixinPayType = "weixin";//微信支付接口地址
public static final String weixinPayurl ="https://api.mch.weixin.qq.com/pay/";
//支付宝支付类型
public static final String aliPayType = "ali";
public static final String aliPayurl ="https://openapi.alipay.com/";
//银联支付类型
public static final String unionPayType = "union";
public static final String unionPayurl ="https://gateway.95516.com/gateway/api/";
//根据支付类型获取支付服务对象
public static PbPayFactory getPay(String payType){
PbPayFactory pay =null;
switch(payType){
case PbPayFactory.weixinPayType:
//构造微信支付对象...
break;
case PbPayFactory.aliPayType:
//构造支付宝支付对象...
break;
case PbPayFactory.unionPayType:
//构造银联支付对象...
break;
default:
break;
}
return pay;
}
}
枚举类在经过编译后确实是生成了一个扩展了java.lang.Enum的类
枚举类是final的,因此我们无法再继承它了
我们定义的每个枚举值都是该类中的一个成员,且成员的类型仍然是Season类型
枚举类中被默认增加了许多静态方法,例如values()等
1.3 枚举类型的定义
package IFather;
public enum PayEnum {
/**
* //微信支付类型
* public static final String weixinPayType = "weixin";//微信支付接口地址
* public static final String weixinPayurl ="https://api.mch.weixin.qq.com/pay/";
* //支付宝支付类型
* public static final String aliPayType = "ali";
* public static final String aliPayurl ="https://openapi.alipay.com/";
* //银联支付类型
* public static final String unionPayType = "union";
* public static final String unionPayurl ="https://gateway.95516.com/gateway/api/";
*/
//枚举项,采用全部大写命名
//枚举项就是一个一个对象,它是常量,可定义枚举项的时候调用构造方法
WEIXINPAY("weixin","https://api.mch.weixin.qq.com/pay/"),
ALIPAY("ali","https://openapi.alipay.com/"),
UNIONPAY("union","https://gateway.95516.com/gateway/api/");
private String name;//支付名称
private String payUrl;//支付地址
//定义构造方法,枚举类型构造方法是private
private PayEnum(){
}
private PayEnum(String name,String payUrl) {
this.name= name;
this.payUrl =payUrl;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the payUrl
*/
public String getPayUrl() {
return payUrl;}
/**
* @param payUrl the payUrl to set
*/
public void setPayUrl(String payUrl){
this.payUrl = payUrl;
}
public static void main(String[] args) {
//枚举项就是一个对象(实例)
PayEnum weixinPay=PayEnum.WEIXINPAY;
System.out.println(weixinPay.getName());
System.out.println(weixinPay.getPayUrl());
}
}
枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 定义: 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.
定义枚举类型变量有三种方法,即:先定义类型后定义变量,定义类型的同时定义变量,直接定义
变量,现介绍如下:
1.先定义类型后定义变量
格式: <枚举类型名> <变量1>〔,<变量2>,…,<变量n>〕;
例如:enum colors
{red=5,blue=1,green,black,white,yellow};
colors c1,c2;
c1、c2 为colors类型的枚举变量。
2.定义类型的同时定义变量
格式:enum <枚举类型名>
{ <枚举元素表> } <变量1>〔,<变量2>,…,<变量n>〕;
例如:enum colors
{red=5,blue=1,green,black,white,yellow}c1,c2;
枚举类型定义的一般形式
C语言中提供的定义枚举类型的语句格式如下。
enum 枚举名 { 枚举值表 };
在枚举值表中罗列出所有可用的值,这些值也称为枚举元素,元素之间用逗号分隔开。例如,定义一个性别的枚举类型:
enum sex { male, female};
其中 sex 为枚举类型名,其元素有两个。凡被说明为 sex 类型的变量的值只能是 male 和 female 两个值中的一个。
1.4 枚举实现的接口
先定义一个接口
/**
* 定义一个接口
*/
interface Info {
void describe();
}
创建一个枚举类实现该接口
/**
* 枚举类实现接口
*/
public enum EnumImplement implements Info{
}
枚举接口
/**
*系统代码接口
*/
public interface SystemCode {
//系统代码
int getcode();
//代码对应的描述
String getdesc();
}
枚举类型
package IFather;
public enum CodeEnum implements SystemCode {
ERROR(-1,"系统异常"),
FAILURE(0,"操作失败"),
SUCCESSFUL(1,"操作成功"),
LOGINSUCCESSFUL(100,"登录成功");
private CodeEnum(int code,String desc) {
this.code = code;
this.desc = desc;
}
int code;//系统代码
String desc;//代码对应的描述
public int getcode() {
return code;
}
public String getdesc() {
return desc;
}
public static void main(String[] args) {
System.out.println(CodeEnum.SUCCESSFUL.getcode());
System.out.println(CodeEnum.SUCCESSFUL.getdesc());
//枚举项可以向上转型为接口类型
SystemCode code=CodeEnum.SUCCESSFUL;
System.out.println(code.getcode());
System.out.println(code.getdesc());
}
}
每一个枚举值都是一个实例,默认是空参构造,如果你需要带参构造实例,则需要定义相应构造方法。
枚举实现接口的方法都是public修饰,这是由于接口默认是public修饰,子类重写的方法访问权限要大于等于父类(接口)。
枚举值中重写的是枚举类型的方法,枚举类型的方法是对于接口的抽象方法的重写。
1.5 枚举的优缺点
优点:
1.能举出所有情况,保证解为正确解。
2.能解决许多用其他算法难以解决的问题。
3.便于思考与编程。
4.算法简单,在局部地方使用枚举方法,效果十分的好。
缺点:为何要叫做暴力枚举呢?因为暴力出奇迹,但是暴力在大多数情况下都是不可取。枚举仅适用于一些规模较小的问题。
每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存。
如果你的应用使用很多的 Enum ,最好使用Integer 或 String 替代他们,但是这样还会有问题。
运算量过大,当问题的规模变大的时候,循环的阶数越大,执行速度越慢