天天看點

瘋了!同僚又問我為什麼不能用 isXXX

最近在做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,然後就死活取不到值,還報異常,最後定位就是這個問題。

再看到有同僚這樣寫,或者問你為什麼,把這篇文章丢給他吧。。