如何在對外接口中合理地使用枚舉

首先貼出阿里java開發手冊華山版第39頁的一句話
【強制】 二方庫裏可以定義枚舉類型,參數可以使用枚舉類型,但是接口返回值不允許使用
枚舉類型或者包含枚舉類型的 POJO 對象

關於這句話,講一個業務場景:近期因業務發展,我們的一個系統需要增加一個枚舉值,而某個接口的返回值直接使用了這個枚舉。於是需要通知上游接口同步升級jar包,聯調,上線。試想,如果這個枚舉被10個接口使用,每個接口有10個上游系統調用,全部需要升級jar包上線;如果有20個接口…

於是我們目前採用了一種策略,在枚舉類裏提供根據code獲取枚舉的方法,並在接口回傳參數時,只回傳code,且允許null;上游接口使用時需要通過code獲取枚舉,可以直接使用枚舉的name,也可以通過switch分支自定義name

package com.example.demo.guava;

import lombok.Getter;
import lombok.ToString;

import java.util.HashMap;
import java.util.Map;

/**
 * description
 *
 * @author xichengxml
 * @date @date 2019-10-30 10:57:59
 */
@Getter
@ToString
public enum GenderEnum {

	MALE("M", "男"),
	FEMALE("F", "女");

	private String code;

	private String name;

	private final static Map<String, GenderEnum> container;

	static {
		container = new HashMap<>();
		for(GenderEnum e : GenderEnum.values()) {
			container.put(e.getCode(), e);
		}
	}

	/**
	* 內部使用
	*/
	public static GenderEnum getEnum(String code) {
		return getEnum(code, false);
	}
	
	/**
	* 提供給外部使用
	*/
	public static GenderEnum getEnum(String code, boolean allowNull) {
		GenderEnum e = container.get(code);
		if (e == null && !allowNull) {
			throw new IllegalArgumentException("no enums code '" + code + "'. ");
		}
		return e;
	}
	
	GenderEnum(String code, String name) {
		this.code = code;
		this.name = name;
	}
}

package com.example.demo;

import com.example.demo.guava.GenderEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.junit.Test;

/**
 * description
 *
 * @author xichengxml
 * @date 2019-10-30 11:02:24
 */
public class EnumTest {

	@Test
	public void test01() {
		// 上游接口調用下游業務接口返回
		Person person = getPerson();
		// 獲取下游業務接口返回數據
		String genderCode = person.getGenderCode();
		GenderEnum genderEnum = GenderEnum.getEnum(genderCode, true);
		// 上游系統封裝自己的實體類
		PageView pageView = new PageView();
		pageView.setUname(person.getUname());
		pageView.setGender(genderEnum.getName());
		System.out.println("response with enum: " + pageView);
	}

	/**
	 * 模擬下游業務接口實現
	 * 業務方法直接封裝enum code
	 * @return
	 */
	private Person getPerson() {
		Person person = new Person();
		person.genderCode = GenderEnum.MALE.getCode();
		person.uname = "xicheng";
		return person;
	}

	/**
	* 模擬下游業務代碼實體類
	*/
	@Getter
	@Setter
	private static class Person {
		private String uname;
		private String genderCode;
	}

	/**
	* 用於上游系統返回頁面的實體
	*/
	@Getter
	@Setter
	@ToString
	private static class PageView {
		private String uname;
		private String gender;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章