最近在做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,然后就死活取不到值,還報異常,最后定位就是這個問題。
再看到有同事這樣寫,或者問你為什么,把這篇文章丟給他吧。。