瘋了!同事又問我為什麼不能用 isXXX
- 2019 年 12 月 17 日
- 筆記
最近在做Code Review,寫下了這篇文章:程式碼寫成這樣,老夫無可奈何!,說多了都是淚啊。。
最近又有人同事跑過來質疑我: 為什麼變數名取名不能用 isXXX
這種方式,這樣有什麼問題?!
醉了,講了好多次都記不住,我讓他自己去看阿里巴巴的《Java開發手冊》,或者自行百度,說實話,有點工作經驗人都知道,這都是基礎的東西。
本沒什麼好寫的,鑒於有好多小白程式設計師,今天棧長就把為什麼不能用 isXXX
拿出來分享一篇文章吧,希望對你有用。
首先我們來看阿里巴巴的《Java開發手冊》關於 isXXX
是怎麼定義的吧:
【強制】POJO 類中布爾類型變數都不要加 is 前綴,否則部分框架解析會引起序列化錯誤。 反例:定義為基本數據類型 Boolean isDeleted 的屬性,它的方法也是 isDeleted(),RPC 框架在反向解析的時候,「誤以為」對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。
上面的規範很容易理解吧,就是如果使用 isXXX
這種命名形式會引起潛在的異常唄!
獲取阿里巴巴的《Java開發手冊》完整版,請關注微信公眾號:Java技術棧,在後台回復:手冊。
我們再來看一段 IDE 生成的 getter/setter 程式碼:
public class Staff { private String name; private boolean graduated; private boolean isMarried; public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGraduated() { return graduated; } public void setGraduated(boolean graduated) { this.graduated = graduated; } public boolean isMarried() { return isMarried; } public void setMarried(boolean married) { isMarried = married; } }
變數 isMarried
生成的 getter/setter 方法是:isMarried/setMarried,有些框架就會去找對應的 married
變數,然後就找不到了…
再看變數 graduated
,因為都是 boolean 變數,所有生成的邏輯和 isMarried
一樣,根據上述規範,它不會產生找不著值的情況,這也是為什麼不建議使用 isXXX
的命名形式。
這個問題我之前有個同事在使用某個 Web 框架的時候就遇到過,在頁面上使用該框架的標籤顯示對象的值,如:xx.xxx,然後就死活取不到值,還報異常,最後定位就是這個問題。
再看到有同事這樣寫,或者問你為什麼,把這篇文章丟給他吧。。
關注Java技術棧微信公眾號,棧長將繼續分享好玩的 Java 技術。
– END –