У нас есть несколько классов с обычным шаблоном для совместного использования логики конструктора:

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)

Если этот шаблон реализации на самом деле небезопасен, я уверен, что его можно довольно легко реорганизовать в статические методы, но я думаю, что вопрос в том, is небезопасно? Может быть, это не то, что должна была обнаружить проверка компилятора?

0
Trejkaz 2 Янв 2018 в 04:32

2 ответа

Лучший ответ

подверженный ошибкам определяет ConstructorLeaksThis проблема:

Во время выполнения конструктора опасно делать новый экземпляр доступным для другого кода. Поля экземпляра, включая поля final, могут еще не быть инициализированы, и выполнение методов экземпляра может привести к неожиданным результатам.

... И из вашего кода вы не нарушаете правило, также в документации Java написано о При использовании с конструктором это ложное срабатывание, сообщалось о той же проблеме здесь.

Кстати, вы можете добавить @SuppressWarnings("ConstructorLeaksThis") в свой конструктор, чтобы подавить ошибки, или провести рефакторинг кода без @SuppressWarnings, чтобы предотвратить скрытые ошибки.

2
O.Badr 2 Янв 2018 в 11:30

Я уверен, что это ошибка.

Обычно эта ошибка означает, что вы передаете ссылку на текущий несформированный объект, то есть someList.add(this).

Однако цепочка конструкторов - это прекрасно и часто является хорошей практикой.

1
vandale 2 Янв 2018 в 02:04