gpt4 book ai didi

java - 如何正确使用 Lombok @Data 和接口(interface)

转载 作者:行者123 更新时间:2023-12-01 17:42:41 25 4
gpt4 key购买 nike

我在 Spring Book 应用程序中使用了相当多的 native 查询,因为 Hibernate 不允许我使用未映射的联接表编写联接查询。我遇到了这个article这帮助我将原生查询完美地转换到 DTO 中。正如文章中提到的,我使用带有 @Data (Lombok) 注释的 DTO 接口(interface)。当我通过“作为 Spring Boot 应用程序运行”在 eclipse 本地运行它时,它就像一个魅力。但是,当我尝试 mvn package 来部署 JAR 时,出现编译错误,指出

myDTO.java:[8,1] @Data 仅在类上受支持。

当我在 Eclipse 中运行它并且 maven 给我一个编译错误时,我不明白它是如何工作得这么好。

编辑:它在 Java 8(在 Eclipse 中使用)中工作,并在 Java 11(全局路径版本)中引发编译错误。

最佳答案

您发现了一个 lombok“bug”,因为 eclipse 变体也应该生成该错误,而不是不执行任何操作。因为..它什么也没做。

正确响应的原因是错误是因为接口(interface)上的@Data没有意义。 @Data 做了 4 件事。在枚举它们之前,需要明确的是,接口(interface)不能具有(非静态)字段。你可以写它,但是java会默默地将它们升级为public static final

@Data:

  • 创建一个构造函数。 (对接口(interface)执行此操作是不合法的,因此它不能这样做)。
  • 为每个非静态字段创建一个 getter 和 setter。 (界面中不能有任何内容,因此这不会执行任何操作)。
  • 它创建了一个 toString 来打印类型和每个非静态字段(即使有一个使用 default 功能的 impl,也可以有一个,但所有这些要做的就是打印类型的名称;这不是一个非常有用的 toString!)
  • 它创建了一个 equalshashCode impl(这里也可以存在,但它所做的只是为 hashcode 返回一个常量值并为 equalscanEqual 返回一团困惑,这没有多大意义,因为重点是比较非静态字段,但没有任何字段。这些都没有任何意义,因为任何实现此接口(interface)的类实际上都被迫覆盖这些方法,以便它们无论如何都能工作,此时这些实现将不会被使用。

我认为你有点困惑,或者至少,是这样,所以,让我们退后一步,谈谈你想要解决的问题/你认为会是什么如果您将 @Data 放在界面上,就会发生这种情况。

注意:Java11 与 Java8 的区别是转移注意力的;这不是问题所在。NB2:免责声明 - 我是 lombok 项目的核心维护者。

关于java - 如何正确使用 Lombok @Data 和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59115830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com