情况是刚入职,看见同事直接在 pojo 类中使用枚举类型作为成员变量,代码在最后。但是阿里 Java 开发手册不建议这么写。
[强制] 二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的 POJO 对象。 -- 来自阿里巴巴 Java 开发手册 1.4.0 P36 第 5 条
现在问题有 2 个:
望能解惑。
EnumA {
A,
B;
}
class Pojo {
private String s;
EnumA e;
// getter setter
}
class Test {
EnumA ee;
public static void main(String[] args) {
Test t = new Test();
Pojo p = new Pojo();
if (t.ee == p.getE()) {
// do sth
}
// ...
}
}
1
rockyou12 2018-07-25 11:45:07 +08:00
枚举不好序列化,要对序列化框架自定义很多东西,其他没什么不可以的
|
2
zts1993 2018-07-25 11:49:10 +08:00
pojo 如果是 request 类或者内部的是可以的
出口 response 不可以的原因是。如果 server 枚举更新,client 用的枚举定义没有更新,然后服务端返回新的枚举值会导致枚举变量直接为空 总结就是 request 可以用 response 不可以 |
3
zts1993 2018-07-25 11:49:52 +08:00
hessian 序列化下。
|
4
panpanpan 2018-07-25 14:05:09 +08:00
==没问题。Enum 的 equals()方法就是用的==,遇到问题自己多动手试试,看看文档。
https://github.com/zxiaofan/JDK/blob/master/JDK1.8/src/java/lang/Enum.java#L142 public final boolean equals(Object other) { return this==other; } |
5
Ziav 2018-07-25 15:30:10 +08:00 via Android
可以是可以但是序列化和反序列化都是字符串,很难自定义
|
6
johnniang 2018-07-25 15:44:57 +08:00
```
public enum UserType implements ValueEnum { GENERAL(0, UserConstant.GENERAL), // TEACHER(1, UserConstant.TEACHER), // ADMIN(2, UserConstant.ADMIN), // CONTESTANT(3, UserConstant.CONTESTANT); private int value; private String desc; private UserType(int value, String desc) { this.value = value; this.desc = desc; } @Override public int getValue() { return this.value; } @JsonValue public String getDesc() { return desc; } @JsonCreator public static UserType of(String desc) { UserType type; switch (desc) { case UserConstant.GENERAL: type = GENERAL; break; case UserConstant.TEACHER: type = TEACHER; break; case UserConstant.ADMIN: type = ADMIN; break; case UserConstant.CONTESTANT: type = CONTESTANT; break; default: type = null; break; } return type; } } ``` |