自动查找隐式类型转换 (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
/Byte
、short
/Short
, int
/Integer
, long
/Long
double
/Double
, boolean
/Boolean
和 char
/Char
.
我发现对于“相同”变量,如果类型是原始类型 float
或盒装类型 Float
,那将是一致的,我正在寻找一种方法来检查源代码,无需单独访问每个文件。
例如,我想要寻找的是当需要 Float
时传递 float
,反之亦然。那可能是(列表并不详尽,可能还有其他):
- 使用与构造函数中类型相反的类型的变量调用构造函数 (
new MyClass(..)
)。
- 当传入的参数setter与方法的参数相反时,如
setMyVaribale(..)
- 当 getter 返回与它获取的实例变量类型相反的类型时。就像
float getMyValue()
,其中 class 将 myValue
存储为 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
我继承了一个项目,其中“相同”实例变量的使用不一致。例如,在某些 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
/Byte
、short
/Short
, int
/Integer
, long
/Long
double
/Double
, boolean
/Boolean
和 char
/Char
.
我发现对于“相同”变量,如果类型是原始类型 float
或盒装类型 Float
,那将是一致的,我正在寻找一种方法来检查源代码,无需单独访问每个文件。
例如,我想要寻找的是当需要 Float
时传递 float
,反之亦然。那可能是(列表并不详尽,可能还有其他):
- 使用与构造函数中类型相反的类型的变量调用构造函数 (
new MyClass(..)
)。 - 当传入的参数setter与方法的参数相反时,如
setMyVaribale(..)
- 当 getter 返回与它获取的实例变量类型相反的类型时。就像
float getMyValue()
,其中 class 将myValue
存储为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