V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pomony
V2EX  ›  Java

Java 中 pojo 类能直接使用枚举类型作为返回值以及比较吗??

  •  
  •   pomony · 2018-07-25 11:43:46 +08:00 · 3481 次点击
    这是一个创建于 2317 天前的主题,其中的信息可能已经有所发展或是发生改变。

    情况是刚入职,看见同事直接在 pojo 类中使用枚举类型作为成员变量,代码在最后。但是阿里 Java 开发手册不建议这么写。

    [强制] 二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的 POJO 对象。 -- 来自阿里巴巴 Java 开发手册 1.4.0 P36 第 5 条

    现在问题有 2 个:

    1. pojo 中能不能直接使用枚举类型作为成员变量呢?
    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 条附言  ·  2018-07-25 12:18:36 +08:00
    直接使用“==”不会出现值相等,但返回 false 的情况吗,因为枚举也是一个对象?
    6 条回复    2018-07-25 15:44:57 +08:00
    rockyou12
        1
    rockyou12  
       2018-07-25 11:45:07 +08:00
    枚举不好序列化,要对序列化框架自定义很多东西,其他没什么不可以的
    zts1993
        2
    zts1993  
       2018-07-25 11:49:10 +08:00
    pojo 如果是 request 类或者内部的是可以的
    出口 response 不可以的原因是。如果 server 枚举更新,client 用的枚举定义没有更新,然后服务端返回新的枚举值会导致枚举变量直接为空

    总结就是 request 可以用 response 不可以
    zts1993
        3
    zts1993  
       2018-07-25 11:49:52 +08:00
    hessian 序列化下。
    panpanpan
        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;
    }
    Ziav
        5
    Ziav  
       2018-07-25 15:30:10 +08:00 via Android
    可以是可以但是序列化和反序列化都是字符串,很难自定义
    johnniang
        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;
    }

    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3394 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:50 · PVG 19:50 · LAX 03:50 · JFK 06:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.