Lombok项目中的IDE重构支持

时间:2015-07-28 12:10:19

标签: java eclipse intellij-idea java-8 lombok

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

例如,在我使用IntelliJ的实验中,重构用@Builder注释的类的字段不再有效。我知道没有解决方法(您必须手动修复位置,使用Builder的旧方法名称)。

另一个例子是,在Eclipse中,“查找引用”字段找不到引用,但一个好的解决方法是打开大纲并在生成的getter / setter上应用“查找引用”。

我的问题:

  • 主要IDE(尤其是Eclipse,IntelliJ)的哪些重构功能会破坏?
  • 有没有很好的解决方法?

3 个答案:

答案 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副本。

要重构特定的龙目岛课程:

  1. 注释原始课程内容
  2. 替换目标/生成源/ delombok中的delombok类内容
  3. 保存(代码可以干净地编译)
  4. 在IDE中执行重构(代码可以干净地编译)
  5. 对注释掉的原始lombok类内容执行相同的重构
  6. 删除delomok的课程内容
  7. 取消注释重构的龙目岛课程内容
  8. 保存(代码可以干净地编译)

我希望那些第一次尝试重构龙目岛课程的人对此表示怀疑。我是在对其他技术感到沮丧和限制以及更复杂的lombok功能(即@ Builder,@ SuperBuilder)之后才来到这里的。

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