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类可以遵循下面规则:

  1. 每个变量应该声明成private,约束直接访问
  2. 每个变量需要被外面的类访问时,应该有一个getter或setter或两者都有的方法。如果一个变量需要经过一些计算再存储,就不需要任何的setter方法了。
  3. 必须有一个默认的public的构造函数
  4. 可以重写toString(), hashcode和equals()方法
  5. 可以包含必要的业务逻辑

一些不允许的限制规则:

  1. 继承预指定的类
  2. 实现预指定的接口
  3. 包含预指定的注释

根据上面的规则,我们可以重构一下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的有点:

  1. 增加可读性
  2. 提供类型检查
  3. 可以序列化和反序列化
  4. 可以用于任何框架的任何地方
  5. 方法数据操作,在获取和设置一个值前可以有逻辑处理
  6. POJO用于Builder模式
  7. 经常用于创建API的payload
  8. 重用性