lombok.Builder @Builder 编译Error:(xx,xx)java: 找不到符号cannot find symbol class Builder

发布于:2022-12-30 ⋅ 阅读:(740) ⋅ 点赞:(0)

目录

1.前言(废话)

2.测试代码

2.1 基本类

2.2 在OuterClass添加静态方法:入参是User,返回值是OuterClass.java(编译正确)

2.3 修改OuterClass添加静态方法,加入了一些常见的业务逻辑判断(编译报错 java:找不到符号)


1.前言(废话)

        在日常的软件开发工作中,建造者模式(或创建者模式)是很实用的一种设计模式,用于很方便地创建一个对象,减少写get、set、无参构造器等方法的时间,特别是在类的成员比较多的情况,大大减少了代码的篇幅(一大堆的get、set方法有多长)。

       通过 lombok包里面的@Builder注解,我们可以很简单的实现一个类的get、set等方法。但可惜在实际使用时,如果类的内部还有一个静态内部类时,编译时可能会出现Error:(xx,xx)java: 找不到符号问题(这和代码里面外部类和内部类使用顺序有关),点击提示栏错误地方,idea会自动将光标移到@Builder注解上。

2.测试代码

2.1 基本类

User.java

import lombok.Data;

@Data
public class User {
    private String name;
}

OuterClass.java和InnerClass.java

import lombok.Builder;
import lombok.Getter;


@Builder
@Getter
public class OuterClass {

    // 静态内部类是外部类的一个成员变量
    private InnerClass innerClass;

    @Builder
    @Getter
    public static class InnerClass {
        private User user;
    }
}

2.2 在OuterClass添加静态方法:入参是User,返回值是OuterClass.java(编译正确)

import com.test.OuterClass.InnerClass.InnerClassBuilder;

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class OuterClass {

    private InnerClass innerClass;

    public static OuterClass toOuterClass(User user) {
        return OuterClass.builder()
                .innerClass(InnerClass.builder()
                        .user(user)
                        .build())
                .build();
    }

    @Builder
    @Getter
    public static class InnerClass {
        private User user;
    }
}

2.3 修改OuterClass添加静态方法,加入了一些常见的业务逻辑判断(编译报错 java:找不到符号)

        添加判断User是否为空(null)的判断,如果不为空,我们才把user对象构建到InnerClass对象中。

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class OuterClass {

    private InnerClass innerClass;


    public static OuterClass toOuterClass(User user) {

        InnerClassBuilder builder = InnerClass.builder();
        if (user != null) {
            // 判断user是否为空
            builder.user(user);
        }
        return OuterClass.builder()
                .innerClass(builder.build())
                .build();
    }

    @Builder
    @Getter
    public static class InnerClass {
        private User user;
    }
}

      在网上找到了个类似的问题,lombok.Data @Data注解,解释是静态类的解析,在注解解析器生成builder之前,导致找不到符号cannot find symbol class xxx。

cannot find symbol class Data if import inner inner class · Issue #1684 · projectlombok/lombok · GitHub

自己的解决方案是:自己实现builder的创建者模式的代码,最简单的就是第一个编译成功的代码,找到自动生成的xxx.class文件,直接把里面的相关代码复制一份,然后粘贴到源码中,去除类上面的@Builder注解。


网站公告

今日签到

点亮在社区的每一天
去签到