REST Assured 系列汇总 之 REST Assured - 28 什么是Plain Old Java Object (POJO) ?
Java支持面向对象编程系统(Object Oriented Programming System OOPs),这是一种编程模型。我们可以理解这样一种编程方式,围绕对象Object及对象包含的数据(成员变量)和操作这些数据的方法(成员方法)。
例如:一个公司有许多员工,我们需要存储一些详细信息,并且我们还能方便访问和操作这些数据。如果我们创建一个Employee对象,定义一些数据和操作这些数据的方法,这个问题就可以解决了。
我们可以创建一个Employee类,为了存储相关数据,我们在这个类里声明字段或变量。为了操作这些数据,我们定义一些方法。
public class Employee {
// fields to store data
public String firstName;
public String lastName;
public double salary;
public String cityName;
public boolean isMarried;
public char gender;
// Create employees with different data
public Employee(String firstName, String lastName, double salary, String cityName, boolean isMarried,
char gender) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.salary = salary;
this.cityName = cityName;
this.isMarried = isMarried;
this.gender = gender;
}
// Public getter setter methods
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public boolean isMarried() {
return isMarried;
}
public void setMarried(boolean isMarried) {
this.isMarried = isMarried;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
现在我们可以用Employee类不同的对象来存储所有员工的信息。
public class EmployeeDetails {
public static void main(String[] args) {
Employee kevin = new Employee("Kevin", "Zhang", 100000, "Shanghai", false, 'M');
Employee peter = new Employee("Peter", "Wang", 200000, "Jiangxi", true, 'M');
// Get married status of Kevin
System.out.println("Is Kevin married? : "+kevin.isMarried());
// Kevin is married now and change data
kevin.setMarried(true);
System.out.println("Is Kevin married now ? : "+kevin.isMarried());
// Increase salary of Peter
peter .setSalary(500000);
System.out.println("Updated salary of Peter : "+ peter.getSalary());
}
}
上面例子的业务逻辑非常简单,peter和kevin是普通的Java对象或POJO。
POJO(Plain Old Java Object),是普通的Java对象。这个词是由Martin Fowler, Rebecca Parsons 和Josh MacKenzie于2000年9月提出的,当时他们在谈论将业务逻辑编码成常规的Java对象而不用Entity Beans 或JavaBeans的优势。
“We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it’s caught on very nicely. ” – Martin Fowler
参考 Wikipedia POJO最初指的就是一个Java对象,没有遵循任何主流的Java对象模型,框架和协议。
怎样使得POJO更有效
一个POJO应该以哪种简单方式创建以致能有效利用。上面的例子中,所有的成员都被声明是public的,意味着任何人都可以直接访问这些变量和方法。按某种规范来创建一个POJO有助于数据存储和操作的设计。
一个POJO类可以遵循下面规则:
- 每个变量应该声明成private,约束直接访问
- 每个变量需要被外面的类访问时,应该有一个getter或setter或两者都有的方法。如果一个变量需要经过一些计算再存储,就不需要任何的setter方法了。
- 必须有一个默认的public的构造函数
- 可以重写toString(), hashcode和equals()方法
- 可以包含必要的业务逻辑
一些不允许的限制规则:
- 继承预指定的类
- 实现预指定的接口
- 包含预指定的注释
根据上面的规则,我们可以重构一下Employee类:
public class EmployeePojo {
// Private fields
private String firstName;
private String lastName;
private double salary;
private String cityName;
private boolean isMarried;
private char gender;
private String fullName;
// Public constructor
public EmployeePojo()
{
}
// Business logic to get full name
public String getFulName()
{
this.fullName = this.firstName + " "+ this.lastName;
return fullName;
}
// Public getter setter methods
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public boolean isMarried() {
return isMarried;
}
public void setMarried(boolean isMarried) {
this.isMarried = isMarried;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
使用Employee类:
public class EmployeePojoUsage {
public static void main(String[] args) {
EmployeePojo kevin;
EmployeePojo peter;
// Setting employees details
kevin= new EmployeePojo();
kevin.setFirstName("Kevin");
kevin.setLastName("Zhang");
kevin.setCityName("Shanghai");
kevin.setGender('M');
kevin.setMarried(false);
kevin.setSalary(10000.54);
peter = new EmployeePojo();
peter .setFirstName("Peter");
peter .setLastName("Wang");
peter .setCityName("Jiangxi");
peter .setGender('M');
peter .setMarried(false);
peter .setSalary(23232.45);
// Printing details of employees
System.out.println("Details of Employees :-");
System.out.println("First Name : "+ kevin.getFirstName());
System.out.println("Last Name : "+ kevin.getLastName());
System.out.println("Full Name : "+ kevin.getFulName());
System.out.println("City Name : "+ kevin.getCityName());
System.out.println("Is Married?: "+ kevin.isMarried());
System.out.println("Gender : "+ kevin.getGender());
System.out.println("Salary : "+ kevin.getSalary());
System.out.println("==========================================");
System.out.println("First Name : "+ peter.getFirstName());
System.out.println("Last Name : "+ peter.getLastName());
System.out.println("Full Name : "+ peter.getFulName());
System.out.println("City Name : "+ peter.getCityName());
System.out.println("Is Married?: "+ peter.isMarried());
System.out.println("Gender : "+ peter.getGender());
System.out.println("Salary : "+ peter.getSalary());
}
}
POJO的有点:
- 增加可读性
- 提供类型检查
- 可以序列化和反序列化
- 可以用于任何框架的任何地方
- 方法数据操作,在获取和设置一个值前可以有逻辑处理
- POJO用于Builder模式
- 经常用于创建API的payload
- 重用性