[Javalist] miért kell final
istvan.ketler at lhsystems.com
istvan.ketler at lhsystems.com
2012. Sze. 12., Sze, 08:25:53 CEST
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<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 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
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>
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/5e889154/attachment.html>
További információk a(z) Javalist levelezőlistáról