当前位置: 首页 > 知识库问答 >
问题:

无法使用@AllArgsConstructor访问构造函数,但可以使用@RequiredArgsConstructor

查淮晨
2023-03-14

我的POJO课程如下:

@Value
@Builder
public class XYZ {

    @NonNull
    private final String a;

    @NonNull
    private final String b;

    @NonNull
    private final State state;

    public enum State {
        STARTED
    }
}

当我试图从我的tst/文件夹创建XYZ类的对象时,它失败了,错误是构造函数不能从外部包访问,但当我在POJO中使用@必需的ArgsConstructor时,它开始正常工作,并且不显示错误。实际错误如下:

错误:XYZ(字符串、字符串、状态)在XYZ中不是公共的;无法从包外部访问

所以,我想知道@AllArgsConstructor(由@Value提供)和@必需ArgsConstructor之间的区别,因此我看到了这个问题。

共有1个答案

袁骏祥
2023-03-14

在处理其注释时,Lombok不考虑源文件中这些注释的顺序。相反,每个注释类型都有一个确定处理顺序的优先级。这是因为不同注释类型之间存在依赖关系。

@Builder的优先级高于@Value。因此,Lombok首先生成生成器所需的包私有all args构造函数。因此,在处理@Value时,已经存在构造函数。根据@Value文档,“任何显式构造函数,无论参数列表如何,都意味着lombok不会生成构造函数”。

然而,在我看来,这在留档中有点误导。为@Builder生成的构造函数更像是一个实现细节,但我不会称之为“显式构造函数”。作者所说的显式可能是指不是默认构造函数。)

一旦您添加了@必需ArgsConstructor@AllArgsConstructor(在本例中是相同的),构造函数就会变成公共的,并且@Builder@Value都不需要再生成它。

 类似资料:
  • 我在保存数据时遇到了ActiveAndroid问题。 上面是从web api获取数据时使用改装获得的响应的映射类。但我犯了这样的错误。 致命异常:主进程:com。比蒂。在线支付,PID:3826 java。lang.IllegalArgumentException:无法为类com创建转换器。比蒂。在线支付。模型登录。LoginResponse方法LoginApi。获取第二次响应。ServiceMe

  • 问题内容: 假设我有以下课程: 我将如何构造一个使用反射? 回答 根据jtahlborn的回答,可以进行以下工作: 问题答案: 您将需要获取该类,找到带有下限T的单个参数的构造函数(在本例中为Object),强制该构造函数可访问(使用方法),最后使用所需的参数调用它。

  • 问题内容: 我一直认为无需调用构造函数即可创建对象。 但是,在 明智地 阅读《有效的Java 项目11:覆盖克隆》时 ,我发现了一条声明,指出 “没有调用构造函数”的规定太强了。行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。如果该类是最终的,则clone甚至可以返回由构造函数创建的对象。 有人可以向我解释一下吗? 问题答案: 我一直以为clone()会创建一个对象而不调用构造函

  • 我一直认为,clone()创建对象时不需要调用构造函数。 但是,在阅读有效Java第11条:明智地覆盖克隆时,我发现了一条声明,上面写着 “不调用构造函数”的规定太强了。行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。如果类是最终的,克隆甚至可以返回构造函数创建的对象。 谁能给我解释一下吗?

  • 下面是引用的Spring留档的AutoowiredAnnotationBeanPostProc处理器, 任何给定bean类中只有一个构造函数(最大值)可以携带此注释,其中“必需”参数设置为true,指示构造函数在用作Spring bean时自动连接。如果多个非必需的构造函数携带注释,它们将被视为自动连接的候选。将选择具有最多依赖项的构造函数,这些依赖项可以通过匹配Spring容器中的bean来满足

  • 我一直不明白为什么我们能够从其他类调用一个类的构造函数。构造函数是一种方法,通常当试图从类中调用方法时,我们必须要么使该方法静态,这样我们就可以以 但是在构造函数的情况下,我们两者都不做。Java如何调用类的构造函数而不执行这些方法中的任何一个?我知道一个类的构造函数必须对你调用它的类可见,也就是说,如果你调用的类构造函数在不同的包中,你必须导入那个包。 那么,Java如何处理调用构造函数,而不必