自动查找隐式类型转换 (auto-boxing/auto-unboxing)

Automatically finding implicit type conversions (auto-boxing/auto-unboxing)

我继承了一个项目,其中“相同”实例变量的使用不一致。例如,在某些 classes 中,它们存储为原语 float:

class Primitive {
  float myPrimitiveFloat;
  ...
}

..在其他 classes 中,当“相同”变量被传递到构造函数时,该值存储为装箱类型 Float:

class Boxed {
  Float myBoxedFloat;
  ...
  Boxed(Float myFloat, .. ) {
    this.myFloat = myFloat;
  }
}

..然后从 Primitive.

中的方法调用 new Boxed(myPrimitiveFloat, ..)

我在这里使用 float/Float 作为示例,但这种不一致也可能是其他任何一对:byte/Byteshort/Short, int/Integer, long/Long double/Double, boolean /Booleanchar/Char.

我发现对于“相同”变量,如果类型是原始类型 float 或盒装类型 Float,那将是一致的,我正在寻找一种方法来检查源代码,无需单独访问每个文件。

例如,我想要寻找的是当需要 Float 时传递 float,反之亦然。那可能是(列表并不详尽,可能还有其他):

我的本地 Java editor/toolkit 是 NetBeans,它的内部类型检查器是 Sonar lint。我不鼓励使用我公司认为“非标准”的软件。这包括 Eclipse IDE.

开发环境是Java版本11。

是否有任何方法可以配置 Sonar lint 或 NetBeans 来检测此类事件,或者可以在使用 Maven/Gradle 构建时检测到它?

生成可用作审计审查输入的日志文件也很有用。

一种可能的解决方案是在 POM 文件中添加一个 report 部分。使用 mvn site 构建时(可能需要一段时间),描述问题的 HTML 页面 (target/site/index.html) 或 XML 文件 (target/spotbugsXml.xml) 将是生成。

任何标记有模式 Bx: 的内容都表示使用了从 spotbugs 观点来看使用 boxing/unboxing 的可疑编程问题。

XML 文件可用作审计跟踪审查的输入。

下面描述的报告部分还调用了一些其他静态代码分析工具,这些工具也可能指出可能需要解决的其他问题。

 <reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-project-info-reports-plugin</artifactId>
            <version>${maven-project-info.version}</version>
            <reportSets>
                <reportSet>
                    <reports>
                        <report>index</report>
                        <report>ci-management</report> 
                        <report>dependencies</report>
                        <report>dependency-convergence</report>
                        <report>dependency-info</report>
                        <report>dependency-management</report>
                        <report>distribution-management</report>
                        <report>issue-management</report>
                        <report>licenses</report>
                        <report>mailing-lists</report>
                        <report>modules</report>
                        <report>plugin-management</report>
                        <report>plugins</report>
                        <report>scm</report>
                        <report>summary</report>
                        <report>team</report>
                    </reports>
                </reportSet>
            </reportSets>
        </plugin>

        <plugin>
            <groupId>com.github.spotbugs</groupId>
            <artifactId>spotbugs-maven-plugin</artifactId>
            <version>4.2.0</version>
            <configuration>
                <effort>Max</effort>
                <threshold>low</threshold>
                <xmlOutput>true</xmlOutput>
            </configuration>
        </plugin> 

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-pmd-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <reportSets>
                <reportSet>
                    <id>html</id>
                    <configuration>
                        <doctitle>My API for ${project.name} ${project.version}</doctitle>
                        <windowtitle>My API for ${project.name} ${project.version}</windowtitle>
                    </configuration>
                    <reports>
                        <report>javadoc</report>
                    </reports>
                </reportSet>
                <reportSet>
                    <id>test-html</id>
                    <configuration>
                        <testDoctitle>My Test API for ${project.name} ${project.version}</testDoctitle>
                        <testWindowtitle>My Test API for ${project.name} ${project.version}</testWindowtitle>
                    </configuration>
                    <reports>
                        <report>test-javadoc</report>
                    </reports>
                </reportSet>
            </reportSets>
        </plugin>
    </plugins>
</reporting>

spotbugs Maven 页面的条目表明这只能保证与 Java 8 一起使用。此代码已在 Java 版本 8 和 11 上进行测试,没有遇到任何问题。

有关 spotbug 的更多信息,请访问 Spotbugs maven plugin