Plain Old Java Object(POJO)这个术语到底意味着什么?

Nik*_*ale 69 java terminology pojo

Plain Old Java Object(POJO)这个术语是什么意思?我找不到足够的解释.

POJO的维基百科页面说POJO是一个普通的Java对象,而不是一个特殊的对象.现在,在Java中,什么使得或者什么不能使对象变得特别?

上面的页面还说POJO不应该扩展预先指定的类,实现预先指定的接口或包含预先指定的注释.这是否也意味着不允许POJO实现像Applet这样的接口Serializable,Comparable或者像Applet 这样的类或任何其他用户编写的类/接口?

此外,上述政策(没有扩展,没有实施)是否意味着我们不允许使用任何外部库?

POJO究竟在哪里使用?

编辑:更具体地说,我是否允许扩展/实现属于Java或任何外部库的类/接口?

Kan*_*mar 58

普通旧Java对象该名称用于强调给定对象是普通Java对象,而不是特殊对象,例如EJB 2框架定义的对象.

class A {}
class B扩展/实现C {}

注意:当C是一种分布式框架类或ifc时,B是非POJO.例如javax.servlet.http.HttpServlet,javax.ejb.EntityBean或J2EE extn,不可序列化/可比较.由于可序列化/可比较对POJO有效.

这里A是一个独立的简单对象.B是一个特殊的obj,因为B正在扩展/实现C.所以B对象从C获得更多意义,B是限制性地遵循C的规则而B 与分布式框架紧密耦合.因此B对象不是其定义中的POJO.

使用类A对象引用的代码不必知道它的类型,它可以与许多框架一起使用.

所以POJO不应该1)扩展预先指定的类和2)实现预先指定的接口.

JavaBean是可序列化的POJO示例,具有无参数构造函数,并允许使用遵循简单命名约定的getter和setter方法访问属性.

POJO纯粹关注业务逻辑,并且不依赖于(企业)框架.这意味着它具有业务逻辑的代码,但是如何创建该实例,该对象属于哪个服务(EJB ..)以及它具有的特殊特性(Stateful/Stateless)将由框架通过使用外部xml来决定文件.

示例1:JAXB是将Java对象表示为XML的服务; 这些java对象很简单,并提供了默认的构造函数getter和setter.

示例2:Hibernate,其中将使用简单的java类来表示Table.列将是它的实例.

示例3:REST服务.在REST服务中,我们将使用Service Layer和Dao Layer来对DB执行某些操作.所以Dao将有供应商特定的查询和操作.服务层将负责调用哪个DAO层来执行数据库操作.创建或更新DAO的API(方法)将POJO作为参数,并更新POJO并插入/更新到DB.这些POJO(Java类)将只包含每列的状态(实例变量)及其getter和setter.

在实践中,有些人发现注释优雅,而他们认为XML冗长,丑陋且难以维护,而其他人则发现注释会污染POJO模型.因此,作为XML的替代方案,许多框架(例如Spring,EJB和JPA)允许使用注释来代替或者使用XML:

优点:
将应用程序代码与基础架构框架分离是使用POJO的众多优势之一.使用POJO的未来由挥发性脱钩的,不断发展的基础设施框架样张应用程序的业务逻辑.升级到新版本或切换到不同的框架变得更容易,风险也更小.POJO还使测试更容易,这简化并加速了开发.您的业​​务逻辑将更清晰,更简单,因为它不会与基础架构代码纠缠在一起

参考文献:wiki source2

  • +1非常好,简短而且甜蜜的答案. (2认同)

Gra*_*ton 10

根据Martin Fowler的说法,他和其他一些人提出它是一种描述标准类而不是EJB等的方法.


Ben*_*min 7

该术语的使用意味着它应该告诉你的内容.例如,如果依赖注入框架告诉您可以将POJO注入到任何其他POJO中,他们想要说您不必执行任何特殊操作:不需要遵守与您的对象的任何契约,实现任何接口或延长特殊课程.你可以使用你已经拥有的任何东西.

更新再举一个示例:虽然Hibernate可以将任何POJO(您创建的任何对象)映射到SQL表,但在Core Data(iPhone上的Objective C)中,您的对象必须扩展NSManagedObject,以便系统能够将它们持久化一个数据库.从这个意义上讲,Core Data不能与任何POJO(或者更确切地说是POOCO = PlainOldObjectiveCObject)一起工作,而Hibernate可以.(我可能不会100%纠正核心数据,因为我刚开始接受它.欢迎任何提示/更正:-)).


Car*_*icz 6

普通的旧Java对象:)

好吧,你听起来好像那些都是可怕的限制.

在使用POJO的通常情况下,它更像是一个好处:

这意味着您正在使用的任何库/ API都非常愿意使用未经过任何方式修改或处理过的Java对象,即您无需执行任何特殊操作即可使用它们.

例如,XStream XML处理器(我认为)将愉快地序列化不实现该Serializable接口的Java类.这是一个加号!许多使用数据对象的产品曾用于强制您实现SomeProprietaryDataObject甚至扩展AbstractProprietaryDataObject类.许多库都会期望bean的行为,即getter和setter.

通常情况下,与POJO一起使用的任何东西都可以与不那么PO-JO一起使用.所以XStream当然也会序列化Serializable类.


DVK*_*DVK 6

POJO 是一个普通的旧 Java 对象 - 与需要企业版 (J2EE) 的东西(bean 等...)相比。

POJO 并不是一个真正的硬性定义,而更多的是一种描述“正常”非企业 Java 对象的手动方式。使用外部库或框架是否创建 POJO 对象是仁者见仁,很大程度上取决于什么库/框架,尽管我大胆猜测框架会创建一些不那么 POJO 的东西