普通旧 Java 对象(POJO)的含义是什么?

普通旧 Java 对象(POJO)这个术语是什么意思? 我找不到任何足够的解释。

POJO 的 Wikipedia 页面 显示 POJO 是一个普通的 Java 对象,而不是一个特殊的对象。现在,在 Java 中什么使得或者什么不使得和对象特殊?

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

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

POJO 到底在哪里使用?

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

42687 次浏览

普通的旧 Java 对象:)

你说得好像这些都是很糟糕的限制。

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

这意味着,无论您使用的是什么库/API,都非常愿意使用没有经过任何修改或人工处理的 Java 对象,也就是说,您不需要做任何特殊的事情就可以让它们工作。

例如,XStreamXML 处理器(我认为)会很高兴地序列化不实现 Serializable接口的 Java 类。这是一个加分!许多使用数据对象的产品都强制您实现 SomeProprietaryDataObject,甚至扩展 AbstractProprietaryDataObject类。许多库会期望 bean 行为,例如 getter 和 setter。

通常,任何适用于 POJO 的东西也会适用于不太适合 PO-JO 的东西。

POJO 是一个普通的旧 Java 对象——与需要企业版(J2EE)内容(bean 等)的对象相比。

POJO 并不是一个硬性的定义,更像是一种描述“普通的”非企业 Java 对象的手工方式。使用外部库或框架是否可以创建一个对象 POJO,这在很大程度上取决于 WHAT 库/框架,尽管我大胆猜测一个框架可以创建一个不那么像 POJO 的对象

这个词的用法意味着它应该告诉你什么。例如,如果一个依赖注入框架告诉你,你可以把一个 POJO 注入到任何其他的 POJO 中,他们想说你不需要做任何特殊的事情,不需要遵守任何与你的对象的契约,实现任何接口或者扩展特殊的类。你可以用你已经有的东西。

UPDATE 再举一个例子: Hibernate 可以将任何 POJO (任何你创建的对象)映射到 SQL 表,而在 Core Data (iPhone 上的 Objective C)中,你的对象必须扩展 NSManagedObject,这样系统才能将它们持久化到数据库中。从这个意义上说,核心数据不能与任何 POJO (或者更确切地说,POOCO = PlainOldObjectiveCObject)一起工作,而 Hibernate 可以。(我可能不会100% 正确的再核心数据,因为我刚开始拿起它。欢迎任何提示/更正: ——)。

POJO 的全部意义在于简单性,您似乎假设它比看起来更复杂。

如果库支持 POJO,则意味着可以接受任何类的对象。这并不意味着 POJO 不能有注释/接口,也不意味着如果有注释/接口就不会使用它们,但这不是一个必需条件。

恕我直言,wiki 页面相当清晰,它并没有说 POJO 不能有注释/接口。

普通的旧 Java 对象 这个名称用来强调给定的对象是普通的 Java 对象,而不是像 EJB 2框架定义的那样的特殊对象。

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

注意: 当 C 是某种分布式框架类或 ifc 时,B 是非 POJO。 例如 javax.servlet.http. HttpServlet、 javax.ejb. EntityBean 或 J2EE extn 而且不可序列化/可比较。因为可序列化/可比较对 POJO 是有效的。

这里 A 是独立的简单对象。 B 是一个特殊的对象,因为 B 正在扩展/实现 C。因此,B 对象从 C 中获得了更多的意义,B 对遵循 C 的规则有所限制,而 B 是具有分布式框架的 紧密结合。因此,从定义来看,B 对象不是 POJO。

使用类 A 对象引用的代码不需要知道类 A 对象引用的类型,而且可以在许多框架中使用。

因此,POJO 不应该1)扩展预先指定的类,2)实现预先指定的接口。

JavaBean 是 POJO 的一个例子,它是可序列化的,有一个无参数构造函数,并允许使用遵循简单变数命名原则的 getter 和 setter 方法访问属性。

POJO 纯粹关注业务逻辑,不依赖于(企业)框架。 这意味着它有业务逻辑的代码,但是这个实例是如何创建的,具体是哪个服务(EJB。.)这个对象属于什么,它有什么特殊的特征(有状态的/无状态的) ,将由框架通过使用外部 xml 文件来决定。< BR >

例1: JAXB 是将 java 对象表示为 XML 的服务,这些 java 对象非常简单,并且提供了缺省构造函数的 getter 和 setter。

示例2: Hibernate,其中简单的 java 类将用于表示一个 Table.column 将是它的实例。

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

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

优点:
将应用程序代码与基础结构框架分离是使用 POJO 的诸多好处之一。使用 POJO 通过将应用程序与易变的、不断发展的基础结构框架分离,从而验证应用程序的业务逻辑。升级到新版本或者切换到不同的框架变得更加容易,风险也更小。POJO 还使得测试更加容易,从而简化和加速了开发。您的业务逻辑将更加清晰和简单,因为它不会与基础结构代码纠缠在一起

参考文献: 维基百科

包含扩展的所有业务逻辑的普通旧 Java 对象(POJO)。

Exp.Pojo,它包含一个方法

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

普通旧 Java 对象(POJO)这个术语是什么意思?

POJO 是由 Martin Fowler,Rebecca Parsons 和 Josh Mackenzie 在2000年9月的一次会议上准备发言时创造的。MartinFowler 在 企业应用体系结构模式中解释了如何在 Java 中实现 域模型模式。在列举了使用 EJB 实体豆的一些缺点之后:

当人们谈论 在 J2EE 中开发一个领域模型 J2EE 入门书籍建议您使用实体 bean 开发一个 领域模型,但这种方法存在一些严重的问题, 至少符合当前(2.0)规范。

使用容器管理时,实体 bean 最有用 坚持(CMP) ..。

实体 bean 不能重入,也就是说,如果您从一个实体 bean 调用 实体 bean 转换为另一个对象,即该另一个对象(或该对象的任何对象) 调用)不能调用回第一个实体 bean..。

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

要使用实体 bean 运行,需要一个容器和一个数据库 这将增加构建时间,也会增加时间 执行测试,因为测试必须针对数据库执行。 实体 bean 也很难调试。

作为替代方案,他建议使用 常规 Java 对象来实现域模型:

另一种方法是使用普通的 Java 对象,尽管这种情况经常发生 会引起一种惊讶的反应ーー很多人会这样想,真是令人惊讶 你不能在 EJB 容器中运行普通的 Java 对象 结论是人们忘记了普通的 Java 对象,因为 他们没有一个花哨的名字。这就是为什么,在准备演讲的时候 2000年 Rebecca Parsons Josh Mackenzie 和我给了他们一个 POJO (普通的旧 Java 对象) POJO 域模型很容易放在一起, 构建速度快,可以在 EJB 容器外运行和测试,并且 独立于 EJB (也许这就是为什么 EJB 供应商不鼓励您 使用它们)。

有大量的帖子,一半正确,一半不正确。雷克斯 M 在他们的答案在这里给出了正确解释的最佳例子。

[ POJO 是类]它不需要任何重要的“勇气”来制作 这个想法与非常相关的物体形成了对比 被(或不能被)实例化和操纵的困难时期 拥有-他们需要其他服务、驱动程序、提供者实例等。 也要出席。

不幸的是,这些非常相同的答案往往伴随着误解,他们是不知何故 很简单或经常有一个 结构简单。这并不一定正确,混淆似乎源于这样一个事实: 在 Java (POJO)和 C # 世界(POCO)中,业务逻辑相对容易建模,尤其是在 Web 应用程序世界中。

POJO 可以有多个继承级别、泛型类型、抽象等。碰巧的是,大多数 web 应用程序并不需要这样做,因为业务逻辑并不需要这样做——很多工作都投入到数据库、查询、数据传输对象和存储库中。

一旦你开始使用简单的 web 应用程序,你的 POJO 就会变得更加复杂。制作一个网络应用程序,分配出租车的用户时间表。为此,您需要一个图着色算法。为了给图表着色,您需要一个图形对象。图中的每个节点都是一个调度对象。现在,如果我们想使它通用,以便着色的图表可以完成不仅与时间表,但其他事情以及。我们可以使它变得通用、抽象并添加继承级别——几乎可以使它成为一个迷你库。

不过在这一点上,无论其复杂性如何,它的 还是都是一个 POJO,因为它不依赖于其他框架的内部结构。