首先貼出阿里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;
}
}