瘋了!同事又問我為什麼不能用 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 –