<HTML xmlns="http://www.w3.org/TR/REC-html40" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word"><head><META content="text/html; charset=iso-8859-2" http-equiv="Content-Type">

<meta content="text/html; charset=iso-8859-2" http-equiv="Content-Type">
<meta content="Microsoft Word 12 (filtered medium)" name="Generator">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:285626223;
        mso-list-type:hybrid;
        mso-list-template-ids:-1117735296 68026383 68026393 68026395 68026383 68026393 68026395 68026383 68026393 68026395;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head><BODY>
<DIV>
<div class="WordSection1">
<p class="MsoNormal">Felmerült a memóriataposó blogban hogy miért is kell nekünk a final...<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="mso-list:Ignore">1.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>Némelyek állítják, hogy növeli az olvashatóságot. Szerintem rontja, mert hosszabb lesz a paraméterlista.<o:p></o:p></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="mso-list:Ignore">2.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>Némelyek állítják, hogy világosabb a &#8222;szándék&#8221;. 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 &#8222;céljai&#8221; 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 &#8222;default&#8221; vagy &#8222;optional&#8221; paraméter értékekről (lásd később), amelyek azért lehetnek hasznosak.<o:p></o:p></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="mso-list:Ignore">3.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>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 &#8222;benézheti&#8221; 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.<o:p></o:p></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="mso-list:Ignore">4.<span style="font:7.0pt &quot;Times New Roman&quot;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><![endif]>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ó).<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">Szóval igen, szerintem &#8222;to final&#8221;, 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.<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">A final akkor lenne igazán hasznos, ha kombinálható lenne egy &#8222;default&#8221; paraméterértékkel is. Pl ilyenkor egy kicsit idegesítő, ha **kötelező**a használata, méghozzá kivétel nélkül:<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">public NumericResult compute(<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final NumericValue param1,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;final NumericValue param2,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;ComputationProvider provider<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; if (provider == null) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; provider = new MyDefaultComputationProvider();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; // ...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal">Mert ehelyett most így kell írni:<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">public NumericResult compute(<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final NumericValue param1,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;final NumericValue param2,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;final ComputationProvider providerParam<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; ComputationProvider provider = providerParam;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; if (provider == null) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComputationProvider provider = new MyDefaultComputationProvider();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; // ...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">}<o:p></o:p></span></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">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 &lt;param&gt; &lt;value&gt; formát is? :)<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">De ha már itt vagyunk, legyen itt egy &#8222;szép&#8221; megoldás is:<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">public NumericResult compute(<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final NumericValue param1,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;final NumericValue param2,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;final ComputationProvider provider<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; if (provider == null) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return compute(param1, param2);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; // ...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">public NumericResult compute(final NumericValue param1, final NumericValue param2) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">&nbsp;&nbsp;&nbsp; return compute(param1, param2, new MyDefaultComputationProvider());<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:&quot;Courier New&quot;;color:#5F497A">}<o:p></o:p></span></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">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 &#8222;átkonvertáljuk&#8221; 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.<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">Üdv,<o:p></o:p></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
<p class="MsoNormal">Iván<o:p></o:p></p>
<p class="MsoNormal" style="margin-top:12.0pt;line-height:150%;text-autospace:none">
<span lang="EN-US" style="font-size:8.0pt;line-height:150%;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:gray">______________________________<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-top:8.0pt;page-break-after:avoid;text-autospace:none">
<b><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">István Ketler<o:p></o:p></span></b></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">Senior Consultant<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">Lufthansa Systems Hungária Kft.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">Development Center Pest<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">Neumann János u. 1/e<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">1117 Budapest<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">Hungary<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">Phone: &#43;36 1&nbsp;887-2815<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">Fax: &#43;36 1&nbsp;887-0577<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">Mobile: &#43;36 30&nbsp;600-4936<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#787878">E-mail:
</span><span style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;"><a href="mailto:istvan.ketler@LHsystems.com"><span style="color:blue">istvan.ketler@LHsystems.com</span></a></span><span lang="DE" style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;"><o:p></o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:8.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;"><a href="http://www.lhsystems.com/"><span style="color:blue">www.LHsystems.com</span></a><o:p></o:p></span></b></p>
<p class="MsoNormal"><o:p>&nbsp;</o:p></p>
</div>
</DIV>
<DIV>
<P CLASS="MsoNormal" STYLE="MARGIN: 0cm 0cm 0pt"></P>
<P CLASS="MsoNormal" STYLE="MARGIN: 0cm 0cm 0pt"></P>
<P CLASS="MsoNormal" STYLE="MARGIN: 0cm 0cm 0pt">&nbsp;</P>
<P CLASS="MsoNormal" STYLE="MARGIN: 0cm 0cm 0pt"><SPAN STYLE="FONT-SIZE: 8pt; COLOR: gray; FONT-FAMILY: Arial">Sitz der Gesellschaft / Corporate Headquarters: </SPAN><SPAN LANG="EN-GB" STYLE="FONT-SIZE: 8pt; COLOR: gray; FONT-FAMILY: Arial; mso-ansi-language: EN-GB">Lufthansa Systems Hungaria Kft, Budapest, Fovarosi Birosag 01-09-463417<BR></SPAN><SPAN STYLE="FONT-SIZE: 8pt; COLOR: gray; FONT-FAMILY: Arial">Geschaeftsfuehrung / Management Board: Peter Sipos</SPAN></P>
<P CLASS="MsoNormal" STYLE="MARGIN: 0cm 0cm 0pt"><BR></P>
<P CLASS="MsoNormal" STYLE="MARGIN: 0cm 0cm 0pt"></P></DIV></BODY></HTML>