什么是Mutability Detector(可变性检测器)?
可变性检测器设计用于分析Java类,并报告给定类的实例是否是不可变的。它可以用于:
- 在单元测试中:使用
assertImmutable(MyClass.class)
这样的断言。你的类实际上是不可变的吗?在你刚刚做出的改变之后呢? - 作为FindBugs插件:你用
@Immutable
注释的那些类,是真的不可变吗? - 在运行时:您的API是否需要给定不可变对象?
- 从命令行
为什么要检测可变?
开发不可变的类有几个好处。一个不可变的对象是一个一旦被构造就不能改变的对象。在编写并发程序时,使用不可变对象可以大大简化复杂的系统,因为跨线程共享对象要安全得多。关于什么使对象不可变,有一些规则,很容易打破规则并使对象不安全。这可能会导致细微的、难以检测的错误,从而降低系统的完整性。使用自动化工具来识别非预期的可变性,可以降低编写不可变类的复杂性。
可变性检测器在严格的方面进行分析,发现很少有类是完全不可变的,例如java.lang.String
和java.lang.Integer
不是不可变的因为它们分别是非final
字段和原始数组字段。在对这些病例进行正确分析之前,突变/可变检测器不会在1.0版本下发布。
入门
要直接使用Mutability Detector,无论是在应用程序的运行时,还是作为单元测试的一部分,都可以从Maven Central获取jar。或者您可以在Maven兼容的构建工具中使用以下坐标声明它:
<dependency>
<groupId>org.mutabilitydetector</groupId>
<artifactId>MutabilityDetector</artifactId>
<version>[latest version here]</version>
<scope>test</scope>
</dependency>
突变检测器在单元测试中的应用
只需将MutabilityDetector添加到单元测试类路径。添加第一个断言非常简单:
import static org.mutabilitydetector.unittesting.MutabilityAssert.assertImmutable;
@Test public void checkMyClassIsImmutable() {
assertImmutable(MyClass.class);
}
尽管您可能(或可能)必须配置断言以处理出现的任何误报。有关更多信息,请参阅MutabilityAssert上的JavaDoc:https://www.javadoc.io/static/org.mutabilitydetector/MutabilityDetector/0.10.6/org/mutabilitydetector/unittesting/MutabilityAssert.html
从命令行使用突变检测器
如何运行它的示例可能是最有用的。如果要分析MyCodebase.jar
,请使用:
java -jar MutabilityDetector.jar -classpath path/to/MyCodebase.jar
可变性检测器可以处理上面看到的jar文件或类文件目录。因此,如果您的代码库作为目录和.class文件存在于文件系统中,并且MyCodebase
目录是其根目录,则可以运行:
java-jar MutabilityDetector.jar-classpath/to/MyCodebase
输出是根据询问“是不可变的吗?”的结果分析的类的列表,即IMMUTABLE
, NOT_IMMUTABLE
, EFFECTIVELY_IMMUTABLE
。
执行java -jar MutabilityDetector.jar --help
获取命令行选项的完整列表。
在应用程序中使用突变检测器
可以在运行时使用突变检测器。例如,考虑是否有一个库要求传递给它的对象是不可变的。收到这样的对象时,您可以询问可变性检测器它是否真的是不可变的。
查看这个示例中的代码片段,它显示了主干代码的正确用法:
https://github.com/MutabilityDetector/ClientOfMutabilityDetector/blob/master/src/main/java/org/mutabilitydetector/runtime/RuntimeAnalysisExample.java
FindBugs插件
要让Mutability Detector在FindBugs分析期间检查您的类,请抓取MutabilityDetector4FindBugs jar,并将其配置为在正常分析期间由FindBugs拾取,如本文所述。
突变检测器将对任何用@Immutable
注释的类进行分析。
Maven Central也提供MutabilityDetector4FindBugs
,坐标如下:
<dependency>
<groupId>org.mutabilitydetector</groupId>
<artifactId>MutabilityDetector4FindBugs</artifactId>
<version>[latest version here]</version>
<scope>test</scope>
</dependency>
Github地址:https://github.com/MutabilityDetector/MutabilityDetector
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2788.html
暂无评论