当开发人员向Spring组件引入可变性时,我们遇到了多线程问题。像这样:
@Component //singleton
public class MyComponent {
...
private String intermediateResults;
public String businessMethod() {
... fills in intermediateResults;
}
public String thisGetterShouldNotBeHere() {
return intermediateResults;
}
}
导致了多线程的错误 - 字段intermediateResults已经从不同的线程访问。
是否有办法阻止向Spring Singleton添加状态,例如通过某种静态分析仪? SonarQube插件? Eclipse插件? 谢谢你的建议。
答案 0 :(得分:2)
MutabilityDetector似乎能够完全满足您的需求:
Mutability Detector旨在分析Java类并报告给定类的实例是否是不可变的。它可以使用:
- 在单元测试中,使用assertImmutable(MyClass.class)之类的断言。你的班级真的是不变的吗?你刚刚做出改变后怎么办?
- 作为FindBugs插件。你用@Immutable注释的那些类实际上是吗? 在运行时。您的API是否需要被赋予不可变对象? 从命令行。您想在整个代码库中快速运行Mutability Detector吗?
无论如何,我建议添加一个明确的合同,声明该类应该通过javadoc
或通过类本身的@Immutable
注释不可变,以允许(明智的)开发人员维护阶级要求。 (如果Mutability Detector无法检测特定类型的不变性,例如:Are String, Date really immutable?)
答案 1 :(得分:1)
您可以使用任何静态分析器(如FindBugs,PMD和Checkstyle)实现自己的规则来检查您的类:
但是,据我所知,没有专门为此配置的工具。
或者,您可以创建@Immutable
注释并在那里实施检查。