Lombok项目中的IDE重构支持



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类:

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

对于那些第一次尝试重构lombok类的人来说,我希望他们会持怀疑态度。在遇到其他技术和更复杂的lombok特性(例如@Builder、@SuperBuilder)的挫折和限制之后,我才来到这里。

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

最新更新