Project Lombok试图减少Java 8代码库中的样板代码。缺点是它限制了工具支持(重构、静态分析)。
例如,在我使用IntelliJ的实验中,重构带有@Builder
注释的类的字段不再有效。我知道没有解决方法(您必须手动修复位置,其中使用了Builder的旧方法名称)。
另一个例子是,在Eclipse中,字段上的"查找引用"不会找到引用,但是一个好的解决方法是打开大纲并对生成的getter/setter应用"查找引用"。
我的问题:
- 它破坏了主要ide(尤其是Eclipse、IntelliJ)的哪些重构特性?
- 有好的变通办法吗?
下面是重构@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)删除重命名的dummy getter/setter,并将变量名从您的临时名称更改为新名称。现在它又被格式化了:
@Data
public class Thing {
int value2;
}
不可否认,这有点烦人,但它实际上并不需要那么长时间,而且肯定比手动更改数百个引用要好。
我最近遇到的一个:
在IntelliJ中(不了解Eclipse),您不能提取包含由lombok生成的任何方法的接口。它们不会出现在相关的对话框中。
有一个简单的解决方法:让IntelliJ创建方法,提取接口,恢复您的类,并让它再次实现接口。
对于更复杂的重构,我决定使用"delombok-refactor-relombok"。这是一种重量级的方法,但在处理复杂重构时却没有中间的破碎构建。
在我的例子中,我使用maven进行构建。我为lombok添加了maven构建插件:delombok配置如下:
<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类:
- 注释掉原来的类内容
- 用target/generated-sources/delombok 中的delombok类内容替换
- 保存(代码编译干净)
- 在IDE中执行重构(代码编译干净)
- 对注释掉的原始lombok类内容执行相同的重构
- 删除delomok类内容
- 取消对重构的lombok类内容的注释
- 保存(代码编译干净)
对于那些第一次尝试重构lombok类的人来说,我希望他们会持怀疑态度。在遇到其他技术和更复杂的lombok特性(例如@Builder、@SuperBuilder)的挫折和限制之后,我才来到这里。
例如,手动添加@Builder的setter需要正确声明匹配的lombok生成的内部构建器类。使用lombok @SuperBuilder构建器继承等功能时,这变得更加困难。当我尝试手动执行此操作时,我决定查看delombok类作为指导。这时我意识到替换delombok源代码,随意重构,然后删除它会更简单。