Потребовалось 3 человека в неделю, чтобы разыскать один раз ... "this" может быть нулевым, если EventActionDispatcher запускает поток или делает что-либо с потоком, который вызывает использование "this".
НИКОГДА передайте "this" до завершения работы конструктора, или вы рискуете, что "this" будет нулевым в случае многопоточности.
Что я делаю, так это добавляю метод "init ()" к моим классам, который должен делать подобные вещи и вызывать его после создания объекта.
Есть и другие тонкости, такие как этот пример:
public abstract class Foo
{
protected Foo()
{
car();
}
public abstract void car();
}
public class Bar
extends Foo
{
private final String value;
public Bar(final String str)
{
value = str;
}
public void car()
{
// this line will crash because value is null
System.out.println(value.charAt(0));
}
}
public class Main
{
public static void main(final String[] argv)
{
final Foo foo;
foo = new Bar("Hello");
}
}
Самое безопасное, что нужно сделать:
- никогда не используйте "this" до того, как конструктор вернул
- никогда не вызывать какие-либо классы, собственные нестатические методы, из конструктора, если класс не является окончательным.
Вы можете вызывать финальные методы, но вы должны быть уверены, что они не вызывают переопределяемые методы ... и это может означать, что что-то сломается ... так что безопаснее этого не делать.