之前,写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源码中的属性赋值有这样写,组长也很建议我这样写,我分享给大家。