【Code Piece】pojo中set()的高级替换

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














猜你喜欢

转载自blog.csdn.net/u013047584/article/details/79114724