我正在尝试更新使用依赖注入的应用程序,这样做,我试图用“线程安全”注释来记录每个类(需要它),对于其他编码器和bug检查器都是如此。 / p>
如果我有服务类,如下:
@ImplementedBy(FooImpl.class)
public interface FooSrvc {
}
并且它是相关的实现
class FooImpl implements FooSrvc {
}
* 我应该使用线程安全注释来记录或注释接口和具体实现吗?只是服务,因为它是公开的,只是实现? *例如。对于两者:
@javax.annotation.concurrent.ThreadSafe
@org.checkthread.annotations.ThreadSafe
@ImplementedBy(FooImpl.class)
public interface FooSrvc {
}
@javax.annotation.concurrent.ThreadSafe
@org.checkthread.annotations.ThreadSafe
class FooImpl implements FooSrvc {
}
注意 - 我使用两个不同的线程安全注释集来使用旧的并发错误查找器CheckThread(我找不到支持jsr-305注释的文档)和FindBugs。
谢谢。
答案 0 :(得分:4)
这取决于:
如果只注释接口,那么意思是“此接口的每个实现都保证是线程安全的。”这是一个艰难的要求,因为很难确保实施者不违反合同。
如果仅注释实现,那么您明确允许接口的其他实现不是线程安全的。从治理的角度来看,这更加舒适,但对界面的调用者没有用。
注释两者都是多余的,因为接口上的注释不能被实现上的注释覆盖(会违反多态)。尽管如此,这可能是首选方案,因为它具有更好的工具支持。
您正在使用的各个静态分析工具可能需要您使用选项3.我不太了解CheckThread以发表评论。然而,FindBugs螺纹安全探测器是如此基本,以至于它并不重要;如果FindBugs是你的主要工具,那么我会建议选项3加上一些Javadoc接口告诉开发人员线程安全注释没有强制执行,所以他们也必须检查实现是否正确。