iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >解决Lombok使用@Builder无法build父类属性的问题
  • 803
分享到

解决Lombok使用@Builder无法build父类属性的问题

2024-04-02 19:04:59 803人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录Lombok使用@Builder无法build父类属性问题描述解决方案使用示例lombok @Builder注解和build父类属性问题1、简介2、使用3、@Builder注解对

Lombok使用@Builder无法build父类属性

问题描述

实体类使用Lombok的@Builder来实现Builder模式,但是如果使用了extend继承,则子类无法通过Builder来Build父类属性值

解决方案

父类增加@NoArgsConstructor、@AllArgsConstructor注解来增加无参和全参构造函数【注:父类属性不能设置为private,否则仍然无法访问,父类不允许有@Builder注解,否则会和子类冲突】

子类增加@NoArgsConstructor来增加无参构造函数,自定义一个全参构造函数(包含父类属性)

使用示例

父类:

package com.baijia.uqun.individual.management.facade;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Father {
    
    public String fatherName;
}

子类:

package com.baijia.uqun.individual.management.facade;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Setter
@Getter
@NoArgsConstructor
public class Child extends Father {
    
    private String childName;
    
    @Builder(toBuilder = true)
    public Child(String fatherName, String childName) {
        super(fatherName);
        this.childName = childName;
    }
}

使用:

package com.baijia.uqun.individual.management.facade;

public class Test {
    public static void main(String[] args) {
        // 创建一个子类
        Child child = Child.builder()
                .fatherName("父类名称")
                .childName("子类名称")
                .build();
        System.out.println(String.fORMat("父类名称:%s,子类名称:%s", child.getFatherName(), child.getChildName()));
    }
}

输出结果:

父类名称:父类名称,子类名称:子类名称

lombok @Builder注解和build父类属性问题

1、简介

通过@Builder注解,lombok可以方便的实践建造者模式。

2、使用

1)创建基类User

import lombok.*;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    private Long id;
    private String name;
}

2)创建子类UserExt

import lombok.*;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class UserExt extends User{
    private String address;
    private Integer age;
}

3)分别使用Builder创建父类和子类

// 父类
User user = User.builder().id(1L).name("saint").build();
// 子类
UserExt userExt = UserExt.builder().address("南京").age(18).build();

3、@Builder注解对类做了什么?

反编译后的UserExt.class:

public class UserExt extends User {
    private String address;
    private Integer age;
    public static UserExt.UserExtBuilder builder() {
        return new UserExt.UserExtBuilder();
    }
    public String getAddress() {
        return this.address;
    }
    public Integer getAge() {
        return this.age;
    }
    public void setAddress(final String address) {
        this.address = address;
    }
    public void setAge(final Integer age) {
        this.age = age;
    }
    public UserExt() {
    }
    public UserExt(final String address, final Integer age) {
        this.address = address;
        this.age = age;
    }
    public String toString() {
        return "UserExt(address=" + this.getAddress() + ", age=" + this.getAge() + ")";
    }
    public static class UserExtBuilder {
        private String address;
        private Integer age;
        UserExtBuilder() {
        }
        public UserExt.UserExtBuilder address(final String address) {
            this.address = address;
            return this;
        }
        public UserExt.UserExtBuilder age(final Integer age) {
            this.age = age;
            return this;
        }
        public UserExt build() {
            return new UserExt(this.address, this.age);
        }
        public String toString() {
            return "UserExt.UserExtBuilder(address=" + this.address + ", age=" + this.age + ")";
        }
    }
}

注解在编译后使UserExt类中多了一个名为UserExt.UserExtBuilder的静态内部类。这个静态类拥有和UserExt类相同的属性,并且他额外实现了一些方法:

1.address、age的属性方法

其实这些方法和setAttribute十分类似,只是额外返回了实例本身,这使得它可以使用类似于链式调用的写法。

2.build方法

该方法调用UserExt类的全参构造方法来生成UserExt实例。

UserExt类还是实现了builder方法,这个方法生成一个空的UserExt.UserExtBuilder实例。

4、优缺点

  • 优点:

写法更优雅,不需要太多的set方法设置属性。

  • 缺点:

在生成UserExt实例之前,先创建了一个UserExt.UserExtBuilder实例,其占用了额外的内存。并且Java是按值传递,我们可以直接修改引用对象,不用新建一个对象再赋值;而Builder.build()方法每次调用都会new一个实例出来。

5、问题:@Builder注解不能 build 父类属性

从反编译后的UserExt类可以看出,UserExtBuilder并没有从父类User继承来的属性:id、name的填充方法。

解决方案:

在子类和父类中都使用@SuperBuilder,去掉@Builder。但从import的包中也能看到@SuperBuilder注解是experimental实验性的。不知道会不存存在什么潜在风险,慎用。

从反编译后的User 和UserExt类来看:

public abstract static class UserBuilder<C extends User, B extends User.UserBuilder<C, B>>
public abstract static class UserExtBuilder<C extends UserExt, B extends UserExt.UserExtBuilder<C, B>> extends UserBuilder<C, B>

lombok对UserBuilder 与 UserExtBuilder做了继承关系

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 解决Lombok使用@Builder无法build父类属性的问题

本文链接: https://www.lsjlt.com/news/168061.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决Lombok使用@Builder无法build父类属性的问题
    目录Lombok使用@Builder无法build父类属性问题描述解决方案使用示例lombok @Builder注解和build父类属性问题1、简介2、使用3、@Builder注解对...
    99+
    2024-04-02
  • Lombok注解之@SuperBuilder--解决无法builder父类属性问题
    目录一.老规矩二.判断是否为相同问题(@Builder注解不能 build 父类属性)三.@SuperBuilder注解1. 概念(需要注意您的Lombok版本)2. 如何解决无法b...
    99+
    2024-04-02
  • 解决lombok父类和子类builder不兼容的问题
    目录遇到的问题排查和解决结尾遇到的问题 在写代码时,有时因为需要定义一些重复的参数,为了复用之前传参的DTO,会对原有的类进行继承,从而达到避免重复代码的效果。 但是,当父类中使用了...
    99+
    2024-04-02
  • 使用Lombok@Builder注解导致默认值无效的问题
    目录@Builder注解导致默认值无效原因分析lombok@Builder忽略属性默认值的坑点1. 简单使用2. 默认值问题3. 修改属性值@Builder注解导致默认值无效 使用L...
    99+
    2024-04-02
  • lombok插件无法使用的原因及解决方法
    这篇文章主要介绍“lombok插件无法使用的原因及解决方法”,在日常操作中,相信很多人在lombok插件无法使用的原因及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”lombok插件无法使用的原因及解...
    99+
    2023-06-20
  • lombok插件无法使用的原因及解决方案
    lombok插件无法使用的原因及解决 近日使用了一个lombok的插件,中间遇到无法插件无法使用的情况,于是将自已遇到的问题以及解决办法写下来: 在项目中如果使用注解 ,比如 @Se...
    99+
    2024-04-02
  • 解决@Validated注解无效,嵌套对象属性的@NotBlank无效问题
    目录@Validated注解无效,嵌套对象属性的@NotBlank无效步骤内层对象无法验证@Validated注解不生效问题、如何使用1、需要引入的包2、将@Validated打在c...
    99+
    2024-04-02
  • 解决mybatis无法给带有下划线属性赋值问题
    目录mybatis无法给带有下划线属性赋值问1、配置问题2、增加set方法转换值的方式解决方法实体类中有下滑线字段无法赋值问题mybatis无法给带有下划线属性赋值问 1、配置问题 ...
    99+
    2024-04-02
  • vue3无法使用jsx的问题及解决
    目录vue3无法使用jsx问题报错一:无法使用 JSX,除非提供了 "--jsx" 标志报错二:ElementPlusIconsVue挂载问题关于vue3的jsx...
    99+
    2024-04-02
  • 如何解决@Table注解无法使用的问题
    这篇文章主要介绍了如何解决@Table注解无法使用的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。@Table注解无法使用及报红在新建实体类时想直接序列化,遇到注解不起作...
    99+
    2023-06-26
  • 解决@Test注解在Maven工程的Test.class类中无法使用的问题
    目录@Test注解在Maven的Test.class类中无法使用异常背景异常信息异常分析解决方案Maven工程找不到@Testmaven的scope范围如下依赖的传递@Test注解在...
    99+
    2024-04-02
  • goland中npm无法使用的问题及解决
    目录goland中npm无法使用npm ERR!无法安装任何包的解决总结goland中npm无法使用 明明已经成功安装且配置了环境到windows上,而且goland上的配置也丝毫无...
    99+
    2022-12-26
    goland中npm npm无法使用 goland中npm使用
  • Springboot使用test无法启动问题的解决
    Springboot使用test无法启动 test无法启动,遇到 java.lang.IllegalStateException: Unable to find a @Spring...
    99+
    2024-04-02
  • 如何解决升级IDEA后Lombok不能使用的问题
    本篇内容介绍了“如何解决升级IDEA后Lombok不能使用的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!今天到工作室比较晚,在电脑前吃...
    99+
    2023-06-20
  • 如何解决div层调整z-index属性无效的问题
    本篇文章为大家展示了如何解决div层调整z-index属性无效的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。z-index 无效在做的过程中,发现了一个很简单...
    99+
    2024-04-02
  • 巧用Win7的“属性”功能 解决常用小问题的方法
    使用Win7有一段时间了,有时会遇到一些小问题,有时又有一些小需求,我发现这些都能通过调整“属性”这个设置很简单的完成,比如有时有无法运行的程序,有些程序会错位,还有些程序我经常用,希望能快速打开...
    99+
    2023-05-26
    win7属性功能 Win7 属性 问题 方法
  • 怎么使用CSS属性border-collapse解决table的边框问题
    小编给大家分享一下怎么使用CSS属性border-collapse解决table的边框问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解...
    99+
    2024-04-02
  • ie6下position:absolute属性不显示问题的解决方法
    本篇内容介绍了“ie6下position:absolute属性不显示问题的解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔...
    99+
    2024-04-02
  • Win10系统下无线网卡无法使用问题的解决方法
      Win10系统刚推出不久,便有无数的用户心急火燎地登上体验的大船,去尝鲜Win10的特性,但也要承担Win10尚不稳定的风险。有用户就在升级Win10后发现无线网卡用不了了,怎么解决这问题呢?   以下解决办法适用于...
    99+
    2023-06-09
    Win10 无线网卡 系统 解决 问题 网卡 方法
  • 怎么使用MyBatis高级映射ResultMap解决属性问题
    本篇内容介绍了“怎么使用MyBatis高级映射ResultMap解决属性问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ResultMap...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作