В конструкторе DefaultExceptionReporter
вы создаете экземпляр анонимного класса. Анонимный класс получает ссылку на свой родительский класс до того, как будет полностью создан экземпляр родительского класса.
Если родительский объект имеет состояние, это будет означать, что анонимный класс может теоретически воздействовать на него до того, как он будет полностью создан.
Надеемся, что это демонстрирует потенциальную проблему:
class DefaultExceptionReporter implements ExceptionReporter {
private final int foo;
public DefaultExceptionReporter(ExceptionReporter er) {
er.setExceptionReporter(new ExceptionReporter() {
{
System.out.println(DefaultExceptionReporter.this.foo);
}
public void report(Throwable t) {}
public void setExceptionReporter(ExceptionReporter er) {}
});
foo = 1;
}
// ...
}
Это напечатает ноль, даже если foo
является окончательным и ему присвоено 1. Конечная переменная в конечном итоге имеет два значения, которые никогда не должны обычнобудет возможно.
Поскольку ваш объект не имеет состояния, я не думаю, что это имеет большое значение. Вы, вероятно, должны объявить класс как final
, поэтому невозможно расширить его и добавить состояние.