Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Lombok项目中的IDE重构支持_Java_Eclipse_Intellij Idea_Java 8_Lombok - Fatal编程技术网

Java Lombok项目中的IDE重构支持

Java Lombok项目中的IDE重构支持,java,eclipse,intellij-idea,java-8,lombok,Java,Eclipse,Intellij Idea,Java 8,Lombok,在我们的Java8代码库中减少样板代码很有诱惑力。缺点是它限制了工具支持(重构、静态分析) 例如,在我对IntelliJ的实验中,用注释的类的字段重构不再有效。我不知道有什么解决方法(您必须手动修复使用生成器的旧方法名的位置) 另一个例子是,在Eclipse中,字段上的“find references”没有找到引用,但是一个好的解决方法是打开大纲并在生成的getter/setter上应用“find references” 我的问题是: 它破坏了主要IDE(特别是Eclipse、IntelliJ

在我们的Java8代码库中减少样板代码很有诱惑力。缺点是它限制了工具支持(重构、静态分析)

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

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

我的问题是:

  • 它破坏了主要IDE(特别是Eclipse、IntelliJ)的哪些重构特性
  • 有好的解决办法吗

我最近遇到的一个:

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


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

这里有一个小的解决方法,可以重构@Data类中变量的getter/setter。这适用于eclipse,也可能适用于其他地方:

示例类,其中我们要将“value”重构为“value2”:

(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()

(4) 删除重命名的伪getter/setter,并将变量名从临时名称更改为新名称。现在,一切又都变傻了:

@Data
public class Thing {
    int value2;
}

诚然,这有点烦人,但实际上并不需要那么长时间,而且肯定比手工更改数百个引用要好。

对于更复杂的重构,我选择了“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>

org.projectlombok
lombok maven插件
1.18.6.0
${project.basedir}/src/main/java
>假的
生成源
德隆博克
这使得delombok拷贝在目标目录下很容易获得

要重构特定的lombok类,请执行以下操作:

  • 注释掉原来的课堂内容
  • 替换为来自目标/生成源/delombok的delombok类内容
  • 保存(代码编译干净)
  • 在IDE中执行重构(代码编译干净)
  • 对注释掉的原始lombok类内容执行相同的重构
  • 删除delomok类内容
  • 取消对重构lombok类内容的注释
  • 保存(代码编译干净)
  • 我希望那些第一次尝试重构lombok类的人对此持怀疑态度。我是在其他技术和更复杂的龙目山特征(即@Builder、@SuperBuilder)的挫折和限制之后才来到这里的


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

    如果你在这里没有得到答案,你可能会想问一下龙目岛的问题。我想建议一个小的改进,以减少打字的数量。(1) 注释掉“@Data”注释;(2) 使用IDE为字段生成getter/setter;(3) 取消注释“@Data”注释;(4) 通常重构字段名。(5) 删除生成的getter/setter。
    @Data
    public class Thing {
        int value2;
    }
    
    <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>