枚举一般是针对常量需求,优化代码,.使代码看起来简洁
看下下面这个工具类
说有问题,那就是是看起来代码不够简洁
我看着倒还行,也许也是枚举不怎么实用的原因
下面就用枚举来优化这个代码,首先看下枚举介绍
java中对常量数据的配置可以使用枚举类型实现,,枚举类型是面向对象中的一种类型,它
也有对象,属性,方法等所以它非常方便定义,枚举类型将它的对象(实例)设置为常量方便读取和使用.
枚举类型的实例就是下面的枚举项:
//定义枚举类要用关键字enum
public enum 枚举类名{
枚举项1,枚举项2,枚举项3...;
构造方法
成员变量
成员方法
}
枚举类型特殊点就是枚举项,而这些枚举项就是枚举类型的实例且都是常量
根据上面的demo,下面建一个枚举类型的支付工厂类
/**
* @author hrui
* @date 2022/12/13 21:04
*/
public enum PayEnum {
//枚举项就是枚举类的实例,一般命名全部大写
//枚举项就是一个个对象
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;
}
//也有get set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPayUrl() {
return payUrl;
}
public void setPayUrl(String payUrl) {
this.payUrl = payUrl;
}
//toString方法
@Override
public String toString() {
return "PayEnum{" +
"name='" + name + '\'' +
", payUrl='" + payUrl + '\'' +
'}';
}
public static void main(String[] args) {
System.out.println(PayEnum.WEIXINPAY.getName());
System.out.println(PayEnum.WEIXINPAY.getPayUrl());
//为什么说枚举项就是一个对象(实例)如下
PayEnum weixinPay=PayEnum.WEIXINPAY;
System.out.println(weixinPay.payUrl);
System.out.println(weixinPay.getPayUrl());
System.out.println(weixinPay.payUrl);
System.out.println(weixinPay.getPayUrl());
}
}
枚举类型的说明:
1.每个枚举类型继承java.lang.Enum所以枚举类不能再继承其他类型
2.枚举项就是枚举类型的对象(实例),一般使用大写字母,一个枚举项表示一个常量项,多个枚举项中间用逗号分隔.
3.枚举类型的构造方法使用private私有
4.通过"枚举类名.枚举项名称"去访问指定的枚举项
下面演示枚举实现接口
public interface SystemCode {
//系统代码
int getCode();
//系统代码对应的描述
String getDesc();
}
public enum CodeEnum implements SystemCode{
SUCCESSFUL(1,"操作成功"),
FAILURE(0,"操作失败"),
ERROR(-1,"系统异常");
private CodeEnum(int code,String desc){
this.code=code;
this.desc=desc;
}
int code;//系统代码
String desc;//对应代码描述
@Override
public int getCode() {
return 0;
}
@Override
public String getDesc() {
return null;
}
}
好处就是可以向上转型为接口类型
public static void main(String[] args) {
System.out.println(CodeEnum.SUCCESSFUL.getCode());
System.out.println(CodeEnum.SUCCESSFUL.getDesc());
//枚举项可以向上转型为接口类型
SystemCode systemCode=CodeEnum.SUCCESSFUL;
System.out.println(systemCode.getCode());
System.out.println(systemCode.getDesc());
}
枚举项都是常量,内存中有且仅有一份,用==比较
public static void main(String[] args) {
System.out.println(CodeEnum.SUCCESSFUL.getCode());
System.out.println(CodeEnum.SUCCESSFUL.getDesc());
//枚举项可以向上转型为接口类型
SystemCode systemCode=CodeEnum.SUCCESSFUL;
System.out.println(systemCode.getCode());
System.out.println(systemCode.getDesc());
//枚举项之间如何比较 枚举项之间是使用==进行比较的:原因枚举项都是常量,内存中只有一份
PayEnum aliPay=PayEnum.ALIPAY;
System.out.println(aliPay==PayEnum.ALIPAY);
}
那么现在用下面的Enum枚举去封装上面第一张图的PayFactory
这里注意为什么直接可以使用WEINPAY|ALIPAY|UNIONPAY
public class PayFactory {
// //微信支付类型
// 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 Pay getPay(String payType){
// Pay pay=null;
// switch(payType){
// case PayFactory.weixinPayType:
// //构造微信支付对象...
// System.out.println("构造一个微信支付对象");
// break;
// case PayFactory.aliPayType:
// //构造支付宝支付对象...
// System.out.println("构造一个支付宝支付对象");
// break;
// case PayFactory.unionPayType:PayType:
// //构造银联支付对象...
// System.out.println("构造一个银联支付对象");
// break;
// default:
// break;
// }
// return pay;
// }
public static Pay getPay(PayEnum payEnum) {
Pay pay = null;
switch (payEnum) {
case WEIXINPAY:
//构造微信支付对象...
System.out.println("构造一个微信支付对象");
break;
case ALIPAY:
//构造支付宝支付对象...
System.out.println("构造一个支付宝支付对象");
break;
case UNIONPAY:
PayType:
//构造银联支付对象...
System.out.println("构造一个银联支付对象");
break;
default:
break;
}
return pay;
}
}