撇清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。


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