Java中的POJO是什么?[通俗易懂]

Java中的POJO是什么?[通俗易懂]1.介绍在这个简短的教程中,我们将研究“普通Java对象”(PlainOldJavaObject)的定义,简称POJO。我们将看看POJO与JavaBean的比较,以及如何将POJO转换为JavaBean。2.普通java对象2.1何为普通java对象?当我们谈论POJO时,我们所描述的是一个简单的类型,没有任何特定框架的引用。POJO对我们的属性和方法没有命名约定。让我们创建一个基本的员工POJO。它将有三个属性;名字、姓氏和入职日期:publicclassEmployeePojo

大家好,又见面了,我是你们的朋友全栈君。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140203.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • fwrite和fread函数的用法小结_fwrite和fread

    fwrite和fread函数的用法小结_fwrite和fread1.函数功能用来读写一个数据块。2.一般调用形式fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);3.说明(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。(2)size:要读写的字节数;(3)count:要

    2022年9月5日
    2
  • SCSA—信息安全概述

    SCSA—信息安全概述数字化时代威胁升级:攻击频发、传统安全防护逐渐失效、安全风险能见度低、缺乏自动化防御手段一、信息安全概述:1)信息安全:防止任何对数据进行未授权访问的措施,或者防止造成信息有意无意泄漏、破坏、丢失等问题的发生,让数据处于远离危险、免于威胁的状态或特性2)网络安全:计算机网络环境下的信息安全二、信息安全的脆弱性及常见安全攻击1.网络的开放性:互联网的美妙之处在于你与每一个相连,它的可怕之处在于每一个人与你相连2.协议栈的脆弱性及常见攻击1)协议栈的自身脆弱性:缺乏数据源验证机制、缺乏机密性保障机

    2022年6月20日
    30
  • win10 系统WLAN不见了,win10找不到wifi选项的解决办法

    win10 系统WLAN不见了,win10找不到wifi选项的解决办法问题如下图所示:可以看到没有WLAN设置的选项而且是无网络的状态解决办法:两步就好了第一步,以管理员身份运行CMD点击Cortana输入cmd鼠标右键命令提示符以管理员身份运行还有一种办法就是进入C:\Windows\System32还是右键以管理员身份运行两种方法都可以第二步:使用netshwinsockreset…

    2022年7月27日
    1
  • NOIP2011题解

    NOIP2011题解D1T1.铺地毯题目描述为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯,一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大

    2022年7月3日
    21
  • 推荐一个命名变量的神奇网站 CODELF

    推荐一个命名变量的神奇网站 CODELF推荐一个命名变量的神奇网站CODELF在我们写程序的时候,总是需要去给各种变量命名。于是各种命名大法都上来了,有拼音的,有首字母缩写的,各种各样。而我们推荐的命名肯定是英文的驼峰命名。今天给大家推荐一个网站:https://unbug.github.io/codelf/这个网站可以根据你输入的关键词,给出很多变量命名的推荐。并且支持中文。另外,针对各种主流编辑器,还有插件。非常推荐大家收藏一下这个

    2022年5月4日
    224
  • sql语法:inner join on, left join on, right join on具体用法

    sql语法:inner join on, left join on, right join on具体用法

    2021年12月15日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号