[Javalist] to final or not to final

istvan.ketler at lhsystems.com istvan.ketler at lhsystems.com
2013. Jan. 31., Cs, 12:36:16 CET


Csakhogy ehhez az is kell, hogy a példányváltozó és a paraméter típusa azonos legyen, így máris egy valamekkora részét kiszűrtem a problémának. Egyébként sem ad (nekem) semmilyen biztonságérzetet, mert nem azért használom hogy ne tudjam módosítani a változót.

A lenti harmadik pontnál meg ha véletlen lenne az a módosítás, akkor valahol megelőzné egy értékadás (hiszen nagyrészt azért használja hibásan a későbbi módosító valahol a törzsben, mert nem tudja hogy van már ilyen paraméter).


______________________________
István Ketler
Senior Consultant

Lufthansa Systems Hungária Kft.
Development Center Pest
Neumann János u. 1/e
1117 Budapest
Hungary
Phone: +36 1 887-2815
Fax: +36 1 887-0577
Mobile: +36 30 600-4936
E-mail: istvan.ketler at LHsystems.com
www.LHsystems.com



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

-----Original Message-----

From: javalist-bounces at lists.javaforum.hu [mailto:javalist-bounces at lists.javaforum.hu] On Behalf Of Tamás Viktor
Sent: Thursday, January 31, 2013 11:53 AM
To: Java lista
Subject: Re: [Javalist] to final or not to final

A példádban a 'final' csak attól véd meg, hogy a referenciánknak új értéket adj, de attól nem véd meg, hogy beletúrj a paraméterként átadott objektumok állapotába (ha azok nem immutable-ok). Kvázi hamis biztonságérzetet ad.

Nem szeretem a final-t használni metódusparaméterekre, fieldekre viszont igen.
V

2013/1/31  <istvan.ketler at lhsystems.com>:
> Felmerült a memóriataposó blogban hogy miért is kell nekünk a final...
>
>
>
> 1.       Némelyek állítják, hogy növeli az olvashatóságot. Szerintem rontja,
> mert hosszabb lesz a paraméterlista.
>
> 2.       Némelyek állítják, hogy világosabb a „szándék”. Hát ez egy nagyon
> érdekes vélemény... Amikor kap a metódusom egy paramétert, akkor a 
> szándékom az hogy ezt a paramétert használjam a metódus céljaira. Ha a 
> metódus „céljai” között szerepel az hogy a feldolgozás során a 
> pillanatnyi érték változzék, akkor mi is a szándék? Nem is beszélve a 
> „default” vagy „optional” paraméter értékekről (lásd később), amelyek 
> azért lehetnek hasznosak.
>
> 3.       Azt kevesebben mondják, hogy megvéd a paraméter véletlen
> módosításától. Márpedig ez egy valóban hasznos hatása. Ha valahol egy 
> hasonló nevű lokális változót kezd el használni az ember, egy 
> esetleges későbbi módosító könnyebben, de még az eredeti szerző is 
> „benézheti” a változó nevét, különösen ha siet, és csak gyorsan 
> kiválasztja az Eclipse által felajánlott nevek közül.
>
> 4.       Azt is inkább kevesen mondják, megvéd attól is, hogy az
> objektumváltozó helyett a paramétert módosítsuk ha a paraméter neve 
> történetesen megegyezik a példányváltozóéval. Márpedig ez előfordul, 
> és a this-t kevesen teszik ki a példányváltozó elé (pedig egyike az 
> Eclipse igazán hasznos kódformázásainak, és ez **tényleg** növeli a 
> láthatóságot, hiszen minden előfordulásnál hangsúlyozza, hogy a 
> példányváltozóról van szó).
>
>
>
> Szóval igen, szerintem „to final”, de nem holmi szándék és egyebek 
> miatt (az IMHO bullshit), hanem azért mert megvéd a sajnálatos (és 
> egyébként nehezen
> észrevehető) hibáktól.
>
>
>
> A final akkor lenne igazán hasznos, ha kombinálható lenne egy „default”
> paraméterértékkel is. Pl ilyenkor egy kicsit idegesítő, ha 
> **kötelező**a használata, méghozzá kivétel nélkül:
>
>
>
> public NumericResult compute(
>
>         final NumericValue param1,
>
>         final NumericValue param2,
>
>         ComputationProvider provider
>
> ) {
>
>     if (provider == null) {
>
>         provider = new MyDefaultComputationProvider();
>
>     }
>
>     // ...
>
> }
>
>
>
> Mert ehelyett most így kell írni:
>
>
>
> public NumericResult compute(
>
>         final NumericValue param1,
>
>         final NumericValue param2,
>
>         final ComputationProvider providerParam
>
> ) {
>
>     ComputationProvider provider = providerParam;
>
>     if (provider == null) {
>
>         ComputationProvider provider = new 
> MyDefaultComputationProvider();
>
>     }
>
>     // ...
>
> }
>
>
>
> Nem mondom hogy nagyon más, cserében pont azt a védelmet veszítjük el, 
> amit egyébként nyújtana. Annyi annotáció van, nem tud valaki egy 
> @onNull <param> <value> formát is? :)
>
>
>
> De ha már itt vagyunk, legyen itt egy „szép” megoldás is:
>
>
>
> public NumericResult compute(
>
>         final NumericValue param1,
>
>         final NumericValue param2,
>
>         final ComputationProvider provider
>
> ) {
>
>     if (provider == null) {
>
>         return compute(param1, param2);
>
>     }
>
>     // ...
>
> }
>
>
>
> public NumericResult compute(final NumericValue param1, final 
> NumericValue
> param2) {
>
>     return compute(param1, param2, new 
> MyDefaultComputationProvider());
>
> }
>
>
>
> Ugye a háromparaméteres esetén is lehet hogy null az értéke (mert a 
> hívó nem akarja ellenőrizni), ezért ilyenkor „átkonvertáljuk” 
> kétparaméteressé, amelyik újrahívja a háromparaméterest csak most nem 
> null provider-rel. Így aztán final is van, meg védelem is.
>
>
>
> Üdv,
>
>
>
> Iván
>
> ______________________________
>
> István Ketler
>
> Senior Consultant
>
>
>
> Lufthansa Systems Hungária Kft.
>
> Development Center Pest
>
> Neumann János u. 1/e
>
> 1117 Budapest
>
> Hungary
>
> Phone: +36 1 887-2815
>
> Fax: +36 1 887-0577
>
> Mobile: +36 30 600-4936
>
> E-mail: istvan.ketler at LHsystems.com
>
> www.LHsystems.com
>
>
>
>
>
> Sitz der Gesellschaft / Corporate Headquarters: Lufthansa Systems 
> Hungaria Kft, Budapest, Fovarosi Birosag 01-09-463417 
> Geschaeftsfuehrung / Management Board: Peter Sipos
>
>
>
> _______________________________________________
> 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


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