Project Lombok很有可能减少Java 8代码库中的样板代码。缺点是它限制了工具支持(重构,静态分析)。
例如,在我使用IntelliJ的实验中,重构用@Builder
注释的类的字段不再有效。我知道没有解决方法(您必须手动修复位置,使用Builder的旧方法名称)。
另一个例子是,在Eclipse中,“查找引用”字段找不到引用,但一个好的解决方法是打开大纲并在生成的getter / setter上应用“查找引用”。
我的问题:
答案 0 :(得分:7)
这是一个小的解决方法,用于重构@Data类中变量的getter / setter。这可以在eclipse中使用,也可能在其他地方使用:
示例类,我们要将“value”重构为“value2”:
import lombok.Data;
@Data
public class Thing {
int value;
}
(1)将变量重命名(不重构)为临时的,以删除lombak为原始名称生成的getter / setter。在引用旧的getter / setter的任何地方都会遇到编译错误,但这是暂时的:
@Data
public class Thing {
int valueXXX; // reference to getValue() are broken for the moment
}
(2)手动为旧名称创建一个虚拟的getter / setter。您的编译错误现在就会消失:
@Data
public class Thing {
int valueXXX;
public int getValue() { return 0; }
public void setValue(int value) {}
}
(3)使用eclipse重构你的虚拟getter / setter。您的代码库中的所有引用现在都使用getValue2()和setValue2():
@Data
public class Thing {
int valueXXX; //
public int getValue2() { return 0; }
public void setValue2(int value) {}
}
(4)删除重命名的虚拟getter / setter,并将变量名从临时名称更改为新名称。现在它再次被全面破坏了:
@Data
public class Thing {
int value2;
}
不可否认,这有点令人讨厌,但它实际上并不需要那么长时间,而且确实可以手动更改数百个引用。
答案 1 :(得分:2)
我最近遇到过一个:
在IntelliJ中(不了解Eclipse),您无法提取包含lombok生成的任何方法的接口。它们不会出现在相关对话框中。
有一个简单的解决方法:让IntelliJ创建方法,提取界面,还原你的类并让它再次实现界面。
答案 2 :(得分:0)
对于更复杂的重构,我选择了“ delombok-refactor-relombok”。这是一种沉重的方法,但具有处理复杂重构的好处,而不会产生中间损坏的构建。
就我而言,我使用maven进行构建。我为lombok:delombok添加了maven构建插件,配置如下:
<build>
<plugins>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.6.0</version>
<configuration>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<addOutputDirectory>>false</addOutputDirectory>
</configuration>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
这使得在目标目录下可以轻松获得delombok副本。
要重构特定的龙目岛课程:
我希望那些第一次尝试重构龙目岛课程的人对此表示怀疑。我是在对其他技术感到沮丧和限制以及更复杂的lombok功能(即@ Builder,@ SuperBuilder)之后才来到这里的。
例如,手动添加@Builder的setter需要正确声明匹配的lombok生成的内部builder类。使用lombok @SuperBuilder构建器继承之类的功能来执行此操作变得更加困难。当我尝试手动执行此操作时,我决定参考delombok类作为指南。那就是当我意识到替换delombok源,随意重构然后删除它更简单时。