瘋了!同事又問我為什么不能用 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,然后就死活取不到值,還報異常,最后定位就是這個問題。

再看到有同事這樣寫,或者問你為什么,把這篇文章丟給他吧。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM