2年前 (2023-03-08)  Java系列 |   抢沙发  145 
文章评分 0 次,平均分 0.0
[收起] 文章目录

什么是Mutability Detector(可变性检测器)?

可变性检测器设计用于分析Java类,并报告给定类的实例是否是不可变的。它可以用于:

  • 在单元测试中:使用assertImmutable(MyClass.class)这样的断言。你的类实际上是不可变的吗?在你刚刚做出的改变之后呢?
  • 作为FindBugs插件:你用@Immutable注释的那些类,是真的不可变吗?
  • 在运行时:您的API是否需要给定不可变对象?
  • 从命令行

为什么要检测可变?

开发不可变的类有几个好处。一个不可变的对象是一个一旦被构造就不能改变的对象。在编写并发程序时,使用不可变对象可以大大简化复杂的系统,因为跨线程共享对象要安全得多。关于什么使对象不可变,有一些规则,很容易打破规则并使对象不安全。这可能会导致细微的、难以检测的错误,从而降低系统的完整性。使用自动化工具来识别非预期的可变性,可以降低编写不可变类的复杂性。

可变性检测器在严格的方面进行分析,发现很少有类是完全不可变的,例如java.lang.Stringjava.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

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册