首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Bean 布林屬性命名陷阱:isShowCode vs showCode 深度解析

     編輯:Java 相關知識

問題現場

定義一個布林屬性 private boolean isShowCode;,Eclipse 自動產生 Getter/Setter:

public boolean isShowCode() { return isShowCode; }
public void setShowCode(boolean isShowCode) { this.isShowCode = isShowCode; }

Spring 注入時拋出異常:

org.springframework.beans.NotWritablePropertyException: 
Invalid property 'isShowCode' ... Did you mean 'showCode'?

根因追蹤:Introspector 與 JavaBeans 規範

Spring 內部透過 Introspector.getBeanInfo() 解析屬性。JDK 的 Introspector 依據 JavaBeans 規範 8.3 節 推導屬性名:

  • 若 Getter 為 is<PropertyName>,則屬性名為 PropertyName(首字母小寫)。
  • 此例中 Getter 為 isShowCode(),推導出的屬性名為 showCode,而非 isShowCode。

但開發者將欄位命名為 isShowCode,導致「欄位名」與「推導屬性名」不一致,Setter 又為 setShowCode,Spring 找不到 setIsShowCode,故報錯。

Eclipse 產生器的「聰明反被聰明誤」

Eclipse 依規範為布林欄位產生 isXxx() Getter,但未去除欄位名中的 "is" 前綴。正確做法應為:

欄位名GetterSetter推導屬性名
showCodeisShowCode() / getShowCode()setShowCode()showCode ✅
isShowCodeisIsShowCode() ❌setIsShowCode()isShowCode ❌

JavaBeans 命名規則完整速查表

1. 一般屬性(標準駝峰)

  • 欄位:userName
  • Getter/Setter:getUserName() / setUserName()

2. 布林屬性(特權語法)

  • 欄位:showCode(勿加 is)
  • Getter:isShowCode() 或 getShowCode()
  • Setter:setShowCode()

3. 非常規單字母開頭(如 pName, eBook)

  • Eclipse 3.2:getPName() / setPName()(首字母大寫)
  • Eclipse 3.5+:getpName() / setpName()(保持原樣)
  • Spring 兩種皆支援,建議統一團隊風格。

4. 連續大寫開頭(如 XMLConfig, URLPath)

  • Getter/Setter:getXMLConfig() / setXMLConfig()(不變)

5. 首字母大寫(如 PropertyName)

  • 雖違反 JSR 慣例,但 Spring 3.1 實測可運行(不推薦)。

最佳實踐總結

  1. 布林欄位勿以 "is" 開頭(如 showCode、enabled)。
  2. 優先使用標準駝峰命名,避免單字母開頭(eBook → electronicBook)。
  3. 升級 JDK/Eclipse/Spring 時,重跑單元測試驗證 Bean 解析行為。
  4. 團隊制定編碼規約,統一 IDE 產生器範本。
「命名是給編譯器看的,更是給六個月後的自己看的。」—— 遵循規範,減少驚喜。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved