Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: ja 09. 07. 2014, 20:44:06
-
Ahoj všichni, mám jednu otázku. Proč je nutné u lokálních proměnných, které budu používat z anonymní třídy, deklarace final ?
-
osobne si myslim, ze je to kvuli tomu, ze kdybys v anonymni tride ty promenny priradil nejaky jiny objekt (tedy porusis final), ze by to mohl smazat gc, kdyz anonymni trida prezije volani metody (das to napriklad do kolekce). Tim final muzu lokalni promennou skryte predat anonymni tride jako pointer (jedna se o zalezitost na urovni JVM). IMHO tady budou existovat ty promenny ve ksutecnosti dve, jedna pro anonymni a jedna pro obalujici tridu a pri final se nemusis zabejvat synchronizaci, protoze to jsou dva pointery ukazujici na tyz objekt. Jakakoliv slozitejsi implementace dovolujici nefinalni promennou by imho zeslozitovala a zpomalovala JVM.
-
Proč by měl GC něco mazat ?
-
Odpovězte prosím někdo, nebo dnes neusnu ;D
-
popsane to mas tady - http://stackoverflow.com/questions/4732544/why-are-only-final-variables-accessible-in-anonymous-class/4732617#4732617 , prepisovat se mi to nechce :)
a co se tyce GC, je to jeho prace, kdyz uz neexistuje reference na dany objekt, smaze ho (uz neni treba)
-
Anonymní třída nemá přístup na aktuální stack, proměnná (pointer) se kopíruje jako skrytý member do anonymní třídy.
Takže v případě pokus o přiřazení nové hodnoty z aktuální funkce by neměla třída up-to-date hodnotu a opačně v případě přiřazení z anonymní třídy by neměla aktuální funkce up-to-date hodnotu (ať už by běžela v rámci stejného threadu nebo paralelně). Navíc v době provádění kódu anonymní třídy už nemusí scope funkce ani existovat.
V zásadě jde tedy jen syntactic sugar, jak zabránit potenciální nekonsistenci obsahu mezi lokální proměnnou a její (skryté) kopii ve třídě. GC s tím nemá nic společného.
-
Protože ten kód v anonymní třídě se může volat (a většinou volá) mimo pořadí toho, jak jsou příkazy uvedeny ve zdrojovém kódu. Kdyby se hodnota proměnné měnila, bylo by to minimálně matoucí pro programátora. Má se hodnota zkopírovat v okamžiku deklarace anonymní třídy, nebo se má její hodnota průběžně aktualizovat tak, jak se mění v metodě? Je to úplně stejný princip, jako když zavoláte metodu a předáváte jí parametry - ty se také zkopírují v okamžiku volání metody a případné změny hodnoty ve volajícím kódu se uvnitř metody neprojeví.
-
Děkuji všem za vysvětlení, už tomu rozumím :)
-
P.S. už můžu jít spát ;D