1.介绍

在这个简短的教程中,我们将研究“普通Java对象”(Plain Old Java Object)的定义,简称POJO。我们将看看POJO与JavaBean的比较,以及如何将POJO转换为JavaBean。

2.普通java对象

2.1 何为普通java对象?

当我们谈论POJO时,我们所描述的是一个简单的类型,没有任何特定框架的引用。POJO对我们的属性和方法没有命名约定。

让我们创建一个基本的员工POJO。它将有三个属性;名字、姓氏和入职日期:

public class EmployeePojo {

    public String firstName;
public String lastName;
private LocalDate startDate; public EmployeePojo(String firstName, String lastName, LocalDate startDate) {
this.firstName = firstName;
this.lastName = lastName;
this.startDate = startDate;
} public String name() {
return this.firstName + " " + this.lastName;
} public LocalDate getStart() {
return this.startDate;
}
}

这个类可以被任何Java程序使用,因为它不绑定到任何框架。但是,我们没有遵循任何真正的约定来构造、访问或修改类的状态。这种缺乏惯例的做法造成了两个问题:

1)如何使用它需要理解一下。

2)它可能会限制框架对其支持约定而不是配置、理解如何使用类以及增强其功能的能力。

为了探索第二点,让我们使用反射来处理EmployeePojo。因此,我们将开始发现它的一些局限性。

2.1 反射一个POJO

先添加一个依赖:

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>

现在,让我们检查一下POJO的属性:

List<String> propertyNames =
PropertyUtils.getPropertyDescriptors(EmployeePojo.class).stream()
.map(PropertyDescriptor::getDisplayName)
.collect(Collectors.toList());

如果要将propertyNames打印到控制台,我们只会看到:

[start]

在这里,只找到start(因为是getStart方法)。PropertyUtils未能找到其他两个。

如果我们使用像Jackson这样的其他库来处理EmployeePojo,我们也会看到同样的结果。

理想情况下,我们可以查看所有属性:firstName、lastName和startDate。好消息是许多Java库默认支持JavaBean命名约定。

3.JavaBeans

3.1 何为JavaBean?

JavaBean仍然是一个POJO,但围绕如何实现它引入了一组严格的规则:

  • 访问级别—要求属性是私有的,并暴露公开getter和setter方法。
  • 方法名–getter和setter遵循getX和setX约定(对于布尔值,isX可以用于getter)
  • 默认构造函数–必须存在无参数构造函数,以便在不提供参数的情况下创建实例,例如在反序列化期间

Serializable–实现Serializable接口允许我们存储状态。

3.2 将EmployeePojo转换为一个JavaBean

public class EmployeeBean implements Serializable {

    private static final long serialVersionUID = -3760445487636086034L;
private String firstName;
private String lastName;
private LocalDate startDate; public EmployeeBean() {
} public EmployeeBean(String firstName, String lastName, LocalDate startDate) {
this.firstName = firstName;
this.lastName = lastName;
this.startDate = startDate;
} public String getFirstName() {
return firstName;
} public void setFirstName(String firstName) {
this.firstName = firstName;
} // additional getters/setters }

3.3 反射一个JavaBean

当我们用反射检查bean时,现在我们得到了属性的完整列表:

[firstName, lastName, startDate]

4.使用JavaBeans时的权衡

所以,我们展示了JavaBeans的一种有用方法。注意,每一个设计选择都会带来权衡。

在使用JavaBeans时,我们还应该注意一些潜在的缺点:

  • 可变性–JavaBean由于其setter方法而具有可变性–这可能会导致并发性或一致性问题
  • 样板文件–我们必须为所有属性引入getter,为大多数属性引入setter,其中大部分可能是不必要的零参数构造函数——我们经常需要构造函数中的参数来确保对象以有效状态实例化,但是JavaBean标准要求我们提供零参数构造函数。

考虑到这些权衡,这些年来,框架也适应了其他bean约定。

5.示例代码

完整程序代码:什么是POJO

Java中的POJO是什么?的更多相关文章

  1. [转]Java中的POJO类

    简单的Java对象(Plain Old Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter se ...

  2. java中的POJO、PO、VO分别是什么?

    1.PO:persistant object 持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择. 2. VO:value object值对象. 通常 ...

  3. java中的PO,VO,TO,BO,DAO,POJO的解释

    java的(PO,VO,TO,BO,DAO,POJO)解释  O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定 ...

  4. 在Java中VO , PO , BO , QO, DAO ,POJO是什么意思

    在Java中VO , PO , BO, DAO ,POJO是什么意思 最近在项目中,遇到VO,我的天...那就一起学习回忆一下 首先简单说明下: O/R  Mapping是Object Relatio ...

  5. java中的几种架构对象(PO,VO,DAO,BO,POJO)

    java中的几种对象(PO,VO,DAO,BO,POJO)   一.PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生 ...

  6. Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图(转)

    PO(bean.entity等命名): Persistant Object持久对象,数据库表中的记录在java对象中的显示状态 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作 ...

  7. java中使用反射获取pojo(实体)类的全部字段值

    说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...

  8. java中POJO类和DTO类都要实现序列化

    java中POJO类和DTO类都要实现序列化 java中POJO类和DTO类都要实现序列化 java中POJO类和DTO类都要实现序列化 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序 ...

  9. java中使用反射获取pojo(实体)类的所有字段值

    出处:https://developer.aliyun.com/article/239346 说起反射,不得不说它实在是太强大了,通过反射就可以轻轻松松拿到各种东东,如果你想在项目中解除对某个类的依赖 ...

  10. java中pojo对象首字母大写导致无法赋值问题

    命名规范(文末附有java命名规范)中指出,属性变量命名应采用驼峰命名的方式,即首字母小写,其他单词首字母大写: 但有时候我们对接三方的接口时,想要封装实体类来接受,但是发现接收到的参数的变量首字母是 ...

随机推荐

  1. 【OpenVINO】基于 OpenVINO C# API 部署 RT-DETR 模型

      RT-DETR是在DETR模型基础上进行改进的,一种基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,在前文我们发表了<基于 OpenVINO ...

  2. [转帖]ESXi主机RAID卡_HBA卡_网卡 型号_固件_驱动查询

    https://www.cnblogs.com/vincenshen/p/12332142.html 一.RAID卡/HBA卡 型号_固件_驱动查询 1. 查询所有SCSI设备列表 # esxcfg- ...

  3. [转帖]060-轻量级基于curl的seafile上传脚本

    https://anjia0532.github.io/2021/04/07/seafile-client-curl/ 这是坚持技术写作计划(含翻译)的第 60 篇,定个小目标 999,每周最少 2 ...

  4. 使用perfdog如何测试微信小程序

    测试微信小程序和测试其他app唯一的不同点是如何在app中选中要测试的小程序 至于其他的基本操作可查看https://www.cnblogs.com/lihongtaoya/p/15140610.ht ...

  5. vue3异步组件按需加载和vue2异步组件的按需加载

    vue3 按需加载组件 子组件.vue <template> <div> <p>这个组件按需加载</p> <h1>这个组件显示</h1 ...

  6. 解决node与npm版本不一致,出现npm WARN npm npm does not support Node.js v15.14.0

    出现node与npm版本不一致 今天我升级了node之后,出现的了如下信息 npm WARN npm You should probably upgrade to a newer version of ...

  7. 替换 &开头。;结尾之间的内容。用空格代替他们

    替换 &开头.;结尾之间的内容.用空格代替他们 var regExp = /\&.*?\;/g; var str = '123&asdsa;dqwe'; str = str.r ...

  8. 华为云虚拟IP申请

    在上一篇文章当中我们搭建好了我们的 Nginx,这节呢,我们主要就是搭建我们的 Keepalive 与 Haproxy,搭建之前我们首先不要将我们华为云上面的弹性公网IP给取消了后续在取消,这次我介绍 ...

  9. 人工智能LLM模型:奖励模型的训练、PPO 强化学习的训练、RLHF

    人工智能LLM模型:奖励模型的训练.PPO 强化学习的训练.RLHF 1.奖励模型的训练 1.1大语言模型中奖励模型的概念 在大语言模型完成 SFT 监督微调后,下一阶段是构建一个奖励模型来对问答对作 ...

  10. 9.2 Windows驱动开发:内核解析PE结构导出表

    在笔者的上一篇文章<内核特征码扫描PE代码段>中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址,并通过ntimage.h ...