Plain Old Java Object(POJO)是什么意思?

问题描述 投票:69回答:8

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

POJO's Wikipedia page说POJO是普通的Java对象,而不是特殊的对象。现在,在Java中什么是特殊的,什么是不特殊的?

上面的页面还说,POJO不必扩展预定类,实现预定接口或包含预定注释。这是否还意味着不允许POJO实现SerializableComparable之类的接口或Applets之类的类或任何其他用户编写的类/接口?

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

确切地在哪里使用POJO?

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

java terminology pojo
8个回答
58
投票

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

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

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

这里A是独立的简单对象。B是B的特殊对象,因为B正在扩展/实现C。所以B对象从C获得更多的含义,并且B严格遵循C的规则。B与分布式框架紧密耦合。因此,根据其定义,B对象不是POJO。使用类的代码,对象引用不必了解其类型,它可以与许多框架一起使用。

因此,POJO不必必须1)扩展预定的类和2)实现预定的接口。

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

POJO纯粹专注于业务逻辑,不依赖于(企业)框架。这意味着它具有用于业务逻辑的代码,但是该实例的创建方式,该对象属于哪个服务(EJB ..)以及它具有哪些特殊特征(有状态/无状态),将由框架使用外部xml来确定。文件。

示例1:JAXB是将Java对象表示为XML的服务;这些java对象很简单,并带有默认的构造函数getter和setters。

示例2:Hibernate,其中将使用简单的Java类来表示Table。列将为其实例。

示例3:REST服务。在REST服务中,我们将具有服务层和Dao层,以通过DB执行一些操作。因此,Dao将具有特定于供应商的查询和操作。服务层将负责调用哪个DAO层来执行数据库操作。 DAO的创建或更新API(方法)将以POJO为参数,并更新该POJO并插入/更新到DB中。这些POJO(Java类)将仅具有每个列的状态(实例变量)及其获取器和设置器。

在实践中,有些人认为注释优雅,而他们却认为XML冗长,丑陋且难以维护,而另一些人则发现注释污染了POJO模型。因此,作为XML的替代方法,许多框架(例如Spring,EJB和JPA)都允许使用注解代替XML:

优势:

将应用程序代码与基础架构框架分离是使用POJO的众多好处之一。使用POJO可以通过将应用程序与不断变化的,不断发展的基础架构框架脱钩,从而证明您的应用程序的业务逻辑。升级到新版本或切换到其他框架变得更容易,风险也更低。 POJO还使测试更加容易,从而简化并加速了开发。您的业​​务逻辑将更加清晰和简单,因为它不会与基础结构代码纠缠在一起参考:wiki source2

[According to Martin Fowler,他和其他一些人提出来,它是一种描述某种标准类而不是EJB等的方法。

该术语的使用暗示了它应该告诉您的内容。例如,如果依赖项注入框架告诉您可以将POJO注入任何其他POJO,他们想说您不必做任何特殊的事情:无需遵守与对象的任何协定,则实现任何接口或扩展特殊课程。您可以使用已经拥有的任何东西。

UPDATE

再举一个例子:虽然Hibernate可以将任何POJO(您创建的任何对象)映射到SQL表,但是在Core Data(iPhone上的目标C)中,您的对象必须扩展NSManagedObject才能使系统能够将它们持久化到数据库中。从这种意义上讲,Core Data无法与任何POJO(或更确切地说,POOCO = PlainOldObjectiveCObject)一起使用,而Hibernate则可以。 (由于我刚开始使用它,我可能不会100%正确地修改核心数据。欢迎任何提示/更正:-))。
普通的旧Java对象:)

好吧,听起来像是那些可怕的限制。

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

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

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

通常,与POJO一起使用的任何东西也将与非PO-JO一起使用。因此,XStream当然还将序列化Serializable类。

[POJO是一个普通的旧Java对象-与需要Enterprise Edition(J2EE)的东西(beans等)相比。

POJO并不是一个严格的定义,而是一种描述“正常”非企业Java对象的波状方式。在旁观者看来,使用外部库还是使用框架是否使对象成为POJO,很大程度上取决于WHAT库/框架,尽管我敢冒险猜测框架将使POJO少一些]

POJO的全部要点是简单性,您似乎在假设它比看起来要复杂。

如果库支持POJO,则表示任何类的对象都是可接受的。这并不意味着POJO不能具有注释/接口,或者如果它们存在就不会被使用,但这不是必须的。

恕我直言,维基页面相当清晰。它并不表示POJO不能具有注释/接口。

包含您扩展的所有业务逻辑的普通旧Java对象(PO​​JO)。>

Exp。 Pojo包含单个方法]

public class Extension { public static void logInfo(String message) { System.out.println(message); } }

术语“普通的旧Java对象(PO​​JO)是什么意思?

POJO

是Martin Fowler,Rebecca Parsons和Josh Mackenzie在2000年9月的一次会议上准备演讲时创造的。Patterns of Enterprise Application Architecture中的Martin Fowler解释了如何实现Domain Model模式在Java中。列举了使用EJB Entity Beans:的一些缺点之后
[当人们谈论时总是会产生大量热量在J2EE中开发域模型。许多教材和J2EE入门书籍建议您使用实体bean开发一个域模型,但是这种方法存在一些严重的问题,至少使用当前(2.0)规范。

当您使用容器托管时,实体bean最有用持久性(CMP)...

实体bean不能重入。也就是说,如果您从一个实体bean变成另一个对象,那个另一个对象(或它的任何对象)调用)无法回调到第一个实体Bean ...

...如果您具有带有细粒度接口的远程对象,则会得到糟糕的表现...

要与实体bean一起运行,您需要一个容器和一个数据库连接的。这将增加构建时间,也增加了时间进行测试运行,因为测试必须针对数据库执行。实体bean调试起来也很棘手。

作为替代方案,他提议将

Regular Java Objects

用于域模型实现:
替代方法是使用普通的Java对象,尽管通常引起令人惊讶的反应-令人惊讶的是,有多少人认为您不能在EJB容器中运行常规Java对象。

我来人们忘记常规Java对象的结论是因为他们没有一个好听的名字。这就是为什么在准备演讲时在2000年,丽贝卡·帕森斯(Rebecca Parsons),乔什·麦肯齐(Josh Mackenzie)和我给了他们一个:POJO(普通的Java旧对象)

。 POJO域模型很容易组合在一起,快速构建,可以在EJB容器外运行和测试,并且独立于EJB(也许这就是EJB供应商不鼓励您的原因使用它们)。

10
投票
[According to Martin Fowler,他和其他一些人提出来,它是一种描述某种标准类而不是EJB等的方法。

7
投票
该术语的使用暗示了它应该告诉您的内容。例如,如果依赖项注入框架告诉您可以将POJO注入任何其他POJO,他们想说您不必做任何特殊的事情:无需遵守与对象的任何协定,则实现任何接口或扩展特殊课程。您可以使用已经拥有的任何东西。

6
投票
普通的旧Java对象:)

4
投票
[POJO是一个普通的旧Java对象-与需要Enterprise Edition(J2EE)的东西(beans等)相比。

3
投票
POJO的全部要点是简单性,您似乎在假设它比看起来要复杂。

0
投票
包含您扩展的所有业务逻辑的普通旧Java对象(PO​​JO)。>

Exp。 Pojo包含单个方法]


0
投票
术语“普通的旧Java对象(PO​​JO)是什么意思?
© www.soinside.com 2019 - 2024. All rights reserved.