[Javalist] miért kell final

istvan.ketler at lhsystems.com istvan.ketler at lhsystems.com
2012. Sze. 12., Sze, 09:45:25 CEST


Köszi, ez egy jó érvelés, el tudom fogadni. Persze észben tartható lenne (ha eleve úgy írom meg, ahogy valójában történik, akkor ez a kérdés fel sem merül hiszen látszik) hogy másolatot használ, de a Java filozófia eredetileg az volt, hogy kevés dolgot kelljen észben tartani, a nyelv legyen straightforward.

Ü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<mailto:istvan.ketler at lhsystems.com>
Internet: www.LHsystems.hu<http://www.lhsystems.hu/>

From: javalist-bounces at lists.javaforum.hu [mailto:javalist-bounces at lists.javaforum.hu] On Behalf Of Gábor Lipták
Sent: Wednesday, September 12, 2012 9:05 AM
To: Java lista
Subject: Re: [Javalist] miért kell final

Ehun a válasz:

http://stackoverflow.com/a/4732617/337621

2012. szeptember 12. 8:25 írta, <istvan.ketler at lhsystems.com<mailto: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<tel:%2B36%201%20887-2815>
Fax: +36 1 887-2977<tel:%2B36%201%20887-2977>
Mobile: +36 30 600-4936<tel:%2B36%2030%20600-4936>
Room: Infopark E, Room LH2-24
e-mail: istvan.ketler at lhsystems.com<mailto: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> [mailto: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<mailto:peter at verhas.com>
+36(30)9306805<tel:%2B36%2830%299306805>
skype: verhas






_______________________________________________

Javalist mailing list

Javalist at lists.javaforum.hu<mailto:Javalist at lists.javaforum.hu>

http://lists.javaforum.hu/mailman/listinfo/javalist



--

Varjasi Norbert     varjasin at sze.hu<mailto:varjasin at sze.hu>





_______________________________________________
Javalist mailing list
Javalist at lists.javaforum.hu<mailto:Javalist at lists.javaforum.hu>
http://lists.javaforum.hu/mailman/listinfo/javalist


 
Sitz der Gesellschaft / Corporate Headquarters: Lufthansa Systems Hungaria Kft, Budapest, Fövarosi Birosag 01-09-463417
Geschaeftsfuehrung / Management Board: Peter Sipos


--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20120912/39f91a0a/attachment.html>


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