解决容易出错的构造函数泄漏此警告在调用其他构造函数的构造函数上



我们有几个类,它们具有共享构造函数逻辑的常用模式:

public X(E... processors)
{
    this(ImmutableList.copyOf(processors));
}
public X(Collection<E> processors)
{
    this.processors = ImmutableList.copyOf(processors);
}

在这种情况下,容易出错的投诉ConstructorLeaksThis

.../X.java:61: error: [ConstructorLeaksThis] Constructors should not pass the 'this' reference out in method invocations, since the object may not be fully constructed.
        this(ImmutableList.copyOf(processors));
        ^
    (see http://errorprone.info/bugpattern/ConstructorLeaksThis)

如果这种实现模式实际上是不安全的,我相信它可以很容易地重构为静态方法,但我想问题是,是不安全的?也许这不是编译器检查要检测的内容?

容易出错的定义 构造函数泄漏这个问题:

在执行构造函数期间,使新的 其他代码可访问的实例。实例的字段,包括 最终字段,可能尚未初始化,并且正在执行实例 方法可能会产生意外的结果。

。从您的代码来看,您没有违反规则,Java 文档也写了关于将其与构造函数一起使用的内容,这是一个误报,这里报告了相同的问题。

顺便说一句,您可以在构造函数中添加@SuppressWarnings("ConstructorLeaksThis")来抑制错误或重构代码,而无需@SuppressWarnings以防止隐藏的错误。

我很

确定这是一个错误。

通常,此错误意味着您传递对当前未构造对象的引用,即someList.add(this) .

但是,构造函数链接非常好,通常是一种很好的做法。

最新更新