[Javalist] miért kell final

Gábor Lipták gabor.liptak at gmail.com
2012. Sze. 12., Sze, 09:05:23 CEST


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
>
>
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20120912/3a950958/attachment.html>


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