0

我们有一些具有共享构造函数逻辑的常用模式的类:

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)

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

4

2 回答 2

2

容易出错的定义了ConstructorLeaks这个问题:

在构造函数的执行过程中,让其他代码可以访问新实例是很危险的。实例的字段,包括最终字段,可能尚未初始化,执行实例方法可能会产生意想不到的结果。

...并且从您的代码中,您没有违反规则,Java 文档也写了关于将其与 Constructor 一起使用,这是一个误报,同样的问题也被报告在这里

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

于 2018-01-02T02:04:05.643 回答
1

我很确定这是一个错误。

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

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

于 2018-01-02T02:04:20.783 回答