Vraagstelling:
Zou het voordelen opleveren om elke member variable in een programma final te declareren. (Mits zover mogelijk, oftewel wanneer de referentie dus geen andere toewijzing meer krijgt).
Waarom stel ik deze vraag:
Onder het nieuwe (jmm) Java Memory Model bestaat er de regel dat een object met een final member variable de waarde voor dat die member zogenaamd "memory freezed" nadat de constructer klaar is. Dit heeft als voordeel dat elke thread die een referentie heeft naar jouw object, altijd die "freezed" data kan lezen. Dit geld voor de data waarnaar de final member refereerde op het moment van eindigen van de constucter (inclusief alle subreferenties). Het is niet mogelijk om per ongeluk de default waarde (null, 0 of false) te zien voor die member. Dit kan dus optreden zodra thread B een object wil gebruiken op het moment dat thread A dit object aan het construeren is. Deze pagina legt dit uit:
http://tech.puredanger.co...m-and-final-field-freeze/
(Verder zijn er nog andere voordelen aan final member variables, bijvoorbeeld de overzichtelijkheid van de code.)
Daarom nogmaals: Kan iemand mij een reden vertellen waarom een member variable niet final mag/moet zijn. (Ik zit te gissen performance-achtige motivaties, maar ik kan me niks bedenken). Als er geen nadelen zijn, dan zou ik dus kunnen stellen dat een hele simpele compile-optimalisate inhoudt dat alle non-final members omgezet worden naar final members, behoudens velden die niet final kunnen worden vanwege toewijzingen buiten de constructor om.
Zou het voordelen opleveren om elke member variable in een programma final te declareren. (Mits zover mogelijk, oftewel wanneer de referentie dus geen andere toewijzing meer krijgt).
Waarom stel ik deze vraag:
Onder het nieuwe (jmm) Java Memory Model bestaat er de regel dat een object met een final member variable de waarde voor dat die member zogenaamd "memory freezed" nadat de constructer klaar is. Dit heeft als voordeel dat elke thread die een referentie heeft naar jouw object, altijd die "freezed" data kan lezen. Dit geld voor de data waarnaar de final member refereerde op het moment van eindigen van de constucter (inclusief alle subreferenties). Het is niet mogelijk om per ongeluk de default waarde (null, 0 of false) te zien voor die member. Dit kan dus optreden zodra thread B een object wil gebruiken op het moment dat thread A dit object aan het construeren is. Deze pagina legt dit uit:
http://tech.puredanger.co...m-and-final-field-freeze/
(Verder zijn er nog andere voordelen aan final member variables, bijvoorbeeld de overzichtelijkheid van de code.)
Daarom nogmaals: Kan iemand mij een reden vertellen waarom een member variable niet final mag/moet zijn. (Ik zit te gissen performance-achtige motivaties, maar ik kan me niks bedenken). Als er geen nadelen zijn, dan zou ik dus kunnen stellen dat een hele simpele compile-optimalisate inhoudt dat alle non-final members omgezet worden naar final members, behoudens velden die niet final kunnen worden vanwege toewijzingen buiten de constructor om.