之前,写pojo类大概都是这样:
piece - 01
package com.basecode;
//import java.nio.file.attribute.AclEntry.Builder;
/**
* 员工pojo
* @author vincent
*
*/
public class EmpTest {
private Integer id;
private Integer empLevel; //员工级别
private String mapingOrderLevel; //对应订单级别
private String empNo; //员工号
private Integer orderNumLimit; //每次接单上线
//1
private EmpTest(Builder builder){
setId(builder.id);
setEmpLevel(builder.empLevel);
setMapingOrderLevel(builder.mapingOrderLevel);
setEmpNo(builder.empNo);
setOrderNumLimit(builder.orderNumLimit);
}
//2
public static Builder newBuilder(){
return new Builder();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getEmpLevel() {
return empLevel;
}
public void setEmpLevel(Integer empLevel) {
this.empLevel = empLevel;
}
public String getMapingOrderLevel() {
return mapingOrderLevel;
}
public void setMapingOrderLevel(String mapingOrderLevel) {
this.mapingOrderLevel = mapingOrderLevel;
}
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public Integer getOrderNumLimit() {
return orderNumLimit;
}
public void setOrderNumLimit(Integer orderNumLimit) {
this.orderNumLimit = orderNumLimit;
}
//3
public static final class Builder{
private Integer id;
private Integer empLevel;
private String mapingOrderLevel;
private String empNo;
private Integer orderNumLimit;
public Builder(){
}
public Builder id(Integer val){
id = val;
return this;
}
public Builder empLevel(Integer val){
empLevel = val;
return this;
}
public Builder mapingOrderLevel(String val) {
mapingOrderLevel = val;
return this;
}
public Builder empNo(String val) {
empNo = val;
return this;
}
public Builder orderNumLimit(Integer val) {
orderNumLimit = val;
return this;
}
public EmpTest build() {
return new EmpTest(this);
}
}
}
暂且分析上述代码,正常情况下会写成:
piece - 02
/**
* 员工pojo -- 通常写法
* @author vincent
*
*/
public class EmpTest {
private Integer id;
private Integer empLevel; //员工级别
private String mapingOrderLevel; //对应订单级别
private String empNo; //员工号
private Integer orderNumLimit; //每次接单上线
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getEmpLevel() {
return empLevel;
}
public void setEmpLevel(Integer empLevel) {
this.empLevel = empLevel;
}
public String getMapingOrderLevel() {
return mapingOrderLevel;
}
public void setMapingOrderLevel(String mapingOrderLevel) {
this.mapingOrderLevel = mapingOrderLevel;
}
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public Integer getOrderNumLimit() {
return orderNumLimit;
}
public void setOrderNumLimit(Integer orderNumLimit) {
this.orderNumLimit = orderNumLimit;
}
}
我在"piece - 01"中通过注释//1,2,3,标明了"piece - 01"和"piece - 02"在写法上的区别,下面详细分析“piece - 01”的具体写法。
注意几点:
1.EmpTest类中存在内部静态类"Builder"。
2.EmpTest类中的静态方法"newBuilder()"返回一个内部类实例。
3.EmpTest类的构造方法,入参Builder对象,分别为EmpTest的属性赋值。
4.共有化内部类Builder的构造函数。
5.内部类Builder中"build()"方法返回一个外部类EmpTest实例。
姑且先画一个流程:
使用Pojo类:
需求 --> main() 方法中展示这50名员工的信息。
piece - 03
public class SplitMark {
public static List<EmpTest> empList;
//类加载时初始化
static{
empList = new ArrayList<>();
orderList = new ArrayList<>();
for(int i=0;i<50;i++){
empList.add(EmpTest.newBuilder().empLevel(getRandom(5)).empNo("Emp_"+i).id(i)
.mapingOrderLevel(getRandomChar()).orderNumLimit(getRandom(100)).build());
}
}
public static void main(String[] args) {
for(int i=0;i<50;i++){
System.out.println(empList.get(i).toString()); //直接对象.toString(),需要重写
}
}
//员工级别定义为0~a之间
public static Integer getRandom(int a) {
Random random = new Random();
return random.nextInt(a);
}
//订单级别模拟为A,B,C,D 四个等级
public static String getRandomChar() {
String chars = "ABCD";
return String.valueOf(chars.charAt((int)(Math.random() * 4)));
}
}
如上,piece - 03中的代码,
JVM类加载机制学习过,static{}块中这部分代码,会为static List赋初始值,void main()执行前,50个员工的信息就以及赋值完成了。
需要注意的是,此时对EmpTest这个pojo调用的写法是这样:
piece - 04
for(int i=0;i<50;i++){
empList.add(EmpTest.newBuilder().empLevel(getRandom(5)).empNo("Emp_"+i).id(i)
.mapingOrderLevel(getRandomChar()).orderNumLimit(getRandom(100)).build());
}
侧重这一句:
piece -05
EmpTest.newBuilder().empLevel(getRandom(5)).empNo("Emp_"+i).id(i)
.mapingOrderLevel(getRandomChar()).orderNumLimit(getRandom(100)).build();
结构: POJO类.newBuilder().内部类方法().内部类方法()…….build()
发现:1."EmpTest"类并没有实例化。
2.未使用传统set()方法为其属性赋值。
3.经过内部类Build的build()方法调用,创建pojo实例,并完成赋值。
结合piece - 03 - 04 - 05回头再去看我画的那副图,以及piece - 01中的代码,这种使用POJO的写法已经非常巧妙了,其实这个时候,实体类已经不是POJO类了。修改了实体类的构造,外部类的构造函数成了连接内外部类的纽带,内部类的build()方法,则直接返回一个外部类的实例,(前提保证外部类、内部类的属性对应一致)再使用起来,属性赋值,就非常方便了。
ES源码中的属性赋值有这样写,组长也很建议我这样写,我分享给大家。