枚舉很好用啊!爲啥阿里不建議返回值用枚舉??

來源:zhihu.com/question/52760637

提問

小夥伴說在一次接口定義時,使用了枚舉,結果被其它人深深嫌棄,說不好拓展。

爲什麼會被嫌棄呢?我們先來看看阿里開發手冊關於枚舉使用的建議

從手冊可以看出,定義和使用枚舉,阿里開發手冊都是支持的,但是爲啥,返回值就要反對了呢?

看看作者孤盡是怎麼說的

由於升級原因,導致雙方的枚舉類不盡相同,在接口解析,類反序列化時出現異常。Java中出現的任何元素,在Gosling的角度都會有背後的思考和邏輯(儘管並非絕對完美,但Java的頂層抽象已經是天才級了),比如:接口、抽象類、註解、和本文提到的枚舉。

枚舉有好處,類型安全,清晰直接,還可以使用等號來判斷,也可以用在switch中。

它的劣勢也是明顯的,就是不能擴展。可是爲什麼在返回值和參數進行了區分呢,如果不兼容,那麼兩個都有問題,怎麼允許參數可以有枚舉。當時的考慮,如果參數也不能用,那麼枚舉幾乎無用武之地了。

參數輸出,畢竟是本地決定的,你本地有的,傳送過去,向前兼容是不會有問題的。但如果是接口返回,就比較噁心了,因爲解析回來的這個枚舉值,可能本地還沒有,這時就會拋出序列化異常。

比如:你的本地枚舉類,有一個天氣 Enum:SUNNY, RAINY, CLOUDY,如果根據天氣計算心情的方法:guess(WeatcherEnum xx),傳入這三個值都是可以的。返回值:Weather guess(參數),那麼對方運算後,返回一個SNOWY,本地枚舉裏沒有這個值,傻眼了。

不過,另一位網友Brian的回答也很通俗易懂

枚舉,就是把已知的全部羅列出來。作爲二方/三方庫的提供者,我支持什麼,你們就是用什麼,這樣是安全的。庫版本升級後我支持了更多,你不知道情況下自然不會使用,反正我不支持的參數你不可能傳遞給我,所以作爲輸入,枚舉簡直就是安全保障。但作爲返回值,情況就反過來了。

我先告訴你這些這些可以有,然後你規定這些這些可以有,除此之外都沒有。

但是,是我說了算而不是你,所以你的規定狗屁不是。沒有仔細看手冊(假設有的話)的每一個字,鬼知道升級後的api會返回什麼,拋異常的可能性直趨百分百。

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2021最新版)

2.別在再滿屏的 if/ else 了,試試策略模式,真香!!

3.臥槽!Java 中的 xx ≠ null 是什麼新語法?

4.Spring Boot 2.5 重磅發佈,黑暗模式太炸了!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

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