[Javalist] miért kell final

Vig, Balázs balazs.vig at datasolutions.hu
2012. Sze. 12., Sze, 09:37:13 CEST


A teljesség kedvéért a fenti cikkben lévő hivatkozás tovább finomítja a
képet:
http://stackoverflow.com/questions/7472195/passing-final-variables-to-anonymous-classes

Üdv:
*Vig Balázs
*


2012. szeptember 12. 9:05 Gábor Lipták írta, <gabor.liptak at gmail.com>:

> Ehun a válasz:
>
> http://stackoverflow.com/a/4732617/337621
>
>
> 2012. szeptember 12. 8:25 írta, <istvan.ketler at lhsystems.com>:
>
>   Sziasztok,****
>>
>> ** **
>>
>> itt semmi probléma nincs, és nem is értem miért bonyolítjátok ennyire túl.
>> ****
>>
>> ** **
>>
>> A Java Language Specification a következőt mondja (8.1.3 – Inner Classes
>> and Enclosing Instances):****
>>
>> ** **
>>
>> Any local variable, formal method parameter or exception handler parameter
>> ****
>>
>> used but not declared in an inner class must be declared final. Any
>> local variable,****
>>
>> used but not declared in an inner class must be definitely assigned (§16)
>> ****
>>
>> before the body of the inner class.****
>>
>> ** **
>>
>> Hát ezért kell final-nak lennie. S ha kétséged lenne afelől, hogy „inner
>> class”-ról beszélünk-e, akkor ugyanitt ezt is megjegyzi:****
>>
>> ** **
>>
>> Inner classes include local (§14.3), anonymous (§15.9.5) and non-static
>> member****
>>
>> classes (§8.5).****
>>
>> ** **
>>
>> Amiről Ti értekeztetek, az nem a miért, hanem a hogyan. A miért kérdésre
>> az a válasz, hogy azért mert a nyelv specifikációja ezt előírja. Ahhoz
>> ugyanis, hogy azt a nyomorult local változót a belső osztály létrehozásakor
>> tárolhassa, ahhoz annak nem kéne final-nak lennie, hiszen a második mondat
>> biztosan teljesül:****
>>
>> ** **
>>
>> A local variable (§14.4, §14.14) must be explicitly given a value before
>> it is****
>>
>> used, by either initialization (§14.4) or assignment (§15.26), in a way
>> that can****
>>
>> be verified by the compiler using the rules for definite assignment (§16).
>> ****
>>
>> ** **
>>
>> Ebből az következik, hogy a második mondat teljesülne akkor is, ha nem
>> lenne final.****
>>
>> ** **
>>
>> A kérdés tehát nem az, hogy miért kell final-ként deklarálni. A kérdés
>> az, hogy a nyelv speckója miért írja elő. Erre pedig szerintem nincs
>> válasz, hiszen az inner class-beli tároláskor simán elérhetné (ha akarná) a
>> nem final local variable-t is.  Ezt megindokolni semmiféle bájtkóddal nem
>> fogod szerintem. A legjobb indoklás, ami szerintem kitalálható, a „mert
>> csak”.****
>>
>> ** **
>>
>> Esetleg a „ne érd el véletlenül, tenned kelljen érte valamit hogy
>> elérhesd” filozófia lehet a háttérben (ha véletlenül elírsz egy
>> változónevet, és az még véletlenebbül egy külső lokál változó neve, akkor
>> simán lefordulna ha nem lenne előírás a final). De ez csak találgatás.***
>> *
>>
>> ** **
>>
>> Ha valakinek lenne jobb ötlete, nagy örömmel venném ha megosztaná.****
>>
>> ** **
>>
>> Üdvözlettel,****
>>
>> ** **
>>
>> Iván****
>>
>> *István Ketler
>> *Senior Consultant****
>>
>> Lufthansa Systems Hungaria Kft.
>> Development Center Pest
>> Neumann János u. 1/e
>> 1117 Budapest
>> Hungary ****
>>
>> Tel: +36 1 887-2815
>> Fax: +36 1 887-2977
>> Mobile: +36 30 600-4936 ****
>>
>> Room: Infopark E, Room LH2-24 ****
>>
>> e-mail: istvan.ketler at lhsystems.com
>> Internet: www.LHsystems.hu <http://www.lhsystems.hu/>****
>>
>> ** **
>>
>>
>>
>> Sitz der Gesellschaft / Corporate Headquarters: Lufthansa Systems
>> Hungaria Kft, Budapest, Fövarosi Birosag 01-09-463417
>> Geschaeftsfuehrung / Management Board: Peter Sipos
>>
>>
>>  *From:* javalist-bounces at lists.javaforum.hu [mailto:
>> javalist-bounces at lists.javaforum.hu] *On Behalf Of *Varjasi Norbert
>> *Sent:* Tuesday, September 11, 2012 2:59 PM
>> *To:* Java lista
>> *Subject:* Re: [Javalist] miért kell final****
>>
>> ** **
>>
>> Szia!
>> A probléma a belső-külső osztályok szerkezetéből fakad.
>> A lokális osztály ugyan látja a definíciós pontjában a külső osztály
>> elérhető változóit, ám törzsében csak olyan final változókra
>> hivatkozhatunk,  amelyek már kaptak kezdőértéket.
>> Ezt a korlátozást azért vezették be, mert ezek az osztályok a lokális
>> változókról másolatot készítenek és az osztályt tartalmazó blokkból való
>> kilépés után is megőrzik értéküket, zárványok keletkeznének.
>> üdv:  VN.
>>
>>
>> 2012-09-11 13:58 keltezéssel, Peter Verhas írta:****
>>
>> A következő kis mintapéldában: ****
>>
>> ** **
>>
>> public class WhyFinal {****
>>
>> interface Outer {****
>>
>> String method();****
>>
>> }****
>>
>> ** **
>>
>> public Outer method(final String s) {****
>>
>> class Inner implements Outer {****
>>
>> public String method() {****
>>
>> return s + " wonka";****
>>
>> }****
>>
>> }****
>>
>> return new Inner();****
>>
>> }****
>>
>> ** **
>>
>> public static void main(String[] args) {****
>>
>> System.out.println(new WhyFinal().method("bonka").method());****
>>
>> }****
>>
>> }****
>>
>> ** **
>>
>> miért kell, hogy a 'String s' argumentum final legyen?****
>>
>> ** **
>>
>> --
>> Verhás Péter
>> peter at verhas.com
>> +36(30)9306805
>> skype: verhas****
>>
>> ** **
>>
>> ** **
>>
>> ** **
>>
>>
>>
>>
>> ****
>>
>> _______________________________________________****
>>
>> Javalist mailing list****
>>
>> Javalist at lists.javaforum.hu****
>>
>> http://lists.javaforum.hu/mailman/listinfo/javalist****
>>
>>
>>
>>
>> ****
>>
>> -- ****
>>
>> Varjasi Norbert     varjasin at sze.hu****
>>
>> ** **
>>
>> ** **
>>
>>
>> _______________________________________________
>> Javalist mailing list
>> Javalist at lists.javaforum.hu
>> http://lists.javaforum.hu/mailman/listinfo/javalist
>>
>>
>
> _______________________________________________
> Javalist mailing list
> Javalist at lists.javaforum.hu
> http://lists.javaforum.hu/mailman/listinfo/javalist
>
>
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20120912/a6faf698/attachment.html>


További információk a(z) Javalist levelezőlistáról