当前位置: 代码迷 >> java >> 在Lombok项目中的IDE重构支持
  详细解决方案

在Lombok项目中的IDE重构支持

热度:28   发布时间:2023-08-04 09:06:11.0

很有可能减少Java 8代码库中的样板代码。 缺点是它限制了工具支持(重构,静态分析)。

例如,在我使用IntelliJ的实验中,重构用注释的类的字段不再有效。 我知道没有解决方法(您必须手动修复位置,使用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)删除重命名的虚拟getter / setter,并将变量名从临时名称更改为新名称。 现在它再次全部被破坏了:

@Data
public class Thing {
    int value2;
}

不可否认,这有点令人讨厌,但它实际上并不需要那么长时间,而且肯定会手动更改数百个引用。

我最近遇到的一个:

在IntelliJ(不了解Eclipse)中,您无法提取包含lombok生成的任何方法的接口。 它们不会出现在相关对话框中。

有一个简单的解决方法:让IntelliJ创建方法,提取界面,还原你的类并让它再次实现接口。

对于更复杂的重构,我已经确定了“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类:

  1. 评论原始课程内容
  2. 替换为target / generated-sources / delombok中的delombok类内容
  3. 保存(代码编译干净)
  4. 在IDE中执行重构(代码编译干净)
  5. 对注释掉的原始lombok类内容执行相同的重构
  6. 删除delomok类内容
  7. 取消注释重构的lombok类内容
  8. 保存(代码编译干净)

对于那些第一次尝试重构lombok类的人来说,我会期待怀疑。 我是在遇到其他技术和更复杂的lombok功能(即@Builder,@ SuperBuilder)的挫折和局限之后来到这里的。

例如,手动为@Builder添加setter需要正确声明匹配的lombok生成的内部构建器类。 使用lombok @SuperBuilder构建器继承等功能变得更加困难。 当我尝试手动执行此操作时,我决定将delombok类作为指南。 那时我意识到替换delombok源更简单,重构随意,然后删除它。