一篇文章搞定Java枚举类型

前言

Java枚举类型虽然在特定的场景下通途很大,比如:对系统代码、系统参数等使用枚举类型表示,不仅解决使用常量配置参数可读性差的问题,还可以对数据进行分类,本文详解Java枚举类型在企业开发中的使用方法。

常量项需求

在系统中有一些变量它具有固定的取值范围,比如:学生类的性别属性包括男、女两个值、攀博课堂支付方式包括微信支付、支付宝支付、银联支付三种方式等,在程序中对这些取值通常用常量来表示,因为它们是固定在一定范围内的,如下代码是攀博课堂支付类中支付方式的的表示方式:

package com.pbteach.javase.oop.testenum;

/**
 * 	攀博课堂支付服务工厂类
 * @author 攀博课堂(www.pbteach.com)
 *
 */
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 Pay getPay(String payType) {
		Pay pay = null;
		switch (payType) {
		case PbPayFactory.weixinPayType:
			//构造微信支付对象...
			break;
		case PbPayFactory.aliPayType:
			//构造支付宝支付对象...
			break;
		case PbPayFactory.unionPayType:
			//构造银联支付对象...
			break;
		default:
			break;
		}
		return pay;
	}
}

以上使用常量来表示支付方式相关的数据存在以下问题:

1、代码不够简洁

PbPayFactory类中光常量的配置都占据了近一半的代码量,不方便类阅读。

2、不能很好的对数据进行分类

支付类型和支付接口地址靠人工通过命名关联在一起容易出错,常量越多越不方便管理。

对于大型项目的开发类似的配置有很多,如果有一种简洁、分类配置常量的方式将会大大提高我们的生产效率。

枚举类型介绍

java中对常量数据的配置可以使用枚举类型实现,枚举类型是面向对象中的一种类型,它也有对象、属性、方法等所以它非常方便定义,枚举类型将它的对象(实例)设置为常量方便读取和使用。

枚举类型定义格式如下:

// 定义枚举类要用关键字enum
public enum 枚举类名 {				
	枚举项1,枚举项2,枚举项3…;
	构造方法
	成员变量
	成员方法
}

定义枚举类型

枚举类型也可以有成员方法、成员变量,下边将攀博课堂支付类型等常量项用枚举类型定义:

package com.pbteach.javase.oop.testenum;

/**
 * 	攀博课堂支付枚举类型定义
 * @author 攀博课堂(www.pbteach.com)
 *
 */
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 PayEnum(String name,String payUrl) {
		this.name = name;
		this.payUrl = payUrl;
	}

	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;
	} 
    
    public static void main(String[] args) {
    	//读取枚举项的属性
    	System.out.println(PayEnum.ALIPAY.getName());
		System.out.println(PayEnum.ALIPAY.getPayUrl());

	}
}

输出:

ali
https://openapi.alipay.com/

说明如下:

1、每个枚举类型继承java.lang.Enum,所以枚举类不能再继承其它类型。

2、枚举项就是枚举类型的对象(实例),一般使用大写字母,一个枚举项表示一个常量项,多个枚举项中间用逗号分隔。

3、枚举类型的构造方法使用private私有。

4、通过"枚举类名.枚举项名称"去访问指定的枚举项。

枚举类实现接口

枚举类型虽然不能继承其它类型但它可以实现一个或多个接口,这个在生产使用中较多。

1、接口

package com.pbteach.javase.oop.testenum;

/**
 * 系统代码接口
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public interface SystemCode {

	//系统代码
    int getCode();

    //代码对应的描述
    String getDesc();
}

2、接口实现

package com.pbteach.javase.oop.testenum;

/**
 *  系统代码枚举类
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public enum CodeEnum implements SystemCode  {
	ERROR(-1,"系统异常"),
	FAILURE(0,"操作失败"),
	SUCCESSFUL(1,"操作成功");

	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.ERROR.getCode());
		System.out.println(CodeEnum.ERROR.getDesc());
		//向上转型为接口类型
		SystemCode code = CodeEnum.ERROR;
		System.out.println(code.getCode());
		System.out.println(code.getDesc());
	}
}

输出

-1
系统异常
-1
系统异常

在switch中使用枚举类型

枚举项即枚举类型的对象或实例,枚举项自动为常量,比较两个枚举项使用==来比较,如下代码:

package com.pbteach.javase.oop.testenum;

/**
 * 	攀博课堂支付枚举类型定义
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public enum PayEnum {
	
    public static void main(String[] args) {
    	//枚举项的比较,直接用==比较
		PayEnum alipay = PayEnum.ALIPAY;
		System.out.println(alipay == PayEnum.ALIPAY);
    	
	}
}

输出:

true

既然枚举项为常量,可以通过==来比较,在switch中也可以使用枚举类型,下边将攀博课堂的支付工厂类改为枚举类型实现。

1)支付接口如下

package com.pbteach.javase.oop.testenum;

/**
 * 	攀博课堂支付基础接口
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public interface Pay {
	
	/**
	 * 	请求支付
	 * @param account
	 * @param money
	 * @return 请求结果
	 */
	String requestPay(String account,float money);
	
	/**
	 * 	查询支付结果
	 * @param orderId
	 * @return 支付结果
	 */
	String getResult(String orderId);

}

2)支付工厂类使用枚举类型判断支付方式

package com.pbteach.javase.oop.testenum;

/**
 * 	攀博课堂支付服务工厂类
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class PbPayFactoryNew {

	
	//根据支付类型获取支付服务对象
	public static Pay getPay(PayEnum payType) {
		Pay pay = null;
		switch (payType) {
		case ALIPAY:
			System.out.println("构造微信支付对象...");
			break;
		case WEIXINPAY:
			System.out.println("构造支付宝支付对象...");
			break;
		case UNIONPAY:
			System.out.println("构造银联支付对象...");
			break;
		default:
			break;
		}
		return pay;
	}
	

}

3)测试

package com.pbteach.javase.oop.testenum;


/**
 * 	攀博课堂支付服务工厂类
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class PbPayFactoryNew {
	....
	public static void main(String[] args) {
		//获取微信支付对象
		Pay weixinPay = PbPayFactoryNew.getPay(PayEnum.WEIXINPAY);
		//获取支付宝支付对象
		Pay aliPay = PbPayFactoryNew.getPay(PayEnum.ALIPAY);
		
	}
	...

输出:

构造微信支付对象...
构造支付宝支付对象...

配套视频

传智燕青Java基础精讲教程带你从零基础自学Java到大牛课程开放下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值