问题描述
很有可能减少Java 8代码库中的样板代码。 缺点是它限制了工具支持(重构,静态分析)。
例如,在我使用IntelliJ的实验中,重构用注释的类的字段不再有效。 我知道没有解决方法(您必须手动修复位置,使用Builder的旧方法名称)。
另一个例子是在Eclipse中“查找引用”字段中找不到引用,但一个好的解决方法是打开大纲并在生成的getter / setter上应用“查找引用”。
我的问题:
- 哪些主要IDE(尤其是Eclipse,IntelliJ)的重构功能会破坏?
- 有没有很好的解决方法?
1楼
这是一个小的解决方法,用于重构@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;
}
不可否认,这有点令人讨厌,但它实际上并不需要那么长时间,而且肯定会手动更改数百个引用。
2楼
我最近遇到的一个:
在IntelliJ(不了解Eclipse)中,您无法提取包含lombok生成的任何方法的接口。 它们不会出现在相关对话框中。
有一个简单的解决方法:让IntelliJ创建方法,提取界面,还原你的类并让它再次实现接口。
3楼
对于更复杂的重构,我已经确定了“delombok-refactor-relombok”。 这是一种重量级方法,但具有处理复杂重构的好处,而无需中间破坏的构建。
就我而言,我使用maven进行构建。 我为添加了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类:
- 评论原始课程内容
- 替换为target / generated-sources / delombok中的delombok类内容
- 保存(代码编译干净)
- 在IDE中执行重构(代码编译干净)
- 对注释掉的原始lombok类内容执行相同的重构
- 删除delomok类内容
- 取消注释重构的lombok类内容
- 保存(代码编译干净)
对于那些第一次尝试重构lombok类的人来说,我会期待怀疑。 我是在遇到其他技术和更复杂的lombok功能(即@Builder,@ SuperBuilder)的挫折和局限之后来到这里的。
例如,手动为@Builder添加setter需要正确声明匹配的lombok生成的内部构建器类。 使用lombok @SuperBuilder构建器继承等功能变得更加困难。 当我尝试手动执行此操作时,我决定将delombok类作为指南。 那时我意识到替换delombok源更简单,重构随意,然后删除它。