Использование неизменяемых объектов

 
 
 
Сообщения:45
Добрый день!
Подскажите, пожалуйста, как понять след предложение
Quote:
Единственная возможная проблема — если вы внутри ещё не отработавшего конструктора публикуете ссылку на объект, через которую к нему может получить доступ кто-нибудь ещё, и увидеть объект в изменяющемся состоянии! (Это бывает не так уж и редко. Например, иногда программист хочет добавить объект в конструкторе в коллекцию всех объектов данного типа.)

Возможно на простом примере?
Спасибо большое!


Quote:
Использование неизменяемых объектов даёт много выгод. Например, о таком объекте намного легче судить в ситуации, когда во многих частях программы есть ссылка на него (для изменяемого объекта, любая часть программы может вызвать мутирующую функцию в практически любой момент времени и из любого потока).
Но то, что для нас важно в контексте вопроса — неизменяемые объекты не требуют синхронизации при многопоточном доступе. Вот собственно и вся рекомендация: используйте неизменяемые объекты, и вам не придётся думать о том, что нужно, а что не нужно синхронизировать. Единственная возможная проблема — если вы внутри ещё не отработавшего конструктора публикуете ссылку на объект, через которую к нему может получить доступ кто-нибудь ещё, и увидеть объект в изменяющемся состоянии! (Это бывает не так уж и редко. Например, иногда программист хочет добавить объект в конструкторе в коллекцию всех объектов данного типа.)
 
 
Сообщения:49
Полагаю так:
//конструктор
SomeClass() {
    someGlobalCollection.put(this);
    this.property = 123;
    ...
}
 
 
Сообщения:2361
Единственная возможная проблема — если вы внутри ещё не отработавшего конструктора публикуете ссылку на объект, через которую к нему может получить доступ кто-нибудь ещё, и увидеть объект в изменяющемся состоянии!

Не кто-то ещё, а код в другом потоке. Сама по себе утечка this из конструктора не страшна, до тех пор пока нет риска, что объект не увидят другие потоки до завершения конструктора.
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет