撇清POJO 和JavaBean的關係

POJO 和JavaBean是我們在Java相關書籍(比如,Spring in Action[3rd edtion]中就經常出現)中經常碰到的兩個字眼,一般很容易混淆。現在我的認知基礎上,試圖去撇清兩者的關係。

據維基百科和Oracle相關官方文檔,POJO的英文全稱是Plain Old Java Object,中文可以翻譯成“普通Java類”。百度百科將其英文全稱寫成“Plain Ordinary Java Objects”(貼這篇文章時仍是這個稱謂),個人覺得有跟別人家孩子亂起名字的意味。我覺得,孩子的生身父母怎麼稱呼自己的孩子,咱們也就怎麼稱呼吧。至於JavaBean的中文命名,也許是自己顧名思義的毛病犯了,也許是受Android的“果凍豆”命名的影響,至今都一直親切的叫它“爪哇豆”,不改初心。廢話至此,筆鋒一轉,咱們進入正題。

先從POJO說起。POJO是有英國程序大牛Martin Fowler等人提出的,僅僅只是描述最爲普通的、常見的、簡單的不遵循特定約定的Java類。如下是Martin Fowler等人爲何爲普通Java類起這樣一個名字的初衷:




這位大哥的大致意思就是2000年那時候大家都不太願意使用普通的Java類,只是因爲它們沒有一個很酷很nice的名字,爲了倡導、鼓勵大家使用普通的Java類,他和另外幾個哥們兒就商量着給普通Java類起了一個很nice很fancy的名字,於是POJO就誕生了,是不是有點傳奇的味道?正如Martin Fowler所說,POJO起初只是用來描述輕量級的Java類而不是重量級的EJB 2.x(可以理解當時只是作爲EJB 2.x反面存在的,不必糾結於到底EJB 2.x又是什麼東西)。而發展到今天,這個概念是用來強調千千萬的普通Java類,即不遵循任何約定的Java類,比如:

  • 當前的Java類不必繼承某個已存在的類;
  • 當前的Java類不必實現某個預定的接口;
  • 當前Java類不必包含某些預定的註解。

說到這裏,也許還是令人很困惑,那到底POJO是什麼呢?爲了解決這個問題,我們很賤地(準確說是我很賤的)再引入一個問題,那JavaBean又到底是什麼呢?好吧,我們談談“爪哇豆”。

首先,爲了向陪伴我們長大的教材致敬,在這裏必須用較爲學術的語言描述一下JavaBean。JavaBean是Java平臺中可以被重複使用的軟件組件,實質上是由很多的對象封裝成的單一對象。一個Java類是一個JavaBean須遵循由Sun指定的特殊約定,需滿足如下條件:

  • 當前的Java類必須有一個顯式的公開的空參數構造器;
  • 當前類的屬性是私有的,其狀態的改變只能通過當前類的getters、setters和其他約定的方法(例如,對boolean型屬性其獲取方法命名規範爲isXXX())進行操作;
  • 當前必須經過了序列化

滿足上述條件的Java類就已經不再是POJO了,僅僅因爲它遵循了特定的預定。至此,這個案子就破了。


最後,對於JavaBean,我想說的是,我們在做web項目中的Action類,按照約定其實就是一個JavaBean,而不再是POJO,普通Java類了。所以,我們可以這樣理解,JavaBean就是遵循了特殊約定的POJO。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章