Fórum Root.cz

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

Název: Java: anonymní třída a final
Přispěvatel: ja kdy 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 kdy 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 kdy 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 kdy 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 kdy 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 kdy 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 kdy 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 kdy 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 kdy 09. 07. 2014, 22:56:07
P.S. už můžu jít spát  ;D