如何通过接口正确使用 Lombok @Data
How to properly use Lombok @Data with interfaces
我在 spring 图书应用程序中使用了相当多的本机查询,因为 Hibernate 不允许我使用未映射的连接表编写连接查询。我遇到了这个 article,它帮助我将本机查询精美地投射到 DTO 中。如文章中所述,我正在使用带有 @Data (Lombok) 注释的 DTO 接口。当我通过 "Run as Spring Boot Application" 在 eclipse 中本地 运行 时,它就像一个魅力。但是,当我尝试 mvn package
它以部署 JAR 时,出现编译错误,说明
myDTO.java:[8,1] @Data is only supported on a class.
当我在 eclipse 中 运行 它时,我不明白它是如何工作的,而 maven 给我一个编译错误。
编辑:它在 Java 8(在 eclipse 中使用)中工作,在 Java 11(全局路径版本)中抛出编译错误。
您发现了一个 lombok 'bug',因为 eclipse 变体也应该产生了该错误,而不是什么都不做。因为..它什么都不做。
正确响应是错误的原因是因为接口上的 @Data
没有意义。 @Data
做了 4 件事。在我列举它们之前,为了清楚起见,接口 不能有(非静态)字段 。你可以写它,但是 java 会默默地将它们升级到 public static final
.
@Data
:
- 构造函数。 (对接口进行操作是不合法的,因此,它不能那样做)。
- 为每个非静态字段创建 getter 和 setter。 (在界面中不能有任何东西,所以这什么都不做)。
- 它制作了一个
toString
来打印类型和每个非静态字段(可以有一个,即使使用 default
功能的 impl,但它所做的只是打印类型的名称;不是很有用 toString
!)
- 它使
equals
和 hashCode
实现(它也可以存在于此,但它所做的只是 return hashcode
和 return equals
和 canEqual
的一团乱麻,这没有多大意义,因为重点是比较非静态字段,但没有任何字段)。 None 这是有道理的,因为任何实现此接口的 类 都被有效地强制覆盖这些方法,以便它们无论如何都能工作,此时将不会使用这些实现。
我觉得你有点困惑,或者至少,我是,所以,让我们退后一步,谈谈你试图解决什么问题/如果将 @Data
放在界面上,您认为会发生什么。
注意:Java11 与 Java8 区别是转移注意力;那不是这里的问题。
NB2: 免责声明 - 我是 lombok 项目的核心维护者。
我在 spring 图书应用程序中使用了相当多的本机查询,因为 Hibernate 不允许我使用未映射的连接表编写连接查询。我遇到了这个 article,它帮助我将本机查询精美地投射到 DTO 中。如文章中所述,我正在使用带有 @Data (Lombok) 注释的 DTO 接口。当我通过 "Run as Spring Boot Application" 在 eclipse 中本地 运行 时,它就像一个魅力。但是,当我尝试 mvn package
它以部署 JAR 时,出现编译错误,说明
myDTO.java:[8,1] @Data is only supported on a class.
当我在 eclipse 中 运行 它时,我不明白它是如何工作的,而 maven 给我一个编译错误。
编辑:它在 Java 8(在 eclipse 中使用)中工作,在 Java 11(全局路径版本)中抛出编译错误。
您发现了一个 lombok 'bug',因为 eclipse 变体也应该产生了该错误,而不是什么都不做。因为..它什么都不做。
正确响应是错误的原因是因为接口上的 @Data
没有意义。 @Data
做了 4 件事。在我列举它们之前,为了清楚起见,接口 不能有(非静态)字段 。你可以写它,但是 java 会默默地将它们升级到 public static final
.
@Data
:
- 构造函数。 (对接口进行操作是不合法的,因此,它不能那样做)。
- 为每个非静态字段创建 getter 和 setter。 (在界面中不能有任何东西,所以这什么都不做)。
- 它制作了一个
toString
来打印类型和每个非静态字段(可以有一个,即使使用default
功能的 impl,但它所做的只是打印类型的名称;不是很有用toString
!) - 它使
equals
和hashCode
实现(它也可以存在于此,但它所做的只是 returnhashcode
和 returnequals
和canEqual
的一团乱麻,这没有多大意义,因为重点是比较非静态字段,但没有任何字段)。 None 这是有道理的,因为任何实现此接口的 类 都被有效地强制覆盖这些方法,以便它们无论如何都能工作,此时将不会使用这些实现。
我觉得你有点困惑,或者至少,我是,所以,让我们退后一步,谈谈你试图解决什么问题/如果将 @Data
放在界面上,您认为会发生什么。
注意:Java11 与 Java8 区别是转移注意力;那不是这里的问题。 NB2: 免责声明 - 我是 lombok 项目的核心维护者。