Это было задано несколько иначе раньше но просил дать ответ "да/нет" , но я ищу объяснения, которые отсутствуют в книге (Java Concurrency в Практика), как эта очевидная большая ошибка будет использована злонамеренно или случайно.
Последний механизм, с помощью которого может быть объект или его внутреннее состояние опубликовано, чтобы опубликовать экземпляр внутреннего класса, как показано в ThisEscape в листинге 3.7. Когда ThisEscape публикует EventListener, он неявно публикует прилагаемый ThisEscape экземпляр, так как внутренние экземпляры классов содержат скрытые ссылка на прилагаемый экземпляр.
Листинг 3.7. Неявно разрешить эту ссылку для Escape. не сделайте это.
public class This Escape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
3.2.1. Безопасная строительная практика
ThisEscape иллюстрирует важный частный случай выхода - когда эта ссылка ускользает во время строительства. Когда внутренний Экземпляр EventListener публикуется, поэтому прилагается ThisEscape пример. Но объект находится в предсказуемом, согласованном состоянии после того, как его конструктор вернется, поэтому публикация объекта изнутри конструктор может публиковать неполностью сконструированный объект. Это true, даже если публикация является последним утверждением в конструкторе. Если эта ссылка исчезает во время построения, объект считается неправильно построенным. [8]
[8] Более конкретно, эта ссылка не должна выходить из до тех пор, пока конструктор не вернется. Эта ссылка может быть хранится где-нибудь конструктором, если он не используется другой нить до после строительства. SafeListener в листинге 3.8 использует эту технику.
Не позволяйте этой ссылке выходить во время построения.
Как кто-то прокомментировал бы это, чтобы добраться до OuterClass до его завершения? Что обозначается hidden inner class reference
курсивом в первом абзаце?