@Builder
@ApiModel(description = "二维平面统计图返回数据封装")
public class TwoDimensionalPlaneDTO implements Serializable {
@ApiModelProperty(hidden = true)
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "图例名称")
private String name;
@ApiModelProperty(value = "统计数据")
private String value;
public TwoDimensionalPlaneDTO(String value,String name){
this.name=name;
this.value=value;
public List<TwoDimensionalPlaneDTO> tranCargoRealTimeInfo() {
List<TwoDimensionalPlaneDTO> list = new ArrayList<>();
//使用builder ,参数错乱
list.add(TwoDimensionalPlaneDTO.builder().name("2类").value(Optional.ofNullable(reportDataManager.getDataByCond("data_int01","1000000243",null,"dim_char01","2类")).orElse("0")).build());
//调用构造方法,顺序正常
list.add(new TwoDimensionalPlaneDTO(Optional.ofNullable(reportDataManager.getDataByCond("data_int01","1000000243",null,"dim_char01","2类")).orElse("0"),"2类"));
return list;
结果对比:
@Builder 注解,在生成静态内部类后,会调用有参构造
实体类,反编译后的代码
package com.ls.uem.emer.vis.dal.dto.result;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@ApiModel(description = ")
public class TwoDimensionalPlaneDTO implements Serializable {
@ApiModelProperty(hidden = true)
private static final long serialVersionUID = 1L;
@ApiModelProperty(")
private String name;
@ApiModelProperty(")
private String value;
public void setName(String name) {
this.name = name;
public void setValue(String value) {
this.value = value;
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof TwoDimensionalPlaneDTO))
return false;
TwoDimensionalPlaneDTO other = (TwoDimensionalPlaneDTO)o;
if (!other.canEqual(this))
return false;
Object this$name = getName(), other$name = other.getName();
if ((this$name == null) ? (other$name != null) : !this$name.equals(other$name))
return false;
Object this$value = getValue(), other$value = other.getValue();
return !((this$value == null) ? (other$value != null) : !this$value.equals(other$value));
protected boolean canEqual(Object other) {
return other instanceof TwoDimensionalPlaneDTO;
public int hashCode() {
int PRIME = 59;
result = 1;
Object $name = getName();
result = result * 59 + (($name == null) ? 43 : $name.hashCode());
Object $value = getValue();
return result * 59 + (($value == null) ? 43 : $value.hashCode());
public String toString() {
return "TwoDimensionalPlaneDTO(name=" + getName() + ", value=" + getValue() + ")";
public static TwoDimensionalPlaneDTOBuilder builder() {
return new TwoDimensionalPlaneDTOBuilder();
// 生成的静态内部类
public static class TwoDimensionalPlaneDTOBuilder {
private String name;
private String value;
public TwoDimensionalPlaneDTOBuilder name(String name) {
this.name = name;
return this;
public TwoDimensionalPlaneDTOBuilder value(String value) {
this.value = value;
return this;
// 问题 所在
public TwoDimensionalPlaneDTO build() {
//调用有参构造,但是参数顺没传对。
return new TwoDimensionalPlaneDTO(this.name, this.value);
public String toString() {
return "TwoDimensionalPlaneDTO.TwoDimensionalPlaneDTOBuilder(name=" + this.name + ", value=" + this.value + ")";
public String getName() {
return this.name;
public String getValue() {
return this.value;
public TwoDimensionalPlaneDTO(String value, String name) {
this.name = name;
this.value = value;
OK ! 问题已发现。解决办法的话,首先看改实体类是否方便,如果别人也用到这个类,介意还是不要动了,可以选择用构造方法复制【没必要用builder构建了】。如果没有人用到的话,可以将构造方法的参数顺序调整正确就好了。
== 感谢原博主@青春不下线Eflying。原文地址:https://blog.csdn.net/Eflyings/article/details/108620746
是一个java库,它可以自动插入编辑器和构建工具,通过Lombok我们不需要再在类上编写setter/getter、equals、try/catch、无参构造器、全参构造器等方法。🎉实际上,Lombok主要作用是提高代码的简洁,减少代码量,本篇文章主要是概述了Lombok的常用注解的作用,以及同时使用@Data和@Builder。
Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get、set方法、构造器、equal、toString方法的时间。除此之外,通过@Builder注解,lombok还可以方便的时间建造者模式。
只需要定义一个静态公共的内部类即可。代码示例如下:
public class User {
private Integer id;
private String name;
private String address;
private Use
1、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
2、主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
3、如何使用:用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
4、解决的问题:
(1)、方便用户创建复杂的对象(不需要知道实现过程)
(2)、代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用)
5、注意事项:与工厂模式的区别是:建造者模式更加关
添加@Builder注解,一般情况下,@NoArgsConstructor和@AllArgsConstructor都是成对出现的。
如果要想设置默认值的话,就必须在属性字段上增加@Builder.Default注解,以方便new对象的时候,加入默认值。