Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ja 09. 07. 2014, 20:44:06

Název: Java: anonymní třída a final
Přispěvatel: 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 ?
Název: Re:Anonymní třída a final, JAVA
Přispěvatel: Ziktofel 09. 07. 2014, 21:05:41
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.
Název: Re:Java: anonymní třída a final
Přispěvatel: ja 09. 07. 2014, 21:28:23
Proč by měl GC něco mazat ?
Název: Re:Java: anonymní třída a final
Přispěvatel: ja 09. 07. 2014, 21:49:54
Odpovězte prosím někdo, nebo dnes neusnu  ;D
Název: Re:Java: anonymní třída a final
Přispěvatel: DK 09. 07. 2014, 22:03:13
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)
Název: Re:Java: anonymní třída a final
Přispěvatel: kvr kvr 09. 07. 2014, 22:04:46
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.
Název: Re:Java: anonymní třída a final
Přispěvatel: Filip Jirsák 09. 07. 2014, 22:09:08
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í.
Název: Re:Java: anonymní třída a final
Přispěvatel: ja 09. 07. 2014, 22:54:38
Děkuji všem za vysvětlení, už tomu rozumím  :)
Název: Re:Java: anonymní třída a final
Přispěvatel: ja 09. 07. 2014, 22:56:07
P.S. už můžu jít spát  ;D