首页 > 其他分享 >lombok的@Builder注解的坑

lombok的@Builder注解的坑

时间:2023-02-18 14:56:50浏览次数:31  
标签:return Builder value public Person other 注解 lombok id

1.导致无参构造丢失

  • 单独使用@Data注解,是会生成无参数构造方法。
  • 单独使用@Builder注解,发现生成了全属性的构造方法。

@Data和@Builder一起用:我们发现没有了默认的构造方法。如果用@NoArgsConstructor注解会报错!

直接加上这4个注解

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor

2.@Builder注解导致默认值失效

 

 

解决: 只需要在字段上面加上@Builder.Default注解即可,但是这样 new 出来得对象,默认值丢失

 

 

 

3.原因分析

我们使用注解的方式,底层本质就是反射帮我们生成了一系列的setter、getter,所以我们直接打开编译后的target包下面的.class文件,上面的所有原因一目了然!

我们想知道@Data、@Builder等注解底层到底做了什么,直接编译当前文件,即可在生成的.class字节码文件查看具体代码便知道了

@Builder 生成了一个内部类PersonBuilder,并针对每一个属性生成一个同名方法,builder()方法,将每个属性的值塞回到Person类中返回
public class Person {
    private Integer id;
    private String value;

    private static String $default$value() {
        return "yes";
    }

    public static Person.PersonBuilder builder() {
        return new Person.PersonBuilder();
    }

    public Integer getId() {
        return this.id;
    }

    public String getValue() {
        return this.value;
    }

    public void setId(final Integer id) {
        this.id = id;
    }

    public void setValue(final String value) {
        this.value = value;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Person)) {
            return false;
        } else {
            Person other = (Person)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$id = this.getId();
                Object other$id = other.getId();
                if (this$id == null) {
                    if (other$id != null) {
                        return false;
                    }
                } else if (!this$id.equals(other$id)) {
                    return false;
                }

                Object this$value = this.getValue();
                Object other$value = other.getValue();
                if (this$value == null) {
                    if (other$value != null) {
                        return false;
                    }
                } else if (!this$value.equals(other$value)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof Person;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $id = this.getId();
        int result = result * 59 + ($id == null ? 43 : $id.hashCode());
        Object $value = this.getValue();
        result = result * 59 + ($value == null ? 43 : $value.hashCode());
        return result;
    }

    public Person(final Integer id, final String value) {
        this.id = id;
        this.value = value;
    }

    public Person() {
    }

    public String toString() {
        return "Person(id=" + this.getId() + ", value=" + this.getValue() + ")";
    }

    public static class PersonBuilder {
        private Integer id;
        private boolean value$set;
        private String value;

        PersonBuilder() {
        }

        public Person.PersonBuilder id(final Integer id) {
            this.id = id;
            return this;
        }

        public Person.PersonBuilder value(final String value) {
            this.value = value;
            this.value$set = true;
            return this;
        }

        public Person build() {
            String value = this.value;
            if (!this.value$set) {
                value = Person.$default$value();
            }

            return new Person(this.id, value);
        }

        public String toString() {
            return "Person.PersonBuilder(id=" + this.id + ", value=" + this.value + ")";
        }
    }
}

  

 

标签:return,Builder,value,public,Person,other,注解,lombok,id
From: https://www.cnblogs.com/chcha1/p/17132577.html

相关文章

  • SpringBoot 官方文档示例(89):使用DataSourceBuilder构建数据源
    一、在application.properties中配置数据源信息app.datasource.url=jdbc:mysql://xxx.xxx.xxx.xxx/testapp.datasource.jdbcUrl=jdbc:mysql://xxx.xxx.xxx.xxx/testapp.data......
  • 学习APT以及简单应用( 注解实现 findViewById)
    本文的参考资料、原代码都可以在享学课堂中获取/***创建JavaLibraryModule名称为APTModule*1、创建自定义注解MQBindView*2、创建注解处理器MQProcessor*3......
  • Java @Data注解
    1、@Data注解是lombok.jar包下的注解,该注解通常用在实体bean上,不需要写出set和get方法,但是具备实体bean所具备的方法,简化编程提高变成速度。 2、@Data相当于@Getter@Sette......
  • 注解方式
    配置<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta......
  • Kafka的注解KafkaListener,属性:containerFactory
     kafka的2个topic,如果2个 ConsumerConfig配置不一样。@KafkaListener(id="${groupId}",topics={"TOPIC"},containerFactory="DefinekafkaListenerContainerFacto......
  • SpringMVC12 - 基于注解配置SpringMVC
    注解配置SpringMVC使用配置类和注解代替web.xml和SpringMVC配置文件的功能创建初始化类,代替web.xml在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.Servlet......
  • @Transactional注解的事务传播行为
    Transactional是Spring事务管理提供的注解,在一个方法中加上了这个注解,那么这个方法就将是有事务的,Transactional.propagation:传播行为1.Transactional注解中七种事务传......
  • 使用@PostConstruct 注解解决@Autowire注入对象为空
    在spring中,对象声明周期为构造器->@Autowired->@PostConstruct有初始化用到@Autowired对象的需求,可以在初始化方法加上@PostConstruct注解    ......
  • uni-app:nvue和vue均引入自定义字体文件(hbuilderx 3.6.18)
    一,复制字体文件到static目录下,如图: 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest     对应的源码可以访问这里......
  • AOP + 注解 实现通用的接口参数校验
    大家好,我是小悟写移动端接口的时候,为了校验参数,传统的做法是加各种判断,写了很多重复的代码,而且也不美观。为了增加代码复用性,美观的校验参数,采用AOP+注解的方式来实现接口......