<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3916529971656854151</id><updated>2012-01-07T23:30:15.893+01:00</updated><category term='enum'/><category term='math'/><category term='operator'/><category term='optimisation'/><category term='java'/><category term='workaround'/><category term='english'/><category term='law'/><category term='security'/><category term='javadoc'/><category term='develop'/><category term='jdk 7'/><category term='proposal'/><category term='conference'/><category term='evolution'/><category term='GUI'/><category term='style'/><category term='exceptions'/><category term='builder'/><category term='generics'/><category term='internet'/><category term='memory optimization'/><category term='semantics'/><category term='code'/><category term='encapsulation'/><category term='polski'/><title type='text'>Lasu 2 String</title><subtitle type='html'>Content is about this what matter to me.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-1236162064695426997</id><published>2011-08-17T19:01:00.000+02:00</published><updated>2011-08-17T19:01:26.635+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javadoc'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='style'/><title type='text'>If (false) may be useful</title><content type='html'>

&lt;p id="resizableP" &gt;Can you be friend with this kind of dead code? In this particular subject my opinion is slightly different from the general. I can agree that in the ideal programming world there is no need to use dead code, but in reality there are situations when it's good to consider this solution as appropriate.&lt;/p&gt;



&lt;a name='more'&gt;&lt;/a&gt;



  &lt;h5 id="resizableH5" &gt;Standard solution (JavaDoc)&lt;/h5&gt;
&lt;p id="resizableP" &gt;
As I previously wrote &lt;a href="http://lasu2string.blogspot.com/2008/12/is-javadoc-killing-program-evolution.html"&gt;here&lt;/a&gt;, JavaDoc is not perfect as well. Of course, if we have a lot of time, our code will look really good. Unfortunately, most of us do not have such amount of time, so we cannot become JavaDoc-Shakespeare if we want to be truly agile.&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Another solution (JavaDoc-Code)&lt;/h5&gt;
&lt;p id="resizableP" &gt;At first I used to replace some &lt;b&gt;descriptions&lt;/b&gt; in JavaDoc with &lt;b&gt;pure code&lt;/b&gt;. It can become handy in many ways. Code is precise so (mostly) there is no need to wander about its meaning - invaluable in multi-language team and not only there. Problem is in its volatility - each refactor including simple variable renaming can bring serious harm to our JavaDoc-Code, also code witch is no code (there is no compiler validation) can contains expressions that are understandable only for the author. Those reasons make this method (more or less) meaninglessness.&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Useful !/?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Don't get me wrong this is not the solution that should be used often, however my experience shows that it can be useful. One of such a moment is when we have to reimplement some important method long to a few hundred lines. To make backup always available &lt;a href="http://en.wikipedia.org/wiki/Apache_Subversion"&gt;SVN&lt;/a&gt; will be not enough (at least till next generation), as some serious refactor can make it almost useless. Also developers are more minded for applying changes to both dead path and active one, if they find dead code with good explanation, what, of course, is impossible for code in the repository! So basically, if you do not like to tell/force people not to make refactor because you have some important code in repository - consider using dead code.&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;How! / When?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
If you are in such a comfortable situation and your project have test, testers and there is a lot of time between bug and fix, dead code is probably not for you.&lt;br /&gt;
But if your project lack some of those things and still after all, you do not want to take it as excuse for your bugs then consider dead code as you temporary friend.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-1236162064695426997?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/1236162064695426997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2011/08/if-false-may-be-useful.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1236162064695426997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1236162064695426997'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2011/08/if-false-may-be-useful.html' title='If (false) may be useful'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-8839870286373336920</id><published>2011-03-20T17:13:00.003+01:00</published><updated>2011-06-04T17:39:32.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Secret behind 0.999... = 1</title><content type='html'>&lt;a target="_blank" href="http://na-chlodno.blogspot.com/2011/03/0999.html" style="float:right; text-align:right; " &gt;« Polska wersja »&lt;/a&gt;
&lt;table style="border: 0px solid black" &gt;&lt;tr&gt; &lt;td width="50%" &gt;&lt;/td&gt; &lt;td style="background-color:rgba(0, 0, 0, 0.4);   float:right;   line-height:10px;   padding: 9px 9px 1px;   text-align:right;" &gt;&lt;img border="0" style="background-color: white; border: 0px solid black; padding:0px;"  src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/999_Perspective.png/300px-999_Perspective.png"/&gt;
&lt;a target="_blank" href="http://en.wikipedia.org/wiki/0.999..." style="font-family: Georgia,Georgia,serif;   font-size:10px;   line-height:1;   " &gt;Wikipedia: 0.999...&lt;/a&gt;&lt;/td&gt; &lt;td width="50%" &gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;




&lt;p id="resizableP" &gt;
Searching a solution we often forget about the problem behind it. I'm familiar with the wrong focusing on 'how' instead on 'why', and what's more I've seen people doing the same mistakes as well. For example, let's just look at law regulations as synonym of complication paired with uncleanness. However, I'll drop that subject and introduce the similar problem occurring in maths. Do not expect any great proof, because I'll do that to explain it as simple as possible.
&lt;/p&gt;



&lt;a name='more'&gt;&lt;/a&gt;


  &lt;h5 id="resizableH5" &gt;&lt;code&gt;0.999... = 1&lt;/code&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;
The proof for the equation above is the above derivation:
&lt;div class="table"&gt;&lt;code&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = 0.999...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;10x = 9.999...&lt;br /&gt;
10x - x = 9.999... - 0.999...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;9x = 9&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = 1&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;



&lt;p id="resizableP" &gt;
If you are interested on it, you can find more about it on &lt;a target="_blank" href="http://en.wikipedia.org/wiki/0.999..."&gt;Wiki: 0.999...&lt;/a&gt; or at once read quite fine explanation by &lt;a target="_blank" href="http://www.straightdope.com/columns/read/2459/an-infinite-question-why-doesnt-999-1"&gt;Cecil Adams&lt;/a&gt;. The fact is that he will not going to get Nobel price for that but in real numbers field his explanation is mostly accurate.
&lt;/p&gt;


&lt;p id="resizableP" &gt;
I wanted to explain the reason behind it rather than submitting next proof for it. For this purpose I'll introduce the proof that every person earns the same amount of money, of course using the same method as above.
&lt;div class="table"&gt;&lt;code&gt;
Let's:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;m - best earnings on earth.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;x - earnings some man.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;y - earnings some other man.&lt;br /&gt;
We have then:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;x &gt;= 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;y &gt;= 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;x &lt;= m&lt;br /&gt;
&amp;nbsp;&amp;nbsp;y &lt;= m&lt;br /&gt;
&lt;br /&gt;
Let's assume:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;x = y&lt;br /&gt;
We can divide by nonzero:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;x/2m = y/2m&lt;br /&gt;
Let's bring it to integer numbers:&lt;br /&gt;
using (x &lt;= m)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;x/2m = 0&lt;br /&gt;
using (y &lt;= m)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;y/2m = 0&lt;br /&gt;
So we have proved equality:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;0 = 0&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p id="resizableP" &gt;
Thus, I proved that each of us earns the same amount of money, so it's proved the validity of the communist system.
&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Explanation&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Now, it's high time to end the torment and explain the point. Each of us earns the same amount, 'but' in accuracy to double amount of the best salary possible to be earned. The same thing happens in the case of &lt;code&gt;0.999 ... = 1&lt;/code&gt;. Except the fact that in the latter case the accuracy of the integers is 1, the precision of real numbers is (roughly) 1/∞. So we can safely confirm equality between 0.(9) and 1, 'BUT' with an accuracy of 1/∞, which shows that in the same time there is (roughly) the difference between these two numbers.
&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;Summary&lt;/h5&gt;
&lt;p id="resizableP" &gt;
All proves (including those the Wiki) are accurate, but in the same time they do not carry too much sense. 
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;This is how it is&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Proper infinity algebra is not used with some fairly simple reasons (in general):
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Infinitely small values are 'relatively' meaningless, so for quite a while there was no need to include them in the model.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Algebra with ∞ numbers begins to exhibit vector traits.&lt;/li&gt;
&lt;li id="resizableLi" &gt;The calculation results are interesting only if it is lifted upwards.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Inclusion of infinity in the model is quite tiring.&lt;/li&gt;
&lt;li id="resizableLi" &gt;A few existing formulas would have to be corrected in order to properly fit infinity algebra.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;More on...&lt;/h5&gt;
&lt;p id="resizableP" &gt;
If somebody wants to make some calculation, he/she may read about &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Surreal_number"&gt;surreal numbers&lt;/a&gt;, that contain the infinite and infinitesimal numbers (greater than zero but less than any positive real numbers). The mathematical description you can find on wiki as well: &lt;a href="http://en.wikipedia.org/wiki/0.999...#In_alternative_number_systems"&gt;0.999...: Alternative number systems&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-8839870286373336920?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/8839870286373336920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2011/03/secret-behind-0999-1.html#comment-form' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/8839870286373336920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/8839870286373336920'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2011/03/secret-behind-0999-1.html' title='Secret behind 0.999... = 1'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-6584498847184543036</id><published>2010-12-21T17:00:00.014+01:00</published><updated>2011-03-16T15:53:18.286+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internet'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Przeglądarki kontra bezpieczeństwo</title><content type='html'>&lt;p id="resizableP" &gt;&lt;a  target="_blank" href="http://nonsensopedia.wikia.com/wiki/Windows_Internet_Explorer"&gt;&lt;i&gt;Czyż Internet Explorer nie służy do przeglądania internetu z twojego komputera i vice versa?&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;
Mogliśmy jakiś czas temu zaobserwować &lt;a target="_blank" href="http://hacking.pl/pl/news-16023-Gratka_dla_hakerow.html" &gt;miły gest ze strony Mozilli&lt;/a&gt;  wspierający osoby które chcą zwiększyć bezpieczeństwo ich produktu (patrz: &lt;a target="_blank" href="http://blog.mozilla.com/security/2010/07/15/refresh-of-the-mozilla-security-bug-bounty-program/"&gt;Refresh of the Mozilla Security Bug Bounty Program).&lt;/a&gt; Zaciekawiony tymże faktem poszperałem więcej w poszukiwaniu informacji o bezpieczeństwie naszych przeglądarek...&lt;/p&gt;







&lt;p id="resizableP" &gt;
Ciekawostką jest &lt;a target="_blank" href="http://www.cert.pl/PDF/Raport_CP_przegladarki.pdf"&gt;raport firmy CERT z 2005r&lt;/a&gt; (ich pierwszy nawiasem mówiąc) - jednakże jego jakość jest wątpliwa i bardziej tu pasuje nazwa 'zestawienie'. Taki współczynnik jak &lt;b&gt;(&amp;nbsp;Liczba&amp;nbsp;luk&amp;nbsp;/&amp;nbsp;Popularność&amp;nbsp;)&lt;/b&gt; jest nie tyle nietrafiony co wręcz błędny. Otóż im większa szansa zysku z odkrytej luki tym częściej i szybciej zostanie ona wykorzystana, a w internecie ilość przekłada się przecież w bezpośredni sposób na zysk. Tak więc, moim zdaniem, powinno być raczej &lt;b&gt;(&amp;nbsp;Liczba&amp;nbsp;luk&amp;nbsp;*&amp;nbsp;Popularność&amp;nbsp;)&lt;/b&gt;. Ten sam mechanizm działa też w drugą stronę: firmy mające małą liczbę użytkowników są znacznie mniej podatne na ataki.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;




  &lt;h5 id="resizableH5" &gt;Dostępność luki&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Ataki hakerów można podzielić na skierowane na konkretny cel oraz na rozproszone (tzw. "kto się złapie"). Jak łatwo się domyślić, atak skierowany na nas może być bardzo przykry w konsekwencjach, tym samym największe znaczenie ma czas, przez który potencjalne luki są odsłonięte na światło dzienne oraz ich 'krytyczność', co ma wpływ na łatwość(dostępność) oraz sensowność ich wykorzystania.&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;Wtyczki&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Kolejnym niezmiernie istotnym czynnikiem wpływającym na bezpieczeństwo są plugin-y. Jeśli bowiem przeglądarka pozwala na ich zainstalowanie, wówczas (nie)bezpieczeństwo dotyczy także i ich, bo nawiasem mówiąc jakiś czas temu jeden z powszechnie dostępnych plugin-ów zawierał dość długo niewykrywalnego wirusa.&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;Nowości&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Problemem dla bezpieczeństwa są wszelkie nowości zwłaszcza te DUŻE, mające podbić rynek. To one praktycznie zawsze oznaczają nowe luki. &lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;W mojej opini&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Co Ja na to?
Osobiście z wyżej wymienionych powodów używam Opery, a przy tym jest dla mnie potwornie wygodna. Fakt, że przez te kilka lat dwa razy usunęła mi "ulubione" i kilka razy na miesiąc muszę sprawdzić parę 'niedorobionych' stron na Firefox-ie, jest jak najbardziej do zaakceptowania.&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Złożoność problemu&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Faktem jest, że bezpieczeństwo ze swojej natury jest skomplikowane, wobec tego można tak ustawić wyniki porównań/ rankingów, aby dowolną (no może poza MSIE) przeglądarkę uznać za "najlepszą". Wykorzystywanie tego do promocji produktów powoduje znaczne ograniczenie bezpieczeństwa mniej obeznanych użytkowników.&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Także w temacie&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Swoją drogą polecam zapoznanie się także z &lt;a target="_blank" href="http://www.webdevout.net/browser-security#graphs-total"&gt;zestawieniem w formie wykresu&lt;/a&gt;.&lt;br /&gt;
Porównanie (test) &lt;a target="_blank" href="http://www.chip.pl/artykuly/porownania/2010/12/internet-explorer-firefox-chrome-opera-czy-safari-test-przegladarek-internetowych"&gt;IE, Firefox, Chrome, Opera, czy Safari?&lt;/a&gt;, nie koncentruje się na bezpieczeństwie, ale też jest wart naszej uwagi.&lt;br /&gt;
&lt;a target="_blank" href="http://hacking.pl/pl/news-16271-Jak_zgarnac_20_tysiecy_dolarow.html"&gt;Google&lt;/a&gt; również wie jak zrobić dobry użytek z umiejętności 'hakerów'.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-6584498847184543036?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/6584498847184543036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2010/12/przegladarki-kontra-bezpieczenstwo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6584498847184543036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6584498847184543036'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2010/12/przegladarki-kontra-bezpieczenstwo.html' title='Przeglądarki kontra bezpieczeństwo'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-6081849362564047328</id><published>2010-07-16T23:45:00.008+02:00</published><updated>2011-03-03T21:16:29.610+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='law'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Informatyk zawodem wysokiego ryzyka?</title><content type='html'>&lt;p id="resizableP" &gt;Kolejny post dotyczący naszego Polskiego "&lt;i&gt;zaścianka&lt;/i&gt;". A&amp;nbsp;mianowicie chciałbym napomknąć jak wygląda egzystencja nas informatyków w kontekście przepisów prawnych oraz strachu przed naszymi umiejętnościami.&lt;/p&gt;


&lt;a name='more'&gt;&lt;/a&gt;


&lt;p id="resizableP" &gt;Wiedza, którą dysponujemy, pozwala nam patrzeć na systemy które używamy z zupełnie innej perspektywy, odkrywać ich błędy nawet bez zbytniego zaangażowania się w to. I co, niestety, smuci wytknięcie komuś błędu może wiele nas kosztować.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;i&gt;Na wstępie muszę zaznaczyć, że&amp;nbsp;specem w kwestiach prawnych nie jestem. Tak więc nie będę się skupiał na tychże kwestiach w kontekście paragrafów.&lt;/i&gt;&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;Świat&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;a href="http://kontrreformacja.webpark.pl/" target="_blank"&gt;&lt;img width="320" heigh="131" class="right" src="http://kontrreformacja.webpark.pl/spalenie.jpg" border="0" alt="" /&gt;&lt;/a&gt;
    Gdy słyszy się, że 'hacker' korzystając z serwisu znalazł poważną lukę bezpieczeństwa, a w nagrodę za powiadomienie właściciela o tym dostał jakiś śmieszny wyrok typu 600 lat pozbawienia wolności to człowiek zastanawia się czy w tej Ameryce jest tak dobrze jak to próbują nam wmówić? A przecież nawet w przypadkach, gdy użyto wiedzy tylko po to, aby pomóc uszczelnić zabezpieczenia, zakończenie często było takie samo. I&amp;nbsp;przynajmniej mi&amp;nbsp;taka sytuacja kojarzy się z inkwizycją. Tak jak kiedyś palono na stosie tych, których się obawiano, tak i&amp;nbsp;teraz zagadnienia informatyczne są postrzegane jako swoista magia oraz budzą lęk i&amp;nbsp;przerażenie.&lt;/p&gt;


&lt;p id="resizableP" &gt;Z drugiej jednak strony słyszymy o ujawnianiu wad oprogramowania jak choćby ostatnia sprawa z&amp;nbsp;&lt;a href="http://hacking.pl/pl/news-16001-Coraz_wiecej_atakow_na_Windows_XP.html"&gt;Windowsem XP&lt;/a&gt;, jednak nikt o&amp;nbsp;żadnym procesie nie mówi.&lt;/p&gt;


&lt;p id="resizableP" &gt;Wszystkie te sytuacje dla kogoś nie obeznanego z&amp;nbsp;prawem zapewne wyglądają dość dziwacznie, w tym także dla mnie. Być może jest to spowodowane różnicowaniem zabezpieczeń serwisów/portali i zwykłych programów.&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Polska&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Z mniej bądź lepiej znanych mi&amp;nbsp;przypadków dotyczących bezpieczeństwa muszę przyznać, że&amp;nbsp;jest dosłownie &lt;b&gt;rÓŻNie&lt;/b&gt;. Choć patrząc na&amp;nbsp;to z&amp;nbsp;przymrużeniem oka zaściankiem pod tym względem nie wydajemy się być. Tu sporo na gorsze mogą zmienić ostatnie nowelizacje prawa, ale to już sprawa do&amp;nbsp;dalszego zbadania. Tak czy siak prace społeczne za wytknięcie błędów w&amp;nbsp;serwisie dadzą się przełknąć.&lt;/p&gt;






  &lt;h5 id="resizableH5" &gt;Doświadczenia&lt;/h5&gt;
&lt;ul&gt;
    &lt;li id="resizableLi" &gt;Administrując siecią posiadającą kilkuset użytkowników zaobserwowałem grupę "wykształconych", którzy robią co chcą, będąc ufnymi w swoją zarąbistość. Jednak pewnego słonecznego dnia przychodzi szara rzeczywistość i wtedy nawet genialny pomysł typu: skrypt zmieniający regularnie mac-a na niewiele się zdaje. Wielu z nich już się boleśnie przekonało, w tym także na moich oczach, że Wielki Brat patrzy a coś takiego jak anonimowość w internecie nie istnieje. &lt;br /&gt;
Pracując w sieci zapominamy, że nasze poczynania można praktycznie w 100% namierzyć, inna kwestia czy to się opłaca. Kluczowym pytaniem jest więc: "Komu się zaszło za skórę?", oraz jak bardzo ten ktoś jest zdeterminowany aby złapać nas na gorącym uczynku.&lt;/li&gt;
    &lt;li id="resizableLi" &gt;Nagradzanie ludzi z zewnątrz  za&amp;nbsp;informację o&amp;nbsp;błędzie też można spotkać i&amp;nbsp;z&amp;nbsp;moich obserwacji wynika, że&amp;nbsp;firmy mogą dużo na tym wygrać.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Na pewno niewyobrażalne straty firma 'może' ponieść w wyniku podejścia typu "my wiemy lepiej" bądź też "z hakerami się nie negocjuje", a&amp;nbsp;sprawa jest dużo bardziej skomplikowana niż to się może wydawać na&amp;nbsp;pierwszy rzut oka. Więc jest szansa, że&amp;nbsp;doczeka się osobnego postu.&lt;/li&gt;
&lt;li id="resizableLi" &gt;O innych ciekawych przypadkach z życia wziętych, przeczytasz na: &lt;a href="http://hacking.pl/"&gt;Hacking.pl&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;





  &lt;h5 id="resizableH5" &gt;Rada z mojej strony&lt;/h5&gt;
&lt;p id="resizableP" &gt;Jeśli już znajdziemy jakąś lukę w obcym nam systemie, to:
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Nie możemy oferować odpłatnego jej załatania. Dzieje się to&amp;nbsp;dlatego, iż&amp;nbsp;jako potencjalni hackerzy możemy chcieć uzyskać dostęp do&amp;nbsp;kodu w&amp;nbsp;celu dalszej penetracji systemu, a&amp;nbsp;w&amp;nbsp;interesie firmy leży zadbanie aby sprawa nie przybrała takiego rozwojowi wypadków.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Pozostawienie sprawy samej sobie może okazać się poważnym błędem. Bo&amp;nbsp;problem może wypłynąć a&amp;nbsp;my zostaniemy kozłem ofiarnym (logi mogą okazać się trwalsze od naszej sklerozy).&lt;/li&gt;
&lt;li id="resizableLi" &gt;W zależności od metody odkrycia luki można rozważyć złożenie zawiadomienia o&amp;nbsp;przestępstwie na&amp;nbsp;mocy ustawy o&amp;nbsp;ochronie danych osobowych, gdyż o&amp;nbsp;zgrozo atak może okazać się jedyną formą obrony. Tu&amp;nbsp;jednak lepiej zasięgnąć porady prawnej i to wyjątkowo dobrej, nie zapominajmy w&amp;nbsp;końcu, że&amp;nbsp;niektóre bronie są obosieczne.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Przyszłość&lt;/h5&gt;
&lt;p id="resizableP" &gt;Trudno jest przewidzieć, w którą stronę pójdzie kwestia bezpieczeństwa, na pewno niezaprzeczalny wpływ na to mają ustawodawcy. A możliwe ścieżki zarysowują się:
&lt;ul&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;Strach :&lt;/b&gt; Przepisy pójdą w stronę karania za nie upoważniony dostęp do danych nie zależnie od powodów. Taka postawa może spowodować zatajanie luk w bezpieczeństwie w efekcie czego usłyszymy o kilkulatkach forsujących zabezpieczenia korporacji.&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;Równowaga :&lt;/b&gt; Przepisy nie będą tak restrykcyjne a od czasu do czasu spotkamy się z zaniżonymi bądź zawyżonymi wyrokami.&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;Nacisk :&lt;/b&gt; Możliwości testowania zabezpieczeń zostaną oficjalnie otwarte, co nie ma szansy zaistnienia bez wyraźnego sprecyzowania jaką korzyść testujący z tego tytułu otrzyma oraz jakie są jego obowiązki (np. odpowiednio wczesne powiadomienie właściciela). Na pewno zwiększyłoby to liczbę specjalistów od bezpieczeństwa jak i ich fachowość. Z drugiej strony uszczupliłoby zasoby finansowe firm.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Materiały:&lt;/h5&gt;
&lt;p id="resizableP" &gt; Dla zainteresowanych bardziej fachowa lektura (komentarze też warte uwagi)
&lt;ul&gt;
&lt;li id="resizableLi" &gt;&lt;a href="http://prawo.vagla.pl/node/7149"&gt;Fuszerka wykonawcy, szukanie luki, oferta naprawy i kajdanki&lt;/a&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;a href="http://prawo.vagla.pl/node/8154"&gt;"Nie można przełamać czegoś, co nie istnieje" - polski wyrok w sprawie SQL Injection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;





&lt;p id="resizableP" &gt;&lt;i&gt;&lt;b&gt;PS. A jak wy się zapatrujecie na kwestie prawne w naszych zawodach?&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-6081849362564047328?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/6081849362564047328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2010/07/informatyk-zawodem-wysokiego-ryzyka.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6081849362564047328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6081849362564047328'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2010/07/informatyk-zawodem-wysokiego-ryzyka.html' title='Informatyk zawodem wysokiego ryzyka?'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-1349265050329395937</id><published>2010-07-13T19:10:00.003+02:00</published><updated>2011-03-03T21:18:30.318+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><title type='text'>Javarsovia 2010 z drugiej ręki</title><content type='html'>&lt;h5 id="resizableH5" &gt;Odczucia&lt;/h5&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Z niecierpliwością czekam na następną &lt;a href="http://javarsovia.pl/"&gt;Javarsovie&lt;/a&gt;, co moim zdaniem samo z siebie świadczy o tym jak bardzo byłem zadowolony z uczestnictwa.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Afterparty także pobiło moje oczekiwania, tylko prelegentów na niej trochę brakowało.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Dodatkowo byłem pod wrażeniem liczby uczestników.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Na pewno niewybaczalnym jest fakt, że nie wygrałem Asusa &lt;img src="http://alan.umcs.lublin.pl/~lasu/emots/Emo-027.ico" /&gt;. &lt;/li&gt;
&lt;li id="resizableLi" &gt;Tak wiele się działo, że brakowało mi czasu, aby dokładnie zapoznać się ze stoiskami sponsorów.&lt;/li&gt;
&lt;/ul&gt;



&lt;a name='more'&gt;&lt;/a&gt;



  &lt;h5 id="resizableH5" &gt;Prezentacje&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;&amp;raquo; Jak zapobiegać biodegradacji kodu &amp;laquo;&lt;/b&gt;&lt;br /&gt;
&lt;span class='right'&gt;by &lt;a href="http://blog.solidcraft.eu/"&gt;Jakub Nabrdalik&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Temat nie był zbyt rozległy, ale ciekawie i kompleksowo omówiony.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Dodatkowo przykłady były jak najbardziej trafne.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Sam mam za sobą refaktoryzacje na tyle skomplikowane, że potrzebowałem na nie do 2&amp;nbsp;tygodni wraz z budową specjalnych narzędzi aby w ogóle były możliwe, efektem czego było skrócenie czasu wprowadzenia zmian z jednego dnia i więcej do maksymalnie kilku godzin i to bez nerwowego zastanawiania się jaki efekt nasza praca przyniesie. Więc choć przedmiot prezentacji wydaje się być błahy to nie zmienia to faktu jak duży wpływ ma nasze podejście do programowania na dalszą jakość pracy z projektem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;&amp;raquo; Jak można zarobić na uczciwości, przejrzystości i szacunku do klienta &amp;laquo;&lt;/b&gt;&lt;br /&gt;
&lt;span class='right'&gt;&lt;b&gt;&amp;raquo; kontrakty agile w praktyce &amp;laquo;&lt;/b&gt;&lt;br /&gt; by &lt;a href="http://www.spartez.com/pl/spartez-atlassian-partner.html"&gt;Wojciech Seliga&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Naprawdę miło usłyszeć jak ludzie potrafią się wybić nie działając na szkodę lub kosztem klienta. Z drugiej zaś strony możemy zaobserwować jakie konsekwencje przynosi odwrotne podejście: &lt;a href="http://osnews.pl/w-jaki-sposob-dozywotnio-zarabiac-na-oprogramowaniu/"&gt;"W jaki sposób dożywotnio zarabiać na oprogramowaniu?"&lt;/a&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;Do samej prezentacji nie mam żadnych zastrzeżeń. Prowadzący wiedział o czym mówi, a temat jest niewątpliwie warty poszerzenia. &lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;br /&gt;&lt;p id="resizableP" &gt;&lt;b&gt;&amp;raquo; Performance Considerations in Concurrent Garbage-Collected Systems &amp;laquo;&lt;/b&gt;&lt;br /&gt;
&lt;span class='right'&gt;by &lt;a href="http://www.azulsystems.com/about_us/leadership"&gt;Gil Tene&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;I was really impressed by the quality of this presentation along with the amount of given informations.&lt;/li&gt;
&lt;li id="resizableLi" &gt;What a pity that there was no time for more complicated questions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;br /&gt;&lt;p id="resizableP" &gt;&lt;b&gt;&amp;raquo; Projekt Voldemort: gdy relacyjna baza danych to za mało (zbyt wiele?) &amp;laquo;&lt;/b&gt;&lt;br /&gt;
&lt;span class='right'&gt;by &lt;a href="http://nurkiewicz.blogspot.com/"&gt;Tomasz Nurkiewicz&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Ciekawe i potrzebne rozwiązanie, może tylko nie potrzebnie było pokazane jak uzyskać prezentowane efekty, choć nie którym właśnie to przypadło do gustu.&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;br /&gt;&lt;p id="resizableP" &gt;&lt;b&gt;&amp;raquo; Windows Azure - Cloud Computing, co to, po co i dla kogo? &amp;laquo;&lt;/b&gt;&lt;br /&gt;
&lt;span class='right'&gt;by &lt;a href="http://www.tomaszkopacz.com/"&gt;Tomasz Kopacz&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Wiele funkcji zostało tu przedstawionych, ale jak dla mnie zbyt wiele. Dlatego nawet pomimo, iż zauważyłem niewątpliwe zalety proponowanych rozwiązań to postrzegam je jako "Spaghetti Monster" i osobiście bałbym się w to wchodzić.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;br /&gt;&lt;p id="resizableP" &gt;&lt;b&gt;&amp;raquo; Oracle Coherence - wprowadzenie poprzez przykłady &amp;laquo;&lt;/b&gt;&lt;br /&gt;
&lt;span class='right'&gt;by &lt;a href="http://jdn.pl/blog/88"&gt;Waldemar Kot&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Ciągle mam wrażenie, że ta prezentacja powinna trwać minimum 3h, aby pokryć zapotrzebowanie na omawiany temat, zwłaszcza, że zawsze można liczyć na kompetentną odpowiedz od Waldka, o ile jest na to czas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;br /&gt;&lt;p id="resizableP" &gt;&lt;b&gt;&amp;raquo; Software Craftsmanship - Język wzorców językiem profesjonalistów &amp;laquo;&lt;/b&gt;&lt;br /&gt;
&lt;span class='right'&gt;by &lt;a href="http://art-of-software.blogspot.com/"&gt;Sławek Sobótka&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Na moje szczęście mogę wcześniej zapoznawać się z prezentacjami/przekonaniami Sławka, na tej podstawie przypuszczam, że i ta prezentacja cieszyła się odpowiednim uznaniem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;br /&gt;&lt;p id="resizableP" &gt;&lt;b&gt;&amp;raquo; Pozostałe &amp;laquo;&lt;/b&gt;&lt;br /&gt;
&lt;span class='right'&gt;by &lt;a href="http://www.javarsovia.pl/konferencja/prelegenci-2010.html"&gt;Inni prelegenci&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Tu potrzeba jedynie poczekać na udostępnienie &lt;a href="http://javarsovia.pl/"&gt;nagrań i materiałów&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-1349265050329395937?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/1349265050329395937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2010/07/javarsovia-2010-z-drugiej-reki.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1349265050329395937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1349265050329395937'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2010/07/javarsovia-2010-z-drugiej-reki.html' title='Javarsovia 2010 z drugiej ręki'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-6199062981911931474</id><published>2010-07-12T23:12:00.005+02:00</published><updated>2011-03-03T21:29:49.196+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='builder'/><title type='text'>GUI in GridBagLayout</title><content type='html'>&lt;p id="resizableP" &gt;Basically, I do not like GridBagLayaout, but from my point of view it's the most effective way to build and maintain GUI. So before explaining my point of view, let's eliminate other path.&lt;/p&gt;



&lt;a name='more'&gt;&lt;/a&gt;



  &lt;h5 id="resizableH5" &gt;Graphical editor :&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Alternative for writing a code is a creating GUI through a graphical editor, like the one in NetBeans. The effect obtained in this way is good, but it brings few problems as well:
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Editor may lock GUI code.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Too many changes might: 
 &lt;ul&gt;
 &lt;li id="resizableLi" &gt;Mess the code,&lt;/li&gt;
 &lt;li id="resizableLi" &gt;Force us to create GUI once again,&lt;/li&gt;
 &lt;li id="resizableLi" &gt;Remove some important part of code,&lt;/li&gt;
 &lt;/ul&gt;
&lt;/li&gt;
&lt;li id="resizableLi" &gt;Mostly we are not able to move GUI code to other IDE freely.&lt;/li&gt;
&lt;/ul&gt;
For me, reasons for 'no' have been unacceptable.
&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;GUI as code &amp;  GridConstraintsBuilder:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Let's back to GridBagLayout. The greatest obstacle in using this layout in a code form is GridBagConstraint. Wasting line for each property does not make it readable at all, especially when we have to realign GUI with more than 10 elements. Folding its construction to multi parameter util-method does not make it really easy to handle especially for newbie.&lt;br /&gt;
Because of this reasons GridBagConstraint was rewritten to the builder form. For me, this way allows to keep a correct proportion between code's readability and its size. So there is no need to stuck on code analysing to make a small change.
&lt;/p&gt;
&lt;p id="resizableP" &gt;
One of the most important part of the new code is its integration with the existing one, because no one will allow himself to manage new and old ways.
&lt;code&gt;.printAsJavaCode$(...)&lt;/code&gt; method was created to make this inequality to be possible to happen:&lt;br /&gt;
&lt;code&gt;$time{conversion code to new form} + $time{work on new-like code} &lt;= $time{work on old-like code}&lt;/code&gt;
&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Main problems:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Conversion to Java code is not able to determine if value is provided by constant or by variable. This makes some additional checking as required along with the conversion.&lt;/li&gt;
&lt;li id="resizableLi" &gt;There is no interface for constrain, so passing builder to component may happen.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Rich methods' set has its disadvantages as well. On the one hand, we can easily pass interesting arguments, but in this way, we lose a lot of highlightings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Builder:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;
Sample of usage:
&lt;div class='table'&gt;&lt;code&gt;
JFrame frame = &lt;span class='key' &gt;new&lt;/span&gt; JFrame();&lt;br /&gt;
JPanel panel = &lt;span class='key' &gt;new&lt;/span&gt; JPanel(&lt;span class='key' &gt;new&lt;/span&gt; GridBagLayout());&lt;br /&gt;
frame.setContentPane(panel);&lt;br /&gt;
GridConstraintsBuilder base = GridConstraintsBuilder.newOnCenter()&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.setYAsRelative().setVerMarginY(2, 0, 4);&lt;br /&gt;
GridConstraintsBuilder labels = base.clone();&lt;br /&gt;
GridConstraintsBuilder fields = base.clone();&lt;br /&gt;&lt;br /&gt;

labels.setAlignAsToRight()&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.setX(1).setHorMarginX(5, 0, 10);&lt;br /&gt;
fields.setAlignAsToLeft()&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.setX(3).setHorMarginX(5, 0, 5);&lt;br /&gt;&lt;br /&gt;
for (String text : &lt;span class='key' &gt;new&lt;/span&gt; String[] { &lt;span class='blue' &gt;"Some"&lt;/span&gt;, &lt;span class='blue' &gt;"One"&lt;/span&gt;, &lt;span class='blue' &gt;"And other"&lt;/span&gt; }) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;panel.add(&lt;span class='key' &gt;new&lt;/span&gt; JLabel(text), labels.build());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;panel.add(&lt;span class='key' &gt;new&lt;/span&gt; JTextField(text), fields.build());&lt;br /&gt;
}&lt;br /&gt;
frame.setSize(300, 200);&lt;br /&gt;
frame.setDefaultCloseOperation(JFrame.&lt;span class='blue' &gt;EXIT_ON_CLOSE&lt;/span&gt;);&lt;br /&gt;
frame.setVisible(true);&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li id="resizableLi" &gt;Sample of conversion of &lt;a href="http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/examples/layout/GridBagLayoutDemoProject/src/layout/GridBagLayoutDemo.java"&gt;GridBagLayoutDemo.java&lt;/a&gt; :&lt;br /&gt;
At first we can convert constraints to Java using:
&lt;div class='table'&gt;&lt;code&gt;
...&lt;br /&gt;
pane.add(button, GridConstraintsBuilder.printJavaCode$(c));&lt;br /&gt;
...
&lt;/code&gt;&lt;/div&gt;
Execution of such a code would produce:
&lt;div class='table'&gt;&lt;code&gt;
GridConstraintsBuilder.newOnCenter(0,0)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().provide() ;&lt;br /&gt;
GridConstraintsBuilder.newOnCenter(1,0).setWeight(0.5,0.0)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().provide() ;&lt;br /&gt;
GridConstraintsBuilder.newOnCenter(2,0).setWeight(0.5,0.0)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().provide() ;&lt;br /&gt;
GridConstraintsBuilder.newOnCenter(0,1).setSize(3,1)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().setInternalPadding(0,40).provide() ;&lt;br /&gt;
GridConstraintsBuilder.newOnPageEnd(1,2).setSize(2,1).setWeight(0.0,1.0)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().setInsets(0,10,0,0).provide() ;
&lt;/code&gt;&lt;/div&gt;
So after including '&lt;code&gt;shouldFill&lt;/code&gt;'  and '&lt;code&gt;shouldWeightX&lt;/code&gt;' the final code would look like:
&lt;div class='table'&gt;&lt;code&gt;
GridConstraintsBuilder button1 = GridConstraintsBuilder.newCenter(0, 0)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal();&lt;br /&gt;
if (shouldWeightX) button1.setWeightX(0.5);&lt;br /&gt;
pane.add(&lt;span class='key' &gt;new&lt;/span&gt; JButton(&lt;span class='com' &gt;"Button 1"&lt;/span&gt;), button1.build());&lt;br /&gt;
pane.add(&lt;span class='key' &gt;new&lt;/span&gt; JButton(&lt;span class='com' &gt;"Button 2"&lt;/span&gt;), GridConstraintsBuilder&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.newCenter(1, 0).setWeight(0.5, 0.0)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().build());&lt;br /&gt;
pane.add(&lt;span class='key' &gt;new&lt;/span&gt; JButton(&lt;span class='com' &gt;"Button 3"&lt;/span&gt;), GridConstraintsBuilder&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.newCenter(2, 0).setWeight(0.5, 0.0)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().build());&lt;br /&gt;
pane.add(&lt;span class='key' &gt;new&lt;/span&gt; JButton(&lt;span class='com' &gt;"Long-Named Button 4"&lt;/span&gt;), GridConstraintsBuilder&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.newCenter(0, 1).setSize(3, 1)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().setInternalPadding(0, 40).build());&lt;br /&gt;
pane.add(&lt;span class='key' &gt;new&lt;/span&gt; JButton(&lt;span class='com' &gt;"5"&lt;/span&gt;), GridConstraintsBuilder&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.newPageEnd(1, 2).setSize(2, 1).setWeight(0.0, 1.0)&lt;span class='com' &gt;//&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.fillHorizontal().setInsets(0, 10, 0, 0).build());&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;Resources:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;a href="http://alan.umcs.lublin.pl/~lasu/develop/GridConstraintsBuilder.java"&gt;GridConstraintsBuilder code&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://tomasz.kubik.staff.iiar.pwr.wroc.pl/dydaktyka/Java/JavaWyk03-MenUlozeniaSysProp-TK.pdf"&gt;Menadżerowie ułożenia.pdf&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-6199062981911931474?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/6199062981911931474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2010/07/gui-in-gridbaglayout.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6199062981911931474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6199062981911931474'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2010/07/gui-in-gridbaglayout.html' title='GUI in GridBagLayout'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-5447390493604523050</id><published>2010-02-20T22:04:00.005+01:00</published><updated>2011-03-03T21:38:09.747+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='semantics'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>Forwarding exceptions as language potential</title><content type='html'>&lt;p id="resizableP" &gt;Each  of Java programmer knows how exhausting a &lt;a href="http://java.sun.com/docs/books/tutorial/essential/exceptions/definition.html"&gt;handing exception&lt;/a&gt; can be. So sooner on later he/she founds the situation when he/she exactly knows that he/she is handling the exception that will never occur. Some thoughts about this can be found &lt;a href="http://stackoverflow.com/questions/501277/why-doesnt-java-allow-generic-subclasses-of-throwable"&gt;here&lt;/a&gt;.&lt;/p&gt;



&lt;a name='more'&gt;&lt;/a&gt;



  &lt;h5 id="resizableH5" &gt;Negative consequences&lt;/h5&gt;
&lt;p id="resizableP" &gt;What are negative consequences of obligation to handle the checked exception:&lt;br/&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;They are omitted in order to simplify code (use only unchecked exceptions or catch and ignore checked exceptions).&lt;/li&gt;
&lt;li id="resizableLi" &gt;A few exceptions are exchanged in one. This is considered as a good style, but mostly I&amp;nbsp;don't think about it in this way.&lt;/li&gt;
&lt;li id="resizableLi" &gt;There are lots of cases when we know that exception will not occur, but we cannot simply left catch block blank, because it can be changed in future.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;i&gt;At first, I&amp;nbsp;wanted to handle it by generics, but tracking such a code might be almost impossible, however, at the end, in mostly cases, it may make code complication increased.&lt;/i&gt; Someday in the future, I'll try to describe the matter of generic exception.&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;What do we have today?&lt;/h5&gt;
&lt;p id="resizableP" &gt;Quite interesting is the fact that Java allows to omit checked exceptions that have no chance to occur - what is widely used in practice. Let's see, how this works right by using the classes similar to java.lang.Appendable &amp; java.lang.StringBuilder.&lt;br /&gt; 
As the base, let's declare interface:
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public interface&lt;/span&gt; Appendable {&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Appendable append(CharSequence csq)
     &lt;span class='key' &gt;throws&lt;/span&gt; &lt;span class='green' &gt;ParamaterException&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;Let's consider the class that uses this interface:&lt;/ br&gt;
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public class&lt;/span&gt; StringBuilder &lt;span class='key' &gt;implements&lt;/span&gt; Appendable {&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private &lt;/span&gt; String string = "";&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Appendable append(CharSequence csq){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string += csq;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return this&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;
    &lt;/p&gt;


&lt;p id="resizableP" &gt;Using StringBuilder class directly through its interface ( &lt;code&gt;Appendable&lt;/code&gt; ) we have to handle the exception:&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;static&lt;/span&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Appendable stringBuilder = &lt;span class='key' &gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;s&gt;stringBuilder.append("")&lt;/s&gt;;&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;Let's use direct implementation &lt;code&gt;StringBuilder&lt;/code&gt; class. Now we do not have to handle that exception.&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;static&lt;/span&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder stringBuilder = &lt;span class='key' &gt;new&lt;/span&gt; StringBuilder();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stringBuilder.append("");&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;Let's consider more complicated example:&lt;br /&gt;



&lt;div class='table'&gt;&lt;code&gt;
&lt;span class='key' &gt;public class&lt;/span&gt; Sample {&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; Data data;&lt;br /&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Appendable appendTo(Appendable appendable) &lt;span class='key' &gt;throws&lt;/span&gt; &lt;span class='green' &gt;ParamaterException&lt;/span&gt;, &lt;span class='blue' &gt;ObjectException&lt;/span&gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (data == null) &lt;span class='key' &gt;throw new&lt;/span&gt; ObjectException();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;appendable.append(this.getClass().getSimpleName());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; appendable;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;
So as you can see one exception (&amp;nbsp;&lt;code&gt;ObjectException&lt;/code&gt;&amp;nbsp;) comes from a called object, second one (&amp;nbsp;&lt;code&gt;&lt;span class='green' &gt;ParamaterException&lt;/span&gt;&lt;/code&gt;&amp;nbsp;) comes from a method parameter (&amp;nbsp;&lt;code&gt;appendable&lt;/code&gt;&amp;nbsp;).&lt;br /&gt;
Let's modify the method signature in order to allow the complier to know where each exception comes from.&lt;br /&gt;

Let's modify semantics to express that:
&lt;div class='table'&gt;&lt;code&gt;
&lt;span class='key' &gt;public class&lt;/span&gt; Sample {&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; Data data;&lt;br /&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Appendable appendTo(Appendable appendable &lt;span class='key' &gt;throws&lt;/span&gt; &lt;span class='green' &gt;ParamaterException&lt;/span&gt;) &lt;span class='key' &gt;throws&lt;/span&gt; &lt;span class='blue' &gt;ObjectException&lt;/span&gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;// Both exception are thrown just&amp;nbsp;&lt;span class='green' &gt;ParamaterException&lt;/span&gt; is thrown/forwarded only if it occurs by calling 'appendable'.&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (data == null) &lt;span class='key' &gt;throw new&lt;/span&gt; ObjectException();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;appendable.append(this.getClass().getSimpleName());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; appendable;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt; Let's assume that placing the throw declaration right after input parameter means that the exception can be thrown only by the calling given parameter. 
 &lt;/p&gt;

&lt;p id="resizableP" &gt; So in this way, the compiler can determine if the exception can be thrown by the known given parameter type or not
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;static&lt;/span&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new Sample().appendTo(&lt;span class='key' &gt;new&lt;/span&gt; StringBuilder()); &lt;span class='com' &gt;// Compiler is able to determine that&amp;nbsp;&lt;span class='green' &gt;ParamaterException&lt;/span&gt; will do not occur here.&lt;/span&gt;&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;&lt;br /&gt;


&lt;p id="resizableP" &gt;The above mentioned way to handle exception in language is a quite simple to understand and introduce. However, it's just a tip of the iceberg. If sometimes we have a nice way to handle exception flow in a this way of solving, this will have to be extended what can bring some problems in a few other aspects, however, it's not now time to bring it up.&lt;/p&gt;

&lt;p id="resizableP" &gt;At the end, I&amp;nbsp;would like to mention that I'm just afraid that most programmers will not be able to comprehend the exceptions and the application flow in the same time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-5447390493604523050?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/5447390493604523050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2010/02/forwarding-as-language.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/5447390493604523050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/5447390493604523050'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2010/02/forwarding-as-language.html' title='Forwarding&amp;nbsp;exceptions as language&amp;nbsp;potential'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-3246127714086287081</id><published>2010-02-14T02:32:00.007+01:00</published><updated>2011-03-03T21:56:44.778+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='semantics'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>The '!' logical-complement operator (fixed)</title><content type='html'>&lt;p id="resizableP" &gt;It's high time to clear doubts about: &lt;a href="http://lasu2string.blogspot.com/2009/12/logical-complement-operator.html"&gt;The '!' logical-complement operator&lt;/a&gt;. With little help of &lt;a href="http://technology-for-human.blogspot.com/2009/04/na-poczatku-byo-sowo.html"&gt;someone&lt;/a&gt; who can express himself more clearly, subject should be easier to follow.&lt;/p&gt;&lt;br /&gt;

&lt;p id="resizableP" &gt;Some time ago I&amp;nbsp;used to know all operators priorities in C++, using a minimal number of braces resulted with a quite compact code in logical cases. It was really easy to read that again, but only for me, what I&amp;nbsp;did not see as a problem. When I&amp;nbsp;started to work on the same code with others there were no turn back and I&amp;nbsp;had to make conditions more readable...&lt;/p&gt;&lt;br /&gt;


&lt;a name='more'&gt;&lt;/a&gt;



  &lt;h5 id="resizableH5" &gt;Languages and braces&lt;/h5&gt;
&lt;p id="resizableP" &gt;Analysing expression with braces requires to locate them as matching pairs, what takes more effort than a simple sequent reading like I&amp;nbsp;used to do before. But the real breakthrough happened when I&amp;nbsp;had to work on two totally different languages in the same time. Since then, big difference in semantics and operator priorities has changed a lot the way I'm wring code now. If someone has doubts whether a similar situation can happen or not, let's consider quite simple expression like: '&lt;b&gt;2+2*2&lt;/b&gt;', what gives '&lt;b&gt;6&lt;/b&gt;' in Java and '&lt;b&gt;8&lt;/b&gt;' in &lt;a href="http://en.wikipedia.org/wiki/MUMPS"&gt;MUMPS&lt;/a&gt; . So finally, I&amp;nbsp;ended using a few braces. When is it essential to use braces?&lt;br /&gt;
I suggest doing it in order: 
&lt;ul&gt;&lt;li id="resizableLi" &gt;&lt;b&gt;not to care about operator priorities&lt;/b&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;to prevent situation when modification can have impact on current expression meaning&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;br /&gt;



  &lt;h5 id="resizableH5" &gt;Practise&lt;/h5&gt;
&lt;p id="resizableP" &gt;Notice that adding braces, when it's necessary, might effect in a hard to analyse code, like having 3 and more closing bracket in a row, what's really confusing. Study this example to see how above rules apply:&lt;br /&gt;

Let's assume we have some variables:&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;boolean&lt;/span&gt; main = ...;&lt;br /&gt;&lt;br /&gt;
&lt;span class='key' &gt;boolean&lt;/span&gt; current = ...;&lt;br /&gt;&lt;br /&gt;
&lt;span class='key' &gt;boolean&lt;/span&gt; additional = ...;&lt;/code&gt;&lt;/div&gt;

And now code:&lt;br /&gt;
    &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; ( main == !current ) &lt;/code&gt;&lt;/div&gt;

becomes improper. Why? Because when we modify it and add something like this: &lt;br /&gt; 
    &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; ( main == !current  &amp;&amp; additional )&lt;/code&gt;&lt;/div&gt;

the code looks a little bit unclear. Why? It happens because we are not sure if negation applies only to variable '&lt;b&gt;current&lt;/b&gt;' or for a whole expression '&lt;b&gt;current &amp;&amp; additional&lt;/b&gt;'. In order to prevent from such situation we will apply above rules for using braces. Our expression will be transformed into this:
    &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; ( main == (!current) )&lt;/code&gt;&lt;/div&gt;
Does this look a little awkward? However, when we look closer at those three expressions below, 2nd and 3rd ones are totally clear, no matter what formatting is used. What's more a modification of our 'if' is easier because it does not require so much cursor travel (to add bracket).&lt;br /&gt;
1.     &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; ( main == !current  &amp;&amp; additional )&lt;br /&gt;
&lt;span class='key' &gt;if&lt;/span&gt; ( main == ! current&amp;&amp;additional )&lt;/code&gt;&lt;/div&gt;

2.     &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; ( main == (!current)  &amp;&amp; additional )&lt;br /&gt;
&lt;span class='key' &gt;if&lt;/span&gt; ( main == (! current)&amp;&amp;additional )&lt;/code&gt;&lt;/div&gt;

3.     &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; ( main == (!(current  &amp;&amp; additional)) )&lt;br /&gt;
&lt;span class='key' &gt;if&lt;/span&gt; ( main == (! (current&amp;&amp;additional)) )&lt;/code&gt;&lt;/div&gt;
    &lt;/p&gt;




&lt;p id="resizableP" &gt;So let's see how useful it will be when we exchange 'current' with little wider XML-like expression chain:&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;data.getAccountData().getUnit().getContract().isOpen()&lt;/code&gt;&lt;/div&gt;
we get 'if' looking like:&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; (main == data.getAccountData().getUnit().getContract().isOpen() &amp;&amp; additional)&lt;/code&gt;&lt;/div&gt;

Now if we want to negate isOpen() part in this expression, we write something like this:&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; (main == (!data.getAccountData().getUnit().getContract().isOpen()) &amp;&amp; additional)&lt;/code&gt;&lt;/div&gt;
while I&amp;nbsp;would suggest:&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; (main == data.getAccountData().getUnit().getContract().!isOpen() &amp;&amp; additional)&lt;/code&gt;&lt;/div&gt;
   &lt;/p&gt;&lt;br /&gt;




  &lt;h5 id="resizableH5" &gt;instanceof operator&lt;/h5&gt;
&lt;p id="resizableP" &gt;The next example is instanceof operator and it's negation. Now, in order to negate instanceof we must write:&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; (!(obj &lt;span class='key' &gt;instanceof&lt;/span&gt; Person)){...} &lt;/code&gt;&lt;/div&gt;
While I&amp;nbsp;would suggest:&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;if&lt;/span&gt; (obj !&lt;span class='key' &gt;instanceof&lt;/span&gt; Person){...} &lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;&lt;br /&gt;





&lt;p id="resizableP" &gt;Of course those examples require a few analysis, as a behaviour for null-s. But it's not a big deal in this case.&lt;/p&gt;&lt;br /&gt;



  &lt;h5 id="resizableH5" &gt;Work around:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
We can generate isOpen() as well as isNotOpen() instead of one method in that case. But it is rather a naive solution - isNotOpen() version in most cases calls traditional isOpen() with simple negation, what increases stack trace. Another problem could also occur during a code fixing, because someone could repair only one method (if both would contains implementations).&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-3246127714086287081?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/3246127714086287081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2010/02/logical-complement-operator-fixed.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/3246127714086287081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/3246127714086287081'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2010/02/logical-complement-operator-fixed.html' title='The &apos;!&apos; logical-complement operator (fixed)'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-592994174363731408</id><published>2009-12-18T22:22:00.006+01:00</published><updated>2011-03-03T22:04:01.314+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='operator'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>The logical-complement operator !</title><content type='html'>&lt;p id="resizableP" &gt;Maybe I'm weird but I really do not like syntax for this operator.&lt;/p&gt;
&lt;p id="resizableP" &gt;
Now time it's like:&lt;br /&gt;
  &lt;div class='table'&gt;&lt;code&gt;
  if (&lt;b&gt;!&lt;/b&gt;person.getThinkingModel().isThinking()){...}&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;


&lt;p id="resizableP" &gt;
I would personally prefer:&lt;br /&gt;
  &lt;div class='table'&gt;&lt;code&gt;
  if (person.getThinkingModel().&lt;b&gt;!&lt;/b&gt;isThinking()){...}&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p id="resizableP" &gt;I would do same about &lt;b&gt;instanceof&lt;/b&gt; to allow:&lt;br /&gt;
  &lt;div class='table'&gt;&lt;code&gt;
  if (obj &lt;b&gt;!&lt;/b&gt;instanceof Person){...}&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Work around:&lt;/b&gt;&lt;br /&gt;Would be nice to see both methods generated &lt;b&gt;isThinking()&lt;/b&gt; as well as &lt;b&gt;isNotThinking()&lt;/b&gt; instead of one in that case. Problem in this solutions involve setters which should be duplicated as well, and mostly 'Not' version should call traditional with simple negation, which increases stack traces.&lt;br /&gt;
  &lt;div class='table'&gt;&lt;code&gt;
  if (person.getThinkingModel().isNotThinking()){...}&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;This way have one more advantage. When you write in more than one language you can worry less about operators priority.&lt;/p&gt;

&lt;p id="resizableP" &gt;Use yours own judgement, which is easier to read and write.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-592994174363731408?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/592994174363731408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/12/logical-complement-operator.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/592994174363731408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/592994174363731408'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/12/logical-complement-operator.html' title='The logical-complement operator !'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-8610159332880828743</id><published>2009-10-15T22:22:00.008+02:00</published><updated>2011-03-03T22:05:50.163+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='generics'/><title type='text'>Little confusion about Generics</title><content type='html'>&lt;p id="resizableP" &gt;Lets consider some class used for collecting References. It requires little work but there is way to do not determine Reference type to early. So lets observe consequences of this action.&lt;/p&gt;


&lt;div class='table'&gt;&lt;code&gt;
import java.lang.ref.Reference;&lt;br /&gt;
import java.lang.ref.WeakReference;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
&amp;nbsp;* Collects {@link Reference}-s&lt;br /&gt;
&amp;nbsp;*/&lt;br /&gt;
&lt;span class='key' &gt;public class&lt;/span&gt; ReferenceCollector&amp;lt;Ref &lt;span class='key' &gt;extends&lt;/span&gt; Reference&amp;lt;/* ? &lt;span class='key' &gt;extends&lt;/span&gt;
*/ Type&gt;, Type&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;implements&lt;/span&gt; Iterable&amp;lt;Reference&amp;lt;? &lt;span class='key' &gt;extends&lt;/span&gt; Type&gt;&gt; { ... 
}&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;

&lt;p id="resizableP" &gt;This class will allow given code to compile:&lt;/p&gt;


&lt;div class='table'&gt;&lt;code&gt;ReferenceCollector&amp;lt;WeakReference&amp;lt;String&gt;, ?&gt; rc1 = null;&lt;/code&gt;&lt;/div&gt;
&lt;div class='table'&gt;&lt;code&gt;ReferenceCollector&amp;lt;WeakReference&amp;lt;String&gt;, ? extends Object&gt; rc2 = null;&lt;/code&gt;&lt;/div&gt;

&lt;p id="resizableP" &gt;On the other hand reversing Type arguments will be not allowed:&lt;/p&gt;

&lt;div class='table'&gt;&lt;code&gt;ReferenceCollector&amp;lt;WeakReference&amp;lt;&lt;s&gt;? extends Object&lt;/s&gt;&gt;, String&gt; rc2 = null;&lt;/code&gt;&lt;/div&gt;

&lt;p id="resizableP" &gt;This mean that nesting is count more then arguments order, what more it's all about compatibility not as I would expect equality of types. Probably I just need read rest of JLS when I'll have free time to get idea why '?' is allowed as second generic argument. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-8610159332880828743?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/8610159332880828743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/10/little-confusion-about-generics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/8610159332880828743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/8610159332880828743'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/10/little-confusion-about-generics.html' title='Little confusion about Generics'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-1610157324899127051</id><published>2009-10-04T11:51:00.008+02:00</published><updated>2011-03-03T22:07:56.481+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='enum'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>I just killed Eclipse</title><content type='html'>&lt;p id="resizableP" &gt;I like enum-s more than most people do.&lt;/p&gt;
&lt;p id="resizableP" &gt;They are really nice to use and synchronization-safe. But as I found, they have their limits as well.&lt;/p&gt;
&lt;p id="resizableP" &gt;After generating 1,8Mb Java code for one enum Eclipse dying after most try of refactorization ;), Java was not happy at all about it as well with error:    &lt;div class='table'&gt;&lt;code&gt;The code for the static initializer is exceeding the 65535 bytes limit&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;


&lt;a name='more'&gt;&lt;/a&gt;



&lt;p id="resizableP" &gt;I already saw bug about it &lt;a href="http://bugs.sun.com/view_bug.do?bug_id=4262078"&gt;4262078&lt;/a&gt;. I just had no idea that I'll ever reach that huge amount of code in one 'function'.&lt;/p&gt;

&lt;p id="resizableP" &gt;Lets see what we need deal with!&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;We need to store almost 1000 elements.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Each element have up to 30 attributes.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Constructor signature look like:&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;private Element(int section, int code, String name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;, Pair&amp;lt;ItemAttributes, Object&amp;gt;... attributes) { ... }&lt;/code&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Step 1:&lt;/b&gt;&lt;br /&gt;Less see how many entries can we have...&lt;br /&gt; Java start to work when file size get down to 380Kb and number of elements was around 130.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Step 2:&lt;/b&gt;&lt;br /&gt;Adding magic code...&lt;br /&gt;
   &lt;div class='table'&gt;&lt;code&gt;public class PIA extends Pair&amp;lt;ItemAttributes, Object&amp;gt;{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public PIA(ItemAttributes key, Object value) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super(key, value);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
Replacing 'Pair&amp;lt;ItemAttributes, Object&amp;gt;' with PIA reduced class size to 1Mb.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Step 3:&lt;/b&gt;&lt;br /&gt;More magic code...&lt;br /&gt;
renaming &lt;code&gt;ItemAttributes&lt;/code&gt; to &lt;code&gt;IA&lt;/code&gt; reduced code size to 700Kb, and still not enough.
&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Step 4:&lt;/b&gt;&lt;br /&gt;More magic code...&lt;br /&gt;
After simplifying constructor to    &lt;div class='table'&gt;&lt;code&gt;private Element(int section, int code, String name, Object[]... attributes) { ... }&lt;/code&gt;&lt;/div&gt; source code take 450Kb&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Last step&lt;/b&gt;&lt;br /&gt;Undo all changes and split elements into enum-s similar with sections.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-1610157324899127051?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/1610157324899127051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/10/i-just-killed-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1610157324899127051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1610157324899127051'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/10/i-just-killed-eclipse.html' title='I just killed Eclipse'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-462984005149806341</id><published>2009-03-30T01:23:00.007+02:00</published><updated>2011-03-03T22:52:30.091+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Enhanced while statement proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;OVERVIEW&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;FEATURE SUMMARY: &lt;/b&gt;&lt;br /&gt;Enhanced while statement allow to iterate through iterator.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR ADVANTAGE: &lt;/b&gt;&lt;br /&gt;People will stop working around for-each loop.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR BENEFIT(s): &lt;/b&gt;&lt;br /&gt;Allow to easy express operation on iterator(s), and iterating over non linear Iterators.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR DISADVANTAGE: &lt;/b&gt;&lt;br /&gt;Automatic loop over Iterator my be problem for some peoples.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ALTERNATIVES: &lt;/b&gt;&lt;br /&gt;Using while loop.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;





  &lt;h5 id="resizableH5" &gt;EXAMPLES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SIMPLE EXAMPLE: &lt;/b&gt;&lt;/p&gt;

&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;String toString(Iterator&amp;lt;String&amp;gt; list){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (!list.hasNext()) &lt;span class='key' &gt;return&lt;/span&gt; "[]";
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder ret = new StringBuilder();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret.append('[').append(list.next());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;while&lt;/span&gt; (String string : list) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret.append(',').append(list.next());&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; ret.append(']').toString();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;ADVANCED EXAMPLE:&lt;/b&gt;&lt;br /&gt; &lt;/p&gt;

&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;String toString(Iterator&amp;lt;Transfer&amp;gt; list){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;while&lt;/span&gt; (Transfer t : list) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;Data&amp;gt; data = new ArrayList&amp;lt;Data&amp;gt;();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; ( t.isOpeningTag() )
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;while&lt;/span&gt; (Transfer t : list){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (t.isClosingTag()) &lt;span class='key' &gt;break&lt;/span&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.add(t.getData());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.remove(); // OK: no interactions
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new Exception("...");
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.remove(); // warning list here can refer to last element of inner loop
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Process chunk 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;

  &lt;h5 id="resizableH5" &gt;DETAILS&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION:&lt;/b&gt;&lt;br /&gt;Same as 
&lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.2"&gt;JLS 14.14.2&lt;/a&gt;, except:
&lt;ul&gt;&lt;li id="resizableLi" &gt;The Expression must either have type Iterator, or a compile-time error occurs.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Let I be the type of the expression Expression&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;If Expression is directly field or variable or parameter (ExpressionVariable) then additional checking is performed:&lt;br /&gt;
If Variable is used as  Expression for while-each loop inside while-each loop over  same Variable then Variable occurring after inner while-each loop (but in outer while-each loop) will compile with warning “Variable state refer to inner loop”.&lt;/p&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;COMPILATION:&lt;/b&gt;&lt;br /&gt;Same as for-each (almost). &lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;TESTING:&lt;/b&gt;&lt;br /&gt;Same as while loops.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;LIBRARY SUPPORT:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFLECTIVE APIS:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OTHER CHANGES:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MIGRATION:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;COMPATIBILITY&lt;/h5&gt;
&lt;p id="resizableP" &gt;Except code, which is only forward compatibility.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;REFERENCES&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;a href="http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000737.html"&gt;Enhanced for each loop iteration control&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-462984005149806341?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/462984005149806341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/enhanced-while-statement-proposal.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/462984005149806341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/462984005149806341'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/enhanced-while-statement-proposal.html' title='Enhanced while statement proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-769817173294429911</id><published>2009-03-27T07:05:00.010+01:00</published><updated>2011-03-03T22:53:42.224+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>'forget' keyword proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;OVERVIEW&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;FEATURE SUMMARY:&lt;/b&gt;&lt;br /&gt;'forget' keyword allows to erase variable from current context, or it means that field should not be used.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR ADVANTAGE:&lt;/b&gt;&lt;br /&gt;This change makes language be more WYSIWYG.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR BENEFIT(s):&lt;/b&gt;&lt;ul&gt;&lt;li id="resizableLi" &gt;
It makes people be able to erase 'variable' from current context, while now it's:
   &lt;ul&gt;&lt;li id="resizableLi" &gt;impossible for final variables (only by comments),&lt;/li&gt;&lt;li id="resizableLi" &gt;
   impossible for arguments (for not final Object we can assign null),&lt;/li&gt;&lt;li id="resizableLi" &gt;
   impossible for fields.&lt;/li&gt;&lt;li id="resizableLi" &gt;
   local fields need more or 'less' artificial blocks (two lines wasted and one indent level).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li id="resizableLi" &gt;
Declaring that variable should not be used, or does not contain valid information for this scope (at current time) will be possible.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Code quality does not fall so drastically after we leave it, comparing to '=null', 'only comments' or 'weird blocks'.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR DISADVANTAGE:&lt;/b&gt;&lt;br /&gt;New keyword == Someone can have declared method/field/variable named 'forget'.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ALTERNATIVES:&lt;/b&gt;&lt;br /&gt;It's already listed.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;




  &lt;h5 id="resizableH5" &gt;EXAMPLES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SIMPLE / ADVANCED EXAMPLE(s):&lt;/b&gt;&lt;/p&gt;
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(final String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(Arrays.toString(args));
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;forget&lt;/span&gt; args;&lt;span class='com' &gt; // 'args' cannot be used anymore&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[] args; &lt;span class='com' &gt; // Error: Duplicate local variable args&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Forget {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; ArrayList&amp;lt;String&amp;gt; criticKeys;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; addKey(String newKey){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;forget&lt;/span&gt; this.criticKeys; &lt;span class='com' &gt;// use synchronized method ONLY&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... // validate 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... // add
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(final String[] arguments) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int sum = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (String s : arguments) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum += Integer.parseInt(s); 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(sum);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;forget s; &lt;span class='com' &gt;// OK&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;forget args; &lt;span class='com' &gt;// OK: arguments variable is final&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;forget sum; &lt;span class='com' &gt;// Error: cannot erase variable it it will still can be used&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(arguments.length); &lt;span class='com' &gt;// Error: erased context&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;



  &lt;h5 id="resizableH5" &gt;DETAILS&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION:&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;forget&lt;/b&gt; VariableIdentifier;&lt;br /&gt;
  or&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;forget&lt;/b&gt; &lt;b&gt;this&lt;/b&gt;. FieldIdentifier;&lt;/p&gt;

&lt;p id="resizableP" &gt;Forbid using given identifier in all followed expressions, in all blocks in which variable could be used in  current method scope.&lt;/p&gt;

&lt;p id="resizableP" &gt;If variable is not final then forget expression cannot occurs in loop block if variable was declared in wider block, it's because variable should not be forgotten if it will be used again.&lt;/p&gt;

&lt;p id="resizableP" &gt;If field is not final than forget expression cannot occurs in any loop block.&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;COMPILATION:&lt;/b&gt;&lt;br /&gt;Variable is not erased (but it can be, if it's not field), it's just protected from access that should not happen for any reason. What's more, handling variable, as if  it still exists, prevents a situation when a programmer creates new variable with the same name and then removes &lt;b&gt;forget&lt;/b&gt; statement.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;TESTING:&lt;/b&gt;&lt;br /&gt;It's the same as testing effects of exiting from the block for variables. For fields, it's just an access control.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;LIBRARY SUPPORT:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFLECTIVE APIS:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OTHER CHANGES:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MIGRATION:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;COMPATIBILITY&lt;/h5&gt;
&lt;p id="resizableP" &gt;New keyword can be problem. There is not other impact.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;REFERENCES&lt;/h5&gt;
&lt;p id="resizableP" &gt;-&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-769817173294429911?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/769817173294429911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/forget-keyword-proposal_27.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/769817173294429911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/769817173294429911'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/forget-keyword-proposal_27.html' title='&apos;forget&apos; keyword proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-8204750400826306447</id><published>2009-03-26T20:44:00.008+01:00</published><updated>2011-03-03T23:16:48.005+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>'final' without explicit type proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;OVERVIEW&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;FEATURE SUMMARY:&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR ADVANTAGE:&lt;/b&gt;&lt;br /&gt;It allows people to concentrate on logic during operating on heavy generics and to use values which are more intuitive for them than variables.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR BENEFIT(s):&lt;/b&gt;&lt;ul&gt;&lt;li id="resizableLi" &gt;
It allows to avoid duplicating unnecessarily types of declaration.&lt;/li&gt;&lt;li id="resizableLi" &gt;
It increase a concentration on 'what I've got' than on 'what type is that' (we decrease size by one to obtain last element index, not because we can do this = it's int), while for variables we still keep concentrate on: 'what type is that' / 'what I can put there'.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Editing existing code to get some value from method chain is easier.&lt;/li&gt;&lt;li id="resizableLi" &gt;
That method can be itself multi-thread with this, but it's a far future.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Using of Generics is easier.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR DISADVANTAGE:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li id="resizableLi" &gt;Certainly, some people will overuse this solution.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Consider operator is easier to read.&lt;/li&gt;&lt;li id="resizableLi" &gt;
It might be a problem if a person does not know how to give proper names for values.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ALTERNATIVES:&lt;/b&gt;&lt;br /&gt;Normal variables.&lt;/p&gt;





&lt;a name='more'&gt;&lt;/a&gt;





  &lt;h5 id="resizableH5" &gt;EXAMPLES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SIMPLE / ADVANCED EXAMPLE:&lt;/b&gt;&lt;/p&gt;
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Map&amp;lt;String,ArrayList&amp;lt;String&amp;gt;&amp;gt; readMaping(){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;final&lt;/span&gt; map = new HashMap&amp;lt;String,ArrayList&amp;lt;String&amp;gt;&amp;gt;();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt;( &lt;span class='key' &gt;final&lt;/span&gt; row : readLine() ){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String key = row.get(0);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row.remove(0);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map.put(key, row);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; map;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Map&amp;lt;String,ArrayList&amp;lt;String&amp;gt;&amp;gt; readMaping(){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;final&lt;/span&gt; map; &lt;span class='com' &gt;//compile time error&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map= new HashMap&amp;lt;String,ArrayList&amp;lt;String&amp;gt;&amp;gt;();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt;( &lt;span class='key' &gt;final&lt;/span&gt; row : readLine() ){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String key = row.get(0);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row.remove(0);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map.put(key, row);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; map;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Final {&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; maping = new HashMap&amp;lt;String, ArrayList&amp;lt;String&amp;gt;&amp;gt;();
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Final {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; maping = (Map&amp;lt;String,ArrayList&amp;lt;String&amp;gt;&amp;gt;)loadMap();
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

  &lt;h5 id="resizableH5" &gt;DETAILS&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION: FieldDeclaration&lt;/b&gt;&lt;br /&gt;
FieldDeclaration would be extended to allow omitting Type declaration if field is final and it's directly followed by assignment of new class instance creation(created object type would be used), or by Anonymous Constructors (JLS 15.9.5.1 )(direct superclass S would be used), or Enum constants preceded by EnumType (JLS 8.9) (Enum type would be used), or CastExpression (JLS 15.16) (ReferenceType would be used).&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION: LocalVariableDeclarationStatement&lt;/b&gt;&lt;br /&gt;
(JLS 14.4) Local Variable Declaration Statements would be extended to allow omitting Type declaration if field is final and listed rules taking place: 
&lt;ul&gt;&lt;li id="resizableLi" &gt;VariableInitializer appears.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Variable is not initialized directly with null (this can be discussed).&lt;/li&gt;&lt;li id="resizableLi" &gt;
VariableInitializer type is neither primitive nor Object.&lt;ul&gt;&lt;li id="resizableLi" &gt;
&lt;b&gt;primitive&lt;/b&gt; : they should not be mixed with Object-s to easy.&lt;/li&gt;&lt;li id="resizableLi" &gt;
&lt;b&gt;Object&lt;/b&gt; : when object type is Object, we mostly deal with situation 'Unknown type', so this should not be hidden.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li id="resizableLi" &gt;
If VariableInitializer -Expression type is intersection type (we always omit Object type in intersection), then:
&lt;ul&gt;&lt;li id="resizableLi" &gt;
  If intersected types have common ancestor then this ancestor is used as type.&lt;/li&gt;&lt;li id="resizableLi" &gt;
  If effect of intersected types is one Interface, then this interface is used as type.&lt;/li&gt;&lt;li id="resizableLi" &gt;
  In other way, an error occurs.&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;

&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;COMPILATION:&lt;/b&gt;&lt;br /&gt;
Just as today, value type only need to be determined.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;TESTING:&lt;/b&gt;&lt;br /&gt;The same as final-s variables.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;LIBRARY SUPPORT:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFLECTIVE APIS:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OTHER CHANGES:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MIGRATION:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;COMPATIBILITY&lt;/h5&gt;
&lt;p id="resizableP" &gt;Only code is no forward compatible.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;REFERENCES&lt;/h5&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;
&lt;a href="http://bugs.sun.com/view_bug.do?bug_id=4459053"&gt;RFE: Add Immutable types to Java&lt;/a&gt;&lt;/li&gt;&lt;li id="resizableLi" &gt;
&lt;a href="http://bugs.sun.com/view_bug.do?bug_id=4983159"&gt;Typedef (alias)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-8204750400826306447?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/8204750400826306447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/final-without-explicit-type-proposal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/8204750400826306447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/8204750400826306447'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/final-without-explicit-type-proposal.html' title='&apos;final&apos; without explicit type proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-6725563435971845020</id><published>2009-03-20T15:02:00.007+01:00</published><updated>2011-03-03T23:17:25.836+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Glue classes proposal 0.9</title><content type='html'>&lt;h5 id="resizableH5" &gt;OVERVIEW&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;FEATURE SUMMARY:&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;
Glue classes allow to link utils direct with objects.

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR ADVANTAGE:&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;
Forgotten functionality can be not such big deal now.

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR BENEFIT(s):&lt;/b&gt;&lt;ul&gt;&lt;li id="resizableLi" &gt;
New functions can be easy localized (critically important while introduce new peoples into project).&lt;/li&gt;&lt;li id="resizableLi" &gt;
Security: glue class do not see anything &lt;b&gt;protected&lt;/b&gt;.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Light binding new functions with existing classes.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Number of used classes reduction.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Allow to assign methods and functions(static methods) to arrays, classes, interfaces, …&lt;/li&gt;&lt;li id="resizableLi" &gt;
It's proof against same method occurs in class and delegator as well like in two delegators.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Allow to link gained(.jar) logic with new one, witch is impossible before final developer implements his classes.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Allow to project compact interfaces and do not worry about additional logic.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR DISADVANTAGE:&lt;/b&gt;&lt;br /&gt;Do not know any ;) sorry.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ALTERNATIVES:&lt;/b&gt;&lt;br /&gt;Utils classes, more work on project, duplicated code...&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;





  &lt;h5 id="resizableH5" &gt;EXAMPLES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SIMPLE EXAMPLE:&lt;/b&gt;&lt;/p&gt;

Now time:
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; base {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &amp;lt;T&amp;gt; T[] flatten(T[][] &lt;span class='key' &gt;this&lt;/span&gt;) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int length = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (T[] subArray : &lt;span class='key' &gt;this&lt;/span&gt;) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;length += subArray.length;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T[] ret = (T[]) Array.newInstance(&lt;span class='key' &gt;this&lt;/span&gt;.getClass().getComponentType().getComponentType(), length);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int pos = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (T[] subArray : &lt;span class='key' &gt;this&lt;/span&gt;) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.arraycopy(subArray, 0, ret, pos, subArray.length);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos += subArray.length;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; ret;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;
Now time(usage):
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Integer[][] array = new Integer[][] { { 1, 2, 3, 4 }, { 5, 6, 7 }, {}, { 9, 0 } };
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(Arrays.toString(base.flatten(array)));
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;



Glue:
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public class&lt;/span&gt; base&amp;lt;T&amp;gt; &lt;span class='key' &gt;glue&lt;/span&gt;( T[][] ) {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public glue&lt;/span&gt; T[] flatten( &lt;span class='key' &gt;this&lt;/span&gt;) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int length = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (T[] subArray : &lt;span class='key' &gt;this&lt;/span&gt;) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;length += subArray.length;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T[] ret = (T[]) Array.newInstance(&lt;span class='key' &gt;this&lt;/span&gt;.getClass().getComponentType().getComponentType(), length);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int pos = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (T[] subArray : &lt;span class='key' &gt;this&lt;/span&gt;) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.arraycopy(subArray, 0, ret, pos, subArray.length);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos += subArray.length;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; ret;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;

Glue(usage):
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Integer[][] array = new Integer[][] { { 1, 2, 3, 4 }, { 5, 6, 7 }, {}, { 9, 0 } };
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(array..flatten()..toString());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;ADVANCED EXAMPLE:&lt;/b&gt;&lt;/p&gt;

Now time:
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; base {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &amp;lt;T&amp;gt; int addAll( ArrayList&amp;lt;T&amp;gt; &lt;span class='key' &gt;this&lt;/span&gt;, Iterator&amp;lt;? &lt;span class='key' &gt;extends&lt;/span&gt; T&amp;gt; iterator) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int added = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;while&lt;/span&gt; (iterator.hasNext()) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;added += &lt;span class='key' &gt;this&lt;/span&gt;.add(iterator.next()) ? 1 : 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; added;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &amp;lt;T, E &lt;span class='key' &gt;extends&lt;/span&gt; T&amp;gt; int addAll(ArrayList&amp;lt;T&amp;gt; &lt;span class='key' &gt;this&lt;/span&gt;, E[] elements) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int added = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (T t : elements) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;added += &lt;span class='key' &gt;this&lt;/span&gt;.add(t) ? 1 : 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; added;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;


Now time(usage):
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Integer[] add = new Integer[] { 1, 2, 34, 2, 5, };
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;Integer&amp;gt; arrayList = new ArrayList&amp;lt;Integer&amp;gt;();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;Integer&amp;gt; finall = new ArrayList&amp;lt;Integer&amp;gt;();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.addAll(arrayList, add);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.addAll(finall, add);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.addAll(finall,arrayList.iterator());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(finall);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

Glue:
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; base&amp;lt;T&amp;gt; &lt;span class='key' &gt;glue&lt;/span&gt;( ArrayList&amp;lt;T&amp;gt; ){
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public glue&lt;/span&gt; int addAll( &lt;span class='key' &gt;this&lt;/span&gt;, Iterator&amp;lt;? &lt;span class='key' &gt;extends&lt;/span&gt; T&amp;gt; iterator) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int added = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;while&lt;/span&gt; (iterator.hasNext()) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;added += &lt;span class='key' &gt;this&lt;/span&gt;.add(iterator.next()) ? 1 : 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; added;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public glue&lt;/span&gt; &amp;lt;E &lt;span class='key' &gt;extends&lt;/span&gt; T&amp;gt; int addAll( &lt;span class='key' &gt;this&lt;/span&gt;, E[] elements) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int added = 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (T t : elements) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;added += &lt;span class='key' &gt;this&lt;/span&gt;.add(t) ? 1 : 0;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; added;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;

Glue(usage):
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Integer[] add = new Integer[] { 1, 2, 34, 2, 5, };
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;Integer&amp;gt; arrayList = new ArrayList&amp;lt;Integer&amp;gt;();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;Integer&amp;gt; finall = new ArrayList&amp;lt;Integer&amp;gt;();
&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arrayList..addAll(add);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finall..addAll(add);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finall..addAll(arrayList.iterator());
&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(finall);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

Glue second:
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public class&lt;/span&gt; base &lt;span class='key' &gt;glue&lt;/span&gt;( Date )
&lt;br /&gt;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private static&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; SimpleDateFormat&amp;nbsp;&amp;nbsp;sdf&amp;nbsp;&amp;nbsp;= new SimpleDateFormat("yyyy.MM.dd");
&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public glue&lt;/span&gt; String format( &lt;span class='key' &gt;this&lt;/span&gt; ) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;synchronized&lt;/span&gt; (sdf) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; sdf.format(&lt;span class='key' &gt;this&lt;/span&gt;);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private static&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; Date&amp;nbsp;&amp;nbsp;applicationStart&amp;nbsp;&amp;nbsp;= new Date();
&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public static glue&lt;/span&gt; Date applicationStart() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; applicationStart;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;

Glue second(usage):
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(Date..applicationStart()..format());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/code&gt;&lt;/div&gt;

  &lt;h5 id="resizableH5" &gt;DETAILS&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION:&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8"&gt;JLS 8.8:&lt;/a&gt;&lt;br /&gt;
ClassDeclaration:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;NormalClassDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;GlueClassDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;EnumDeclaration&lt;br /&gt;&lt;br /&gt;

GlueClassDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;ClassModifiers&lt;sub&gt;opt&lt;/sub&gt; &lt;b&gt;class&lt;/b&gt; Identifier TypeParameters&lt;sub&gt;opt&lt;/sub&gt; &lt;b&gt;glue&lt;/b&gt; ( GlueFormalParameter ) 
GlueClassBody&lt;br /&gt;&lt;br /&gt;

GlueFormalParameter&lt;br /&gt;
&amp;nbsp;&amp;nbsp;VariableModifiers Type&lt;br /&gt;&lt;br /&gt;

GlueClassBody:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{ GlueClassBodyDeclarations&lt;sub&gt;opt&lt;/sub&gt; }&lt;br /&gt;&lt;br /&gt;

GlueClassBodyDeclarations:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;GlueClassBodyDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;GlueClassBodyDeclarations GlueClassBodyDeclaration&lt;br /&gt;&lt;br /&gt;

GlueClassBodyDeclaration:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;GlueClassMemberDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;StaticInitializer&lt;br /&gt;&lt;br /&gt;

GlueClassMemberDeclaration:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;FieldDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;StaticMethodDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;GlueMethodDeclaration&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;StaticClassDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;InterfaceDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;;&lt;br /&gt;&lt;br /&gt;

GlueMethodDeclaration:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;GlueMethodHeader MethodBody&lt;br /&gt;&lt;br /&gt;

GlueMethodHeader:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;MethodModifiers&lt;sub&gt;opt&lt;/sub&gt; &lt;b&gt;glue&lt;/b&gt; TypeParameters*&lt;sub&gt;opt&lt;/sub&gt; ResultType &lt;b&gt;GlueMethodDeclarator&lt;/b&gt; Throws&lt;sub&gt;opt&lt;/sub&gt;&lt;br /&gt;&lt;br /&gt;

GlueMethodDeclarator:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Identifier ( &lt;b&gt;this&lt;/b&gt;,&lt;sub&gt;*opt&lt;/sub&gt; FormalParameterList&lt;sub&gt;opt&lt;/sub&gt; )&lt;br /&gt;&lt;br /&gt;

*opt: '&lt;b&gt;this&lt;/b&gt;' occurs always and only if glue method is not static.&lt;br /&gt;&lt;br /&gt;

TypeParameters from GlueClassDeclaration are always visible for TypeParameters in GlueMethodHeader (even if method is static).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;


&lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12"&gt;15.12 Method Invocation Expressions&lt;/a&gt;:&lt;br/ &gt;

GlueMethodInvocation:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Primary .. TypeName&lt;sub&gt;opt&lt;/sub&gt; NonWildTypeArguments*&lt;sub&gt;opt&lt;/sub&gt; Identifier ( ArgumentList&lt;sub&gt;opt&lt;/sub&gt; )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;super .. TypeName&lt;sub&gt;opt&lt;/sub&gt; NonWildTypeArguments*&lt;sub&gt;opt&lt;/sub&gt; Identifier ( ArgumentList&lt;sub&gt;opt&lt;/sub&gt; )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;ClassName . super .. TypeName&lt;sub&gt;opt&lt;/sub&gt; NonWildTypeArguments*&lt;sub&gt;opt&lt;/sub&gt; Identifier ( ArgumentList&lt;sub&gt;opt&lt;/sub&gt; )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;TypeName .. TypeName&lt;sub&gt;opt&lt;/sub&gt; NonWildTypeArguments* Identifier ( ArgumentList&lt;sub&gt;opt&lt;/sub&gt; )&lt;br /&gt;&lt;br /&gt;

NonWildTypeArguments* suit TypeParameters in GlueMethodHeader.&lt;br /&gt;&lt;br /&gt;

&lt;/p&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;COMPILATION:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;
If object (except null) is valid for GlueFormalParameter then glue-method can be called for this object.&lt;/li&gt;&lt;li id="resizableLi" &gt;
If type is compatible with  GlueFormalParameter then static glue-method can be called for this type.&lt;/li&gt;&lt;li id="resizableLi" &gt;
For non static methods glued-object is passed as first 'this' parameter.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Compiled method signature contains TypeParameters from GlueClassDeclaration (at start), and it's always static.&lt;/li&gt;&lt;/ul&gt;

&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;TESTING:&lt;/b&gt;&lt;br /&gt;Like simple static methods.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;LIBRARY SUPPORT:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFLECTIVE APIS:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OTHER CHANGES:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MIGRATION:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;COMPATIBILITY&lt;/h5&gt;
&lt;p id="resizableP" &gt;New jars are fully compatible. Code is only backward compatible.
&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;REFERENCES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;a href="http://lasu2string.blogspot.com/2009/03/glue-classes-proposal.html"&gt;Glue classes proposal beta&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lasu2string.blogspot.com/2009/03/glue-classes-proposal-09.html"&gt;Glue classes proposal 0.9&lt;/a&gt;&lt;br /&gt;

&lt;a href="http://bugs.sun.com/view_bug.do?bug_id=4093687"&gt;Extension of 'Interface' definition to include class (static) methods&lt;/a&gt;&lt;br/ &gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-6725563435971845020?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/6725563435971845020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/glue-classes-proposal-09.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6725563435971845020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6725563435971845020'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/glue-classes-proposal-09.html' title='Glue classes proposal 0.9'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-1235420448088631365</id><published>2009-03-15T22:27:00.024+01:00</published><updated>2011-03-03T23:19:11.576+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Return 'this' proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;GENESIS&lt;/h5&gt;
&lt;p id="resizableP" &gt;It's a simplified 'This' type problem, which seems to be too much complicated as for now and need more analyses. Construction is designed not to interact with possibility that 'This' type will be introduced. &lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;OVERVIEW&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;FEATURE SUMMARY:&lt;/b&gt;&lt;br /&gt; It allows the method to return reference to 'this' object.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR ADVANTAGE:&lt;/b&gt;&lt;br /&gt; Simplification of &lt;b&gt;return this;&lt;/b&gt; statement.&lt;br /&gt;'void' can be easy replaced with 'this'.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR BENEFIT(s):&lt;/b&gt; It would prevent NullPointerException, and make some 'builder' like interfaces look really clear and simple. &lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR DISADVANTAGE:&lt;/b&gt;&lt;br /&gt; Returned value cannot be changed while inheritance.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ALTERNATIVES:&lt;/b&gt;&lt;br /&gt; Self-bounded generics, This type.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;





  &lt;h5 id="resizableH5" &gt;EXAMPLES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SIMPLE/ADVANCED EXAMPLE:&lt;/b&gt;&lt;/p&gt;

&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public class&lt;/span&gt; Builder {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;String&lt;/span&gt; text = "";
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public this&lt;/span&gt; add (char c){text+=c;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public this&lt;/span&gt; add (String c){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (c==null){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text +="null";
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return; &lt;span class="com"&gt;// &lt;b&gt;this&lt;/b&gt; will be  returned&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text+=c;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public static void&lt;/span&gt; test(Builder builder) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder.add('.').add("test()").add(':');
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;
package test;&lt;br /&gt;
&lt;br /&gt;
&lt;span class='key' &gt;public class&lt;/span&gt; ReturnThis {&lt;br /&gt;
&lt;br /&gt;
 &lt;span class='key' &gt;public static&lt;/span&gt; Class&amp;lt;?&amp;gt; getTestingReturnType(Object object) throws SecurityException, NoSuchMethodException {&lt;br /&gt;
  &lt;span class='key' &gt;return&lt;/span&gt; object.getClass().getMethod("testing").getReturnType();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 &lt;span class='key' &gt;static class&lt;/span&gt; A { public this testing() {}; }&lt;br /&gt;
&lt;br /&gt;
 &lt;span class='key' &gt;static class&lt;/span&gt; B extends A {}&lt;br /&gt;
&lt;br /&gt;
 &lt;span class='key' &gt;public static void&lt;/span&gt; main(String[] args) throws SecurityException, NoSuchMethodException {&lt;br /&gt;
  System.out.println(getTestingReturnType(new A()));&lt;br /&gt;
  // will print: class test.ReturnThis$A&lt;br /&gt;
&lt;br /&gt;
  System.out.println(getTestingReturnType(new B()));&lt;br /&gt;
  // will print: class test.ReturnThis$B&lt;br /&gt;
 }&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;

&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; A { &lt;span class='key' &gt;public&lt;/span&gt; this test() { } }
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; B &lt;span class='key' &gt;extends&lt;/span&gt; A { }
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;static&lt;/span&gt; Class&amp;lt;?&amp;gt; getReturnedType(Class&amp;lt;?&amp;gt; classs) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;try&lt;/span&gt; {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; classs.getMethod("test").getReturnType();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span class='key' &gt;catch&lt;/span&gt; (SecurityException e) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span class='key' &gt;catch&lt;/span&gt; (NoSuchMethodException e) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; &lt;span class='key' &gt;null&lt;/span&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(getReturnedType(A.class));
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// will print: &lt;span class='key' &gt;class&lt;/span&gt; returnThis.ReturnThis$A
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(getReturnedType((new A()).getClass()));
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// will print: &lt;span class='key' &gt;class&lt;/span&gt; returnThis.ReturnThis$A
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(getReturnedType(B.class));
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// will print: &lt;span class='key' &gt;class&lt;/span&gt; returnThis.ReturnThis$B
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(getReturnedType((new B()).getClass()));
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// will print: &lt;span class='key' &gt;class&lt;/span&gt; returnThis.ReturnThis$B
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;


  &lt;h5 id="resizableH5" &gt;DETAILS&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4"&gt;JLS 8.4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
ResultType:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;Type&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;void&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;this&lt;/b&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;A method declaration either specifies the type of value that the method returns,
uses the keyword &lt;b&gt;void&lt;/b&gt; to indicate that the method does not return a value, or uses the keyword &lt;b&gt;this&lt;/b&gt; to indicate that the method return the reference to 'this' object.&lt;/p&gt; 
&lt;p id="resizableP" &gt;Keyword &lt;b&gt;this&lt;/b&gt; cannot occurs if method is static.&lt;/p&gt;&lt;br /&gt;

&lt;p id="resizableP" &gt;&lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.17"&gt;JLS 14.17&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
ReturnStatement:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt;return&lt;/b&gt; Expression&lt;sub&gt;opt&lt;/sub&gt; ;&lt;/p&gt;
&lt;p id="resizableP" &gt;A &lt;b&gt;return&lt;/b&gt; statement with no Expression must be contained in the body of a
method that is declared, using the keyword &lt;b&gt;void&lt;/b&gt;, not to return any value (§8.4), or in the body of a method that is declared, using the keyword &lt;b&gt;this&lt;/b&gt; , to return this reference (§8...),or in the body of a constructor (§8.8).&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;Method Overriding&lt;/b&gt;:&lt;br /&gt; Method with 'this' as ResultType can be override only with method with the same  ResultType &lt;i&gt; (proposal in this form can be, however, extended to work with backward covariant return types in future)&lt;/i&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;COMPILATION:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt; Method just before exiting from it's scope returns 'this'.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Returned object type is ALWAYS actual object type.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Method in compiled form have special 'this' type as  ResultType, which is exchanged during loading to be actual object type:&lt;p id="resizableP" &gt;
interface A{ this sample(); }&lt;br/ &gt;
interface B extends A {  }&lt;br/ &gt;
class C implements B { this sample(){...};  }&lt;br /&gt;
So compiled classes contain only methods with A and C, but after loading they are extended to ensure that Method.getReturnType() will be always actual object type.

&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;TESTING:&lt;/b&gt;&lt;br /&gt;Most efforts need to be focused on ensuring that Method.getReturnType()  will work in a correct way.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;LIBRARY SUPPORT:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFLECTIVE APIS:&lt;/b&gt;&lt;br /&gt;No: From this perspective methods are simply overridden in runtime.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OTHER CHANGES:&lt;/b&gt;&lt;br /&gt;Javadoc:&lt;br /&gt;
return type is visible as 'this' and linked to current class.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MIGRATION:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;COMPATIBILITY&lt;/h5&gt;
&lt;p id="resizableP" &gt;Backward: full.&lt;br /&gt;
Forward: can be handled like other void type to be partial compatibile.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;REFERENCES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6479372"&gt;Bug: 6479372&lt;/a&gt;&lt;br /&gt;

&lt;a href="http://java.net/cs/user/view/cs_msg/37432"&gt;http://java.net/cs/user/view/cs_msg/37432&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-1235420448088631365?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/1235420448088631365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/return-this-proposal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1235420448088631365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1235420448088631365'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/return-this-proposal.html' title='Return &apos;this&apos; proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-5207927151383046169</id><published>2009-03-14T20:50:00.003+01:00</published><updated>2011-03-03T23:27:41.272+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Read-only &amp; Partial arrays proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;Instrukcje&lt;/h5&gt;
&lt;p id="resizableP" &gt;Tworzenie tablic do odczytu pozwoliło by zwiększyć szybkość jak i bezpieczeństwo pisanych programów. Była by to zwykła tablica tworzona na podstawie już istniejącej bez możliwości modyfikacji jej stanu.&lt;/p&gt;
&lt;p id="resizableP" &gt;Tablice częściowe tworzone na tablicach do odczytu pomogły by zmniejszyć ryzyko popełnienia błędu dostępu do niewłaściwego obszaru tablicy oraz zmniejszyło by zużycie pamięci.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;




  &lt;h5 id="resizableH5" &gt;Przegląd&lt;/h5&gt;
  &lt;p id="resizableP" &gt;&lt;b&gt;Podsumowanie:&lt;/b&gt;&lt;br /&gt;
   Obecnie tablice są jedyną konstrukcją która nie pozwala limitowania dostępu na zapis. Przy tym poziom kontroli nad nimi(min sprawdzanie indeksów) pozwala uważać, że nie powinno stanowić to problemów.&lt;br /&gt;
   Tablice częściowe to bardziej skomplikowana sprawa, gdyż wymaga aby tablica zawierała informacje o rodzicu. Lub wręcz usprawnienia działania GC.&lt;/p&gt;

 &lt;p id="resizableP" &gt;&lt;b&gt;Główne zalety / korzyści:&lt;/b&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;(Read-only) Zwiększenie bezpieczeństwa kodu.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;(Read-only) Oszczędność pamięci.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;(Partial) Zwiększenie bezpieczeństwa kodu.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;(Partial) Możliwość zredukowania konieczności kopiowania tablic do minimum.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;(Partial) Szybkość wydzielenia kawałka tablicy w stosunku do kopiowania.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;





&lt;p id="resizableP" &gt;&lt;b&gt;Najistotniejsze wady:&lt;/b&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Trzeba zaimplementować.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Problem z wyegzekwowaniem braku praw zapisu ze strony JNI.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;(Partial) Konieczność poprawienia GC, bądź liczenia się z tym, że pamięć nie będzie zwalniana.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Inne rozwiązania:&lt;/b&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;ArrayListy tylko do odczytu.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Iteratory.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Kopiowanie tablic.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Każdy konstruktor może zwracać dwa 'obiekty' jeden normalny drugi tylko do odczytu.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;
    

    &lt;h5 id="resizableH5" &gt;Przykłady:&lt;/h5&gt;
&lt;div class='table'&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; array() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int[] array = new int[] { 1, 2, 3, 4 };
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int[] readOnlyArray = array.getReadOnly();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;readOnlyArray[0] = 2; // Exception 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;readOnlyArray = readOnlyArray.getReadOnly(1,2);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(readOnlyArray.length); // will print 1
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;

    &lt;h5 id="resizableH5" &gt;Detale rozwiązania:&lt;/h5&gt;
   &lt;p id="resizableP" &gt;(tablica).getReadOnly() : T[]&lt;br /&gt;
   (tablica).getReadOnly(int from,int to) : T[]&lt;br /&gt;
   (tablica).isReadOnly() : boolean;&lt;/p&gt;
   

    &lt;h5 id="resizableH5" &gt;Kompatybilność wsteczna:&lt;/h5&gt;
   &lt;p id="resizableP" &gt;Zapewniona.&lt;/p&gt;

    &lt;h5 id="resizableH5" &gt;Kompatybilność w przód:&lt;/h5&gt;
   &lt;p id="resizableP" &gt;Trudno powiedzieć.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;Linki:&lt;/h5&gt;


   &lt;ul&gt; &lt;li id="resizableLi" &gt;&lt;a href="http://bugs.sun.com/view_bug.do?bug_id=4888066"&gt;Bug 4888066&lt;/a&gt;&lt;/li&gt;
   &lt;li id="resizableLi" &gt;&lt;a href="http://www.cs.uwm.edu/~boyland/papers/readonly-talk.pdf"&gt;Why We Should Not Add ‘‘Read-Only’’ to Java (yet)&lt;/a&gt;&lt;/li&gt;
   &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-5207927151383046169?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/5207927151383046169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/read-only-partial-arrays-proposal.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/5207927151383046169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/5207927151383046169'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/read-only-partial-arrays-proposal.html' title='Read-only &amp; Partial arrays proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-9189247537537353140</id><published>2009-03-12T20:47:00.006+01:00</published><updated>2011-03-06T20:51:14.526+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Glue classes proposal beta</title><content type='html'>&lt;h5 id="resizableH5" &gt;OVERVIEW&lt;/h5&gt;
&lt;p id="resizableP" &gt;Notice that it's beta specification: it's not described in full details, half validated (translation), and it's provided for you to pre-analyse. I still need some time to provide syntax which fully supports generics. Multi-glue classes are under consideration as well, but this may occur to be to complex to handle by any earth living programmer.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;FEATURE SUMMARY:&lt;/b&gt;&lt;br /&gt;Glue classes allow to link utils direct with objects.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR ADVANTAGE:&lt;/b&gt;&lt;br /&gt;Forgotten functionality can be not such big deal now.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR BENEFIT(s):&lt;/b&gt;&lt;ul&gt;&lt;li id="resizableLi" &gt;
New functions can be easy localised (critically important while introduce new peoples into project).&lt;/li&gt;&lt;li id="resizableLi" &gt;
Security: glue class do not see anything &lt;b&gt;protected&lt;/b&gt;.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Light binding new functions with existing classes.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Number of used classes reduction.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Allow to assign methods and functions(static methods) to arrays, classes, interfaces, …&lt;/li&gt;&lt;li id="resizableLi" &gt;
It's proof against same method occurs in class and delegator as well like in two delegators.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Allow to link gained(.jar) logic with new one, witch is impossible before final developer implements his classes.&lt;/li&gt;&lt;li id="resizableLi" &gt;
Allow to project compact interfaces and do not worry about additional logic.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR DISADVANTAGE:&lt;/b&gt;&lt;br /&gt;Do not know any ;) sorry.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ALTERNATIVES:&lt;/b&gt;&lt;br /&gt;Utils classes.&lt;/p&gt;





&lt;a name='more'&gt;&lt;/a&gt;





  &lt;h5 id="resizableH5" &gt;EXAMPLES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SIMPLE EXAMPLE:&lt;/b&gt;
&lt;div class='table'&gt;&lt;code&gt;&lt;span class='key' &gt;public class&lt;/span&gt; base &lt;span class='key' &gt;glue&lt;/span&gt; &amp;lt;? &lt;span class='key' &gt;extends&lt;/span&gt; Date&amp;gt;
&lt;br /&gt;{
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private static final&lt;/span&gt; SimpleDateFormat&amp;nbsp;&amp;nbsp;sdf&amp;nbsp;&amp;nbsp;= new SimpleDateFormat("yyyy.MM.dd");

&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; String format(This this) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;synchronized&lt;/span&gt; (sdf) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; sdf.format(this);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}

&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private static final&lt;/span&gt; Date applicationStart = &lt;span class='key' &gt;new&lt;/span&gt; Date();

&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public static&lt;/span&gt; Date applicationStart() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; applicationStart;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}

&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;

&lt;ul&gt;&lt;li id="resizableLi" &gt;
base: logic name, should start with lowercase because it's representing logic not class.&lt;/li&gt;&lt;li id="resizableLi" &gt;
&lt;span class='key' &gt;glue&lt;/span&gt; &amp;lt;? &lt;span class='key' &gt;extends&lt;/span&gt; Date&amp;gt;: logic will glue to all classes extending Date.&lt;/li&gt;&lt;li id="resizableLi" &gt;
.format(This this): method that will be 'visible' for declared objects.&lt;/li&gt;&lt;li id="resizableLi" &gt;
This: Object type representing this.getClass()&lt;/li&gt;&lt;li id="resizableLi" &gt;
this: equivalent with given bound (? extends Date).&lt;/li&gt;&lt;/ul&gt;
&lt;b&gt;Usage&lt;/b&gt;:&lt;br /&gt;
&lt;div class='table'&gt;&lt;code&gt;import java.util.Date;
&lt;br /&gt;import pl.some.utils.base; &lt;span class='com' &gt;// imported to allow ..format() execution&lt;/span&gt;

&lt;br /&gt;&lt;br /&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Test {

&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; test_0(Date date) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(date..format()); &lt;span class='com' &gt;//simple usage&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}

&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; test_1(Date date) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(date..base.format()); &lt;span class='com' &gt;//used when we have more logics with same methods&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;

&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; test_2(Date date) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(date..pl.some.utils.base.format()); &lt;span class='com' &gt;// full declaration&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}

&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; test_3() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(Date..applicationStart()..format()); &lt;span class='com' &gt;// mixed case&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}

&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;ADVANCED EXAMPLE:&lt;/b&gt;&lt;br /&gt;
Will come...&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;DETAILS&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION:&lt;/b&gt;&lt;br /&gt;
JLS 8.8: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8
ClassDeclaration:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;NormalClassDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;GlueClassDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;EnumDeclaration&lt;br /&gt;&lt;br /&gt;

GlueClassDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;ClassModifiers&lt;sub&gt;opt&lt;/sub&gt; &lt;b&gt;class&lt;/b&gt; Identifier &lt;b&gt;glue&lt;/b&gt;&amp;lt;ActualTypeArgument&amp;gt; 
GlueClassBody&lt;br /&gt;&lt;br /&gt;

ActualTypeArgument&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(JLS 4.5.1) represent objects for witch glue works: &amp;lt;? extends Date&amp;gt;, &amp;lt;Date&amp;gt;, &amp;lt;Object[][]&amp;gt;, ...&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;COMPILATION:&lt;/b&gt;&lt;br /&gt; Everything we need is already in JDK, we just need little trick to bind static method in compilation time with existing classes.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;TESTING:&lt;/b&gt;&lt;br /&gt;Like simple static methods.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;LIBRARY SUPPORT:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFLECTIVE APIS:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OTHER CHANGES:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MIGRATION:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;COMPATIBILITY&lt;/h5&gt;
&lt;p id="resizableP" &gt;New jars are fully compatible. Code is only backward compatible. &lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;REFERENCES&lt;/h5&gt;
&lt;p id="resizableP" &gt;Glue classes proposal beta: http://lasu2string.blogspot.com/2009/03/glue-classes-proposal.html&lt;/p&gt;


&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;


&lt;p id="resizableP" &gt;Krucjata przeciwko dziedziczeniu. Wyprawa 2.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;Instrukcje&lt;/h5&gt;
&lt;p id="resizableP" &gt;Zapewne nie raz zdarzyło się wam pisać metody do już istniejących klas. Jeśli klasa nie pochodziła z 'zewnętrznych' bibliotek to pół biedy, co się dzieje jeśli jednak pochodzi?
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Dziedziczymy? Ależ oczywiście, że tak.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Metody statyczne? I to porozrzucane po całym projekcie.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Lub po prostu więcej kodu.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;Efekty nie są przyjemne. Zwiększenie komplikacji samego kodu, jego logiki, oraz struktury klas. Nie raz zdarza się, że nowy pracownik pisze rzeczy już napisane ponieważ nie potrafi ich zlokalizować.&lt;/p&gt;
&lt;p id="resizableP" &gt;Rozważmy klasy które zamiast gromadząc statyczne metody &lt;b&gt;doklejała&lt;/b&gt; by je do już istniejącej klasy.&lt;/p&gt;
&lt;p id="resizableP" &gt;Wyobraźmy sobie sytuacje gdy przy obiekcie &lt;b&gt;Date&lt;/b&gt; po postawieniu kropki obok standardowych metod wyświetlają się nam:&lt;br /&gt;
&lt;div class='table'&gt;&lt;code&gt;..sformatujDoBazyDanych() : String&lt;/code&gt;&lt;/div&gt;
&lt;div class='table'&gt;&lt;code&gt;..sformatujDoWyświetlenia() : String&lt;/code&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;Sytuacja staje się na tyle jasna, że nawet nowo przybyły pracownik wie co ma robić. Ile czasu oszczędziło by to już paracującym? Oraz ograniczyło ilość używanych klas w kodzie.&lt;/p&gt;
&lt;p id="resizableP" &gt;Ciekawym rozwiązaniem może być także doklejanie metod do &lt;b&gt;interfejsów&lt;/b&gt;.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;Przykładowe schematy obrazujące przyklejone klasy.&lt;/h5&gt;


&lt;img class='border-left' src='http://alan.umcs.lublin.pl/~lasu/blog/lasu2string/Glue/classWithStatic.png'/&gt; Klasa z metodami statycznymi &lt;br /&gt;&lt;br /&gt;
&lt;img class='border-left' src='http://alan.umcs.lublin.pl/~lasu/blog/lasu2string/Glue/class.png'/&gt; Zwykła klasa &lt;br /&gt;&lt;br /&gt;

&lt;table class='classic' width='100%'&gt;
&lt;tr&gt;&lt;th&gt;Klasy przyklejone&lt;/th&gt;&lt;th&gt;Klasyczne metody podejścia&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&lt;img class='border-left' src='http://alan.umcs.lublin.pl/~lasu/blog/lasu2string/Glue/class1Glue.png'/&gt; Klasa + klasa przyklejona.&lt;/td&gt;
  &lt;td&gt;&lt;img class='border-left' src='http://alan.umcs.lublin.pl/~lasu/blog/lasu2string/Glue/class_static.png'/&gt; Klasa + klasa pomocnicza z metodami statycznymi.&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;
  &lt;td&gt;&lt;img class='border-left' src='http://alan.umcs.lublin.pl/~lasu/blog/lasu2string/Glue/class2Glue.png'/&gt; Klasa + dwie klasy przyklejone.&lt;/td&gt;
  &lt;td&gt;&lt;img class='border-left' src='http://alan.umcs.lublin.pl/~lasu/blog/lasu2string/Glue/class_static_suc.png'/&gt; Klasa + klasa pomocnicza z metodami statycznymi + dziedziczenie.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;&lt;img class='border-left' src='http://alan.umcs.lublin.pl/~lasu/blog/lasu2string/Glue/class4Glue.png'/&gt; Klasa + cztery klasy przyklejone.&lt;/td&gt;
  &lt;td&gt;&lt;img class='border-left' src='http://alan.umcs.lublin.pl/~lasu/blog/lasu2string/Glue/class_2static_suc.png'/&gt; Klasa + dwie klasy pomocnicze z metodami statycznymi + dziedziczenie.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;/table&gt;


  &lt;h5 id="resizableH5" &gt;Przegląd&lt;/h5&gt;

  &lt;br /&gt;&lt;b&gt;Główne zalety / korzyści:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Szybka &lt;b&gt;lokalizacja&lt;/b&gt; nowych funkcjonalności.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;&lt;b&gt;'Lekkie'&lt;/b&gt; wiązania nowych funkcji z istniejącymi klasami.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Znaczna &lt;b&gt;redukcja&lt;/b&gt; ilości używanych klas.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Umożliwia podpięcie statycznych metod pod interfejsy.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Umożliwia 'bezpieczne' rozszerzenie klas finalnych.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Umożliwia tworzenie zwięzłych klas(nie trzeba od razu pamiętać o wszystkich funkcjach).&lt;/li&gt;
   &lt;/ul&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Najistotniejsze wady:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Określenie sposobu selektywnego wyłączania przyklejonych klas.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Inne rozwiązania:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Modlitwa ;) .&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Nie zatrudniać nowych ludzi.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;
    

  &lt;b&gt;Podsumowanie:&lt;/b&gt;&lt;br /&gt;




    &lt;h5 id="resizableH5" &gt;Przykłady:&lt;/h5&gt;


&lt;div class='table'&gt;&lt;code&gt;… glue class DisplayDate extends Date{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;private static final SimpleDateFormat sdf &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=new SimpleDateFormat("yyyy.MM.dd");&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;public glue String format(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;synchronized (sdf) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.format(this);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
Wywołanie:&lt;br /&gt;
&lt;div class='table'&gt;&lt;code&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;...(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Date cur = new Date();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;return cur..format();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;
&lt;div class='table'&gt;&lt;code&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;...(){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Date cur = new Date();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;return cur..DisplayDate.format();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;



  &lt;h5 id="resizableH5" &gt;Detale rozwiązania:&lt;/h5&gt;

   &lt;p id="resizableP" &gt;&lt;b&gt;this&lt;/b&gt; reprezentuje klasę + interfejsy warunkujące doklejanie.&lt;/p&gt;
  &lt;p id="resizableP" &gt;Do rozważenia są także metody potrafiące się doklejać do więcej niż jednej klasy...&lt;/p&gt;
   &lt;p id="resizableP" &gt;Dodatkowo nie należy zapominać, że metody statyczne też powinny mieć możliwość warunkowego doklejania.&lt;/p&gt;
  &lt;p id="resizableP" &gt;Metody doklejane nie powinny mieć dostępu do prywatnych pól i metod.&lt;/p&gt;
  



   &lt;h5 id="resizableH5" &gt;Kompatybilność:&lt;/h5&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;Wsteczna:&lt;/b&gt;&lt;br /&gt;Pełna.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;W przód:&lt;/b&gt;&lt;br /&gt;Brak.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-9189247537537353140?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/9189247537537353140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/glue-classes-proposal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/9189247537537353140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/9189247537537353140'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/glue-classes-proposal.html' title='Glue classes proposal beta'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-1802239296293611416</id><published>2009-03-11T20:19:00.025+01:00</published><updated>2011-03-04T15:41:45.199+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Consider operator proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;OVERVIEW&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;FEATURE SUMMARY:&lt;/b&gt;&lt;br /&gt;Consider operator extends language with full value support and assign value to name and return it.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR ADVANTAGE:&lt;/b&gt;&lt;br /&gt;It introduces natural division in variables and values.&lt;/p&gt;

It makes language to be more natural for human and generics easier to use. 

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR BENEFIT(s):&lt;/b&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;If we need to get a value, we can do that quite simple (without splitting expression or duplicating code).&lt;/li&gt;
&lt;li id="resizableLi" &gt;Decrease number of potential bugs (value cannot be assigned).&lt;/li&gt;
&lt;li id="resizableLi" &gt;It can help in splitting code to proper parts; nowdays, we need to declare variable regardless we need it or not (or make it final).&lt;/li&gt;
&lt;li id="resizableLi" &gt;Decrease size of  unnecessary code.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Method can be itself multi-thread with this, but it's far future.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR DISADVANTAGE:&lt;/b&gt;&lt;br /&gt; Possibility to be unclear at start.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ALTERNATIVES:&lt;/b&gt;&lt;br /&gt;Some time 'final' variables can be used, but it's more like for-each, life is better with it.&lt;/p&gt;





&lt;a name='more'&gt;&lt;/a&gt;






  &lt;h5 id="resizableH5" &gt;EXAMPLES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SIMPLE EXAMPLE:&lt;/b&gt;
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; standard(Resource&amp;lt;String,Container&amp;lt;Unit&amp;gt;&amp;gt; resource) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Comparator&amp;lt;Resource&amp;lt;String,Container&amp;lt;Unit&amp;gt;&amp;gt;&amp;gt; resourceComparator
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= (standard? Resource.baseComparator : Resource.extdComparator);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (resourceComparator.compare(resource,this.last)==0) &lt;span class='key' &gt;return&lt;/span&gt;; // duplicate
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}

&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; consider(Resource&amp;lt;String,Container&amp;lt;Unit&amp;gt;&amp;gt; resource) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(standard? Resource.baseComparator : Resource.extdComparator) :: resourceComparator;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (resourceComparator.compare(resource,this.last)==0) &lt;span class='key' &gt;return&lt;/span&gt;; // duplicate
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}

&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; standard_2(ArrayList&amp;lt;Resource&amp;lt;String,Container&amp;lt;Unit&amp;gt;&amp;gt;&amp;gt; resources){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (Resource&amp;lt;String,Container&amp;lt;Unit&amp;gt;&amp;gt; resource: resources){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(resource);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; consider_2(ArrayList&amp;lt;Resource&amp;lt;String,Container&amp;lt;Unit&amp;gt;&amp;gt;&amp;gt; resources){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (::resource:resources){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(resource);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ADVANCED EXAMPLE:&lt;/b&gt;&lt;br /&gt;
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; validLastElementState(ArrayList&amp;lt;Data&amp;gt; list){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (list.get(list.size()::size-1)::data.reportStare().getState()!=validState){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;throw new&lt;/span&gt; IllegalStateException(Data.class.getSimpleName()+"("+data+") of "+size+" elements is in wrong "+State.class.getSimpleName());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... other operations ...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;


&lt;b&gt;Would be compiled to&lt;/b&gt;:
&lt;div class='table'&gt;&lt;code&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; validLastElementState(ArrayList&amp;lt;Data&amp;gt; list){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.size()::size;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.get(size-1)::data
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (data.reportStare().getState()!=validState){ 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new IllegalStateException(
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data.class.getSimpleName()+"("+data+") of "+size+" elements is in wrong "+State.class.getSimpleName()); 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;... other operations ... 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;DETAILS&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION:&lt;/b&gt;&lt;br /&gt;Value :: name&lt;br /&gt;
Assign left side value to given name and return it.&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.2"&gt;JLS 14.14.2&lt;/a&gt;&lt;br /&gt;
EnhancedForStatement:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;for&lt;/b&gt; ( VarDeclaration : Expression) Statement&lt;br /&gt;&lt;br /&gt;

VarDeclaration: al least one of&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VariableDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ValueDeclaration&lt;br /&gt;&lt;br /&gt;

VariableDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VariableModifiersopt Type Identifier&lt;br /&gt;&lt;br /&gt;

ValueDeclaration&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:: ValueName&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;COMPILATION:&lt;/b&gt;&lt;br /&gt; While value is same as final variable compiling is not big problem.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;TESTING:&lt;/b&gt;&lt;br /&gt;Same as final variable.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;LIBRARY SUPPORT:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFLECTIVE APIS:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OTHER CHANGES:&lt;/b&gt;&lt;br /&gt;No.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MIGRATION:&lt;/b&gt;&lt;br /&gt;No need.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;COMPATIBILITY&lt;/h5&gt;
&lt;p id="resizableP" &gt;Compiled code can be normally executed. &lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;REFERENCES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;a href="http://lasu2string.blogspot.com/2009/03/consider-operator-proposal.html"&gt;Consider operator proposal&lt;/a&gt;&lt;/p&gt;









  &lt;h5 id="resizableH5" &gt;Instrukcje&lt;/h5&gt;
&lt;p id="resizableP" &gt;Człowiek nie myśli sekwencyjnie, tak więc i pisanie sekwencyjnych algorytmów nie jest czymś zupełnie naturalnym dla niego. Dlatego założenie, że sekwencyjny algorytm będzie czytać się łatwo jest co najmniej nie trafione.&lt;/p&gt;
&lt;p id="resizableP" &gt;Proponowany operator '&lt;b&gt;::&lt;/b&gt;' ma ułatwić myślenie o wynikach jak o wynikach a nie zmiennych, a wiązał by on wartość z nawą: &lt;b&gt;wartość::nazwa&lt;/b&gt;, &lt;b&gt;(wartość po ktorej możemy iterować):::(nazwa wartości iterowanych)&lt;/b&gt; bądź &lt;b&gt;wartość::nazwa::{blok w którym obowiązuje wartość}&lt;/b&gt;. Nie należy zapominać że pewnym ukłonem (bardzo sensownym zresztą) w te stroną są 'zmienne' final.&lt;/p&gt;
&lt;p id="resizableP" &gt;Aby w pełni zrozumieć sytuacje przyjrzyjmy tytułowi jednego z rozdziałów JLS: „Types, Values, and Variables” wygląda pięknie jednak nie do końca odpowiada rzeczywistości która rysuję się raczej jak: „Types, Variables and their Values”, gdyż tak naprawdę wartości są tylko częściowo wspierane przez Jave. 'Zawężenie' myślenia  do kategorii zmiennych wynika z asemblera i obecnie znacznie ogranicza nas przed myśleniem o niektórych bytach jako lokalnie nie zmiennych (wartość  nie może się zmienić).&lt;/p&gt;
  &lt;h5 id="resizableH5" &gt;Jak wyglądała by Java wspierająca wartości:&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;Częściowo&lt;/b&gt;(czyli tak jak obecnie) :&lt;br /&gt;
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; validLastElementState(ArrayList&amp;lt;Data&amp;gt; list) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int size = list.size();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data data = list.get(size - 1);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (data.reportStare().getState()!=validState){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;throw new&lt;/span&gt; IllegalStateException(Data.class.getSimpleName()+"("+data+") of "+size+" elements is in wrong "+State.class.getSimpleName());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... other operations ...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt; &lt;/p&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;W ogóle (+/-)&lt;/b&gt; :&lt;br /&gt;
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; validLastElementState(ArrayList&amp;lt;Data&amp;gt; list) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int size = list.size();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int position =size -1;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Data data = list.get(position);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StateReporter stateReporter = data.reportStare();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;State state = stateReporter.getState();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (state!=validState){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;throw new&lt;/span&gt; IllegalStateException(Data.class.getSimpleName()+"("+data+") of "+size+" elements is in wrong "+State.class.getSimpleName());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... other operations ...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt; &lt;/p&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;W pełni&lt;/b&gt; :&lt;br /&gt;
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; validLastElementState(ArrayList&amp;lt;Data&amp;gt; list){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (list.get(list.size()::size-1)::data.reportStare().getState()!=validState){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;throw new&lt;/span&gt; IllegalStateException(Data.class.getSimpleName()+"("+data+") of "+size+" elements is in wrong "+State.class.getSimpleName());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... other operations ...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt; &lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Przegląd&lt;/h5&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;Główne zalety / korzyści:&lt;/b&gt;
   &lt;ul&gt;
   &lt;li id="resizableLi" &gt;Naturalny zapis algorytmów bez niepotrzebnych rozbić tylko dla wyciągnięcia zmiennej.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Możliwość naturalnego rozbicia odpowiednio napisanych metod na wiele wątków(daleka przyszłość).&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Mniejsza ilość bugów.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Ułatwia rozdzielenie kodu na więcej mniejszych linijek (nie trzeba deklarować zmiennych).&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Mniejsza ilość niepotrzebnego kodu.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Najistotniejsze wady:&lt;/b&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Dla niektórych taki zapis może być czymś problematycznym.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Konieczność rozważenia widoczności wartości.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Pewnym problemem może być fakt, że w warunkach logicznych &amp;&amp; operator '::' mógłby znajdować się tylko z lewej strony wyrażenia (prawa może zostać pominięta).&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Inne rozwiązania:&lt;/b&gt;
   &lt;ul&gt;
   &lt;li id="resizableLi" &gt;Używanie 'zmiennych' &lt;b&gt;final&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
    

&lt;p id="resizableP" &gt;&lt;b&gt;Podsumowanie:&lt;/b&gt;&lt;br /&gt;
Powyższe rozwiązanie nie wprowadza do języka nic nowego, pozwala jednak zapisywać algorytmy w sposób bardziej naturalny/intuicyjny. Nie należy zapominać iż daje także możliwość większego 'narzygania' do kodu.&lt;/p&gt;




    &lt;h5 id="resizableH5" &gt;Przykłady:&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;W pełni&lt;/b&gt; :&lt;br /&gt;
&lt;div class='table'&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; validLastElementState(ArrayList&amp;lt;Data&amp;gt; list){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.size()::size;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.get(size-1)::data
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (data.reportStare().getState()!=validState){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;throw new&lt;/span&gt; IllegalStateException(Data.class.getSimpleName()+"("+data+") of "+size+" elements is in wrong "+State.class.getSimpleName());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;... other operations ...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt; &lt;/p&gt;

&lt;div class='table'&gt;&lt;code&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; printAll(ArrayList&amp;lt;ArrayList&amp;lt;SomeGeneric&amp;lt;String, Integer&amp;gt;&amp;gt;&amp;gt; param) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (ArrayList&amp;lt;SomeGeneric&amp;lt;String, Integer&amp;gt;&amp;gt; l1 : param) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (SomeGeneric&amp;lt;String, Integer&amp;gt; l2 : l1) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(l2);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l2=null;//ok
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; printAll(ArrayList&amp;lt;ArrayList&amp;lt;SomeGeneric&amp;lt;String, Integer&amp;gt;&amp;gt;&amp;gt; param) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (param:::l1) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (l1:::l2) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(l2);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l2 = &lt;span class='key' &gt;null&lt;/span&gt;;//error
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;





  &lt;h5 id="resizableH5" &gt;Detale rozwiązania: &lt;/h5&gt;
&lt;p id="resizableP" &gt;Wartość sama z siebie nie może się zmienić, gdyż była by inną wartością, a co za tym idzie wszelkie próby podstawienia kończyły by się błedem w czasie kompilacji.&lt;/p&gt;




   &lt;h5 id="resizableH5" &gt;Kompatybilność:&lt;/h5&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;Wsteczna:&lt;/b&gt;&lt;br /&gt;Pełna.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;W przód:&lt;/b&gt;&lt;br /&gt;Brak.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-1802239296293611416?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/1802239296293611416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/consider-operator-proposal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1802239296293611416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1802239296293611416'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/consider-operator-proposal.html' title='Consider operator proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-1695024951801543174</id><published>2009-03-10T19:47:00.000+01:00</published><updated>2011-03-04T17:03:22.986+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Delegation proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;OVERVIEW&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;FEATURE SUMMARY:&lt;/b&gt;&lt;br /&gt;This change allow to delegate methods, interfaces and classes.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR ADVANTAGE:&lt;/b&gt;&lt;br /&gt;It would be a first step for programmers to have something instead of inheritance, allowing to write better code.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR BENEFITS:&lt;/b&gt;&lt;br /&gt;Java looks incomplete without something so base as delegating. Others are:
&lt;ul&gt;&lt;li id="resizableLi" &gt;Code more immune for changes(if interface changes, there will be not so much to change, or I would say, changes will be on the right place, but not on all projects)&lt;/li&gt;
&lt;li id="resizableLi" &gt;Decreasing costs of code modification.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Explicit defining &lt;i&gt;MethodModifiers&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MAJOR DISADVANTAGE:&lt;/b&gt;&lt;br /&gt;Changes cost.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ALTERNATIVES:&lt;/b&gt;&lt;br /&gt;It's nothing that cannot be implemented in a simple way, but this change does not increase delegation complex, unreadablity, and costs of support with each method.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;


  &lt;h5 id="resizableH5" &gt;EXAMPLES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SIMPLE EXAMPLE:&lt;/b&gt;&lt;br /&gt;&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; ClassA &lt;span class='key' &gt;implements&lt;/span&gt; InterfaceA {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;InterfaceA ia = ...;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; delegate InterfaceA{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; ia;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}
&lt;/div&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;ADVANCED EXAMPLE:&lt;/b&gt;&lt;br /&gt;&lt;div class='table'&gt; &lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; ClassA &lt;span class='key' &gt;implements&lt;/span&gt; InterfaceA {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;ClassSome cs = ... ; // ClassSome &lt;span class='key' &gt;implements&lt;/span&gt; InterfaceA, InterfaceB, InterfaceC
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;Some some = ... ; // have the same methods from InterfaceA and InterfaceC but &lt;span class='key' &gt;do&lt;/span&gt; not &lt;span class='key' &gt;implements&lt;/span&gt; them
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; delegate ClassSome exclude Object,InterfaceB{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (cs==null) &lt;span class='key' &gt;return&lt;/span&gt; some; 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; cs;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}&lt;/div&gt;&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;DETAILS&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;SPECIFICATION:&lt;/b&gt;&lt;br /&gt;

DelegationDeclaration:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DelegationHeader DelegationBody&lt;br /&gt;&lt;br /&gt;

DelegationHeader:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DelegationModifiers&lt;sub&gt;opt&lt;/sub&gt; &lt;b&gt;delegate&lt;/b&gt; MethodSets Exclude&lt;sub&gt;opt&lt;/sub&gt; Throws&lt;sub&gt;opt&lt;/sub&gt;  DelegationDeclarator&lt;br /&gt;&lt;br /&gt;

DelegationModifiers:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DelegationModifier&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DelegationModifiers DelegationModifier&lt;br /&gt;&lt;br /&gt;

DelegationModifier: &lt;i&gt;one of&lt;/i&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Annotation &lt;b&gt;public protected private abstract static final synchronized&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;

Exclude:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;exclude&lt;/b&gt; MethodSets&lt;br /&gt;&lt;br /&gt;

MethodSets:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MethodSet&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MethodSets, MethodSet&lt;br /&gt;&lt;br /&gt;

MethodSet: &lt;i&gt;one of&lt;/i&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClassOrInterfaceType InterfaceMemberDeclaration&lt;br /&gt;&lt;br /&gt;

DelegationBody:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;same with: MethodBody except ReturnStatement&lt;br /&gt;&lt;br /&gt;

ReturnStatement:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;return&lt;/b&gt;* Expression&lt;br /&gt;&lt;br /&gt;

&lt;b&gt;return&lt;/b&gt; work in different way in delegation than in method.&lt;br /&gt;
For each method with ResultType(Type) it's interpreted:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;return&lt;/b&gt; (Expression).MethodIdentifier(ActualParameters);&lt;br /&gt;
For each method with ResultType(&lt;b&gt;void&lt;/b&gt;) it's interpreted:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(Expression).MethodIdentifier(ActualParameters);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;return&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;

&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;COMPILATION:&lt;/b&gt;&lt;br /&gt;
Delegation is deployed to all methods that occur in 'delegate MethodSets' and do not occur in Exclude&lt;sub&gt;opt&lt;/sub&gt;.&lt;br /&gt;
All methods have modifiers: DelegationModifiers&lt;sub&gt;opt&lt;/sub&gt;&lt;br /&gt;
Declared exception in Throws&lt;sub&gt;opt&lt;/sub&gt; are added to each method ExceptionTypeList.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;TESTING:&lt;/b&gt;&lt;br /&gt;Normal way. &lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;LIBRARY SUPPORT:&lt;/b&gt;&lt;br /&gt;No&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFLECTIVE APIS:&lt;/b&gt;&lt;br /&gt;No changed.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OTHER CHANGES:&lt;/b&gt;&lt;br /&gt;None.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;MIGRATION:&lt;/b&gt;&lt;br /&gt;No need.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;COMPATIBILITY&lt;/h5&gt;
&lt;p id="resizableP" &gt;All working programs will still work. New byte code is compatible with old one.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;REFERENCES&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;a href="http://lasu2string.blogspot.com/2009/03/delegation-proposal.html"&gt;Delegation proposal&lt;/a&gt;&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Instrukcje&lt;/h5&gt;
&lt;p id="resizableP" &gt;Opinia aby zabronić 'złego' dziedziczenia jest dość powszechnie znana. Jednak żeby być szczerym trzeba stwierdzić, że nie ma w języku mechanizmu który by wspierał choćby delegacje. W związku z oczywistymi utrudnieniami pojawiają się choćby głosy, ażeby wprowadzić do języka &lt;a href="http://www.jroller.com/scolebourne/entry/java_language_change_unique_identifier"&gt;properties&lt;/a&gt; (czyt. automatycznie dodawanie get-erów i set-erów). O ile pomysł ten jest ciut poroniony np.: jeśli chcieli byśmy oddzielnie zdefiniować min. widoczność to musieli byśmy napisać praktycznie tyle samo kodu ile przy zwykłej metodzie. Jednak sam problem ma swoje podstawy.
&lt;/p&gt;
&lt;p id="resizableP" &gt;Przyjrzyjmy się więc przykładowej konstrukcji która miała by pozwolić na delegowanie class i interfejsów. Oraz możliwościom jakie by ona dała.&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Przegląd&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;Główne zalety / korzyści:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;
   &lt;li id="resizableLi" &gt;Ujednolicenie sposobu delegacji wielu metod.&lt;/li&gt;
 &lt;li id="resizableLi" &gt;Łatwy refactor (zakomentowanie delegacji, wykluczenie metody).&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Możliwość jawnego zdefiniowania widoczności jak i innych modyfikatorów (static / final)&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Najistotniejsze wady:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;&lt;li id="resizableLi" &gt;Koszt zmian.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Zdefiniować reagowanie na ewentualny null.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Inne rozwiązania:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Pisać wszystko ręcznie.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Rozszerzyć środowisko o lepsze generatory kodu.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;
    

&lt;p id="resizableP" &gt;&lt;b&gt;Podsumowanie:&lt;/b&gt;&lt;br /&gt;
&lt;/p&gt;




    &lt;h5 id="resizableH5" &gt;Przykłady:&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Baza&lt;/b&gt;
&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; InterfaceA &lt;span class='key' &gt;extends&lt;/span&gt; Iterable&amp;lt;String&amp;gt; {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;String getName();
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;Date&amp;gt; getDates();
&lt;br /&gt;
&lt;br /&gt;}
&lt;/div&gt;

&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; InterfaceB {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; InterfaceA info();
&lt;br /&gt;
&lt;br /&gt;}
&lt;/div&gt;

&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; ClassA &lt;span class='key' &gt;implements&lt;/span&gt; InterfaceA {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; int&amp;nbsp;&amp;nbsp;delta&amp;nbsp;&amp;nbsp;= 0;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;abstract&lt;/span&gt; &lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; printState();
&lt;br /&gt;
&lt;br /&gt;}
&lt;/div&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Przykład&lt;/b&gt;
&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Sample_01 {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; InterfaceA interfaceA;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public static delegate&lt;/span&gt; InterfaceA &lt;span class='key' &gt;from&lt;/span&gt; interfaceA &lt;span class='key' &gt;onnull&lt;/span&gt; {&lt;span class='key' &gt;throw new&lt;/span&gt; NullPointerException(InterfaceA.class.getSimpleName());};
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;}
&lt;/div&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;Wyglądał by po skompilowaniu jak:&lt;br /&gt;

&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Sample_01 {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; InterfaceA&amp;nbsp;&amp;nbsp;interfaceA;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; String getName() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (interfaceA == null) throw new NullPointerException(InterfaceA.class.getSimpleName());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; interfaceA.getName();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; ArrayList&amp;lt;Date&amp;gt; getDates() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (interfaceA == null) throw new NullPointerException(InterfaceA.class.getSimpleName());
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; interfaceA.getDates();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}
&lt;/div&gt;&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;Przykład&lt;/b&gt;
&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Sample_02 {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; InterfaceA&amp;nbsp;&amp;nbsp;interfaceA;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; InterfaceB&amp;nbsp;&amp;nbsp;interfaceB;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; InterfaceA getInterfaceA() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; interfaceA == &lt;span class='key' &gt;null&lt;/span&gt; ? interfaceB.info() : interfaceA;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public final delegate&lt;/span&gt; InterfaceA &lt;span class='key' &gt;from&lt;/span&gt; getInterfaceA();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;}
&lt;/div&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;Wyglądał by po skompilowaniu jak:&lt;br /&gt;

&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Sample_02 {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; InterfaceA&amp;nbsp;&amp;nbsp;interfaceA;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; InterfaceB&amp;nbsp;&amp;nbsp;interfaceB;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; InterfaceA getInterfaceA() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; interfaceA == &lt;span class='key' &gt;null&lt;/span&gt; ? interfaceB.info() : interfaceA;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; String getName() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; getInterfaceA().getName();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; ArrayList&amp;lt;Date&amp;gt; getDates() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; getInterfaceA().getDates();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;}
&lt;/div&gt;&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Detale rozwiązania:&lt;/h5&gt;

 &lt;code&gt; [private|protected|public|final|static|]&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;  delegate &lt;/code&gt;&lt;br /&gt;
&lt;code&gt; {[Interface|Class|method]}&lt;/code&gt;&lt;br /&gt;
&lt;code&gt; from&lt;/code&gt;&lt;br /&gt;
&lt;code&gt; [variable|method|function|null]&lt;/code&gt;&lt;br /&gt;
&lt;code&gt; [exclude {Interface|Class|list of methods}]&lt;/code&gt;&lt;br /&gt;
&lt;code&gt; [onnull throw new Exception(...)]&lt;/code&gt;&lt;br /&gt;

&lt;p id="resizableP" &gt;Dla kompilatora metoda wydelegowana jak i zadeklarowana jawnie były by identyczne, a co za tym idzie dwie identyczne nie mogły by występować w tym samym czasie.&lt;/p&gt;    
 



   &lt;h5 id="resizableH5" &gt;Kompatybilność:&lt;/h5&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Wsteczna:&lt;/b&gt;&lt;br /&gt;Taki sposób delegowania metod nie wpływa na już istniejący kod.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;W przód:&lt;/b&gt;&lt;br /&gt;Sam kod nie mógłby być interpretowany wstecz. Aczkolwiek nie ma znanych mi przeciwwskazań aby prze-kompilowane biblioteki nie mogły być używane.&lt;/p&gt;



   &lt;h5 id="resizableH5" &gt;Linki:&lt;/h5&gt;

   &lt;ul&gt;&lt;li id="resizableLi" &gt;Ulatwiło by to: &lt;a href="http://bugs.sun.com/view_bug.do?bug_id=6500704"&gt;Bug: Add language support for converting methods to interfaces&lt;/a&gt; &lt;/li&gt;
   &lt;li id="resizableLi" &gt;&lt;a href="http://bugs.sun.com/view_bug.do?bug_id=4483171"&gt;Bug 4483171&lt;/a&gt;&lt;/li&gt;
   &lt;li id="resizableLi" &gt;&lt;a href="http://bugs.sun.com/view_bug.do?bug_id=5043025"&gt;Bug 5043025&lt;/a&gt;&lt;/li&gt;
   &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-1695024951801543174?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/1695024951801543174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/delegation-proposal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1695024951801543174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1695024951801543174'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/delegation-proposal.html' title='Delegation proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-1912274591525095014</id><published>2009-03-09T19:37:00.000+01:00</published><updated>2011-03-04T17:03:14.917+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>Final interfaces... proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;Instrukcje&lt;/h5&gt;
&lt;p id="resizableP" &gt;Interface (klasa abstrakcyjna) finalny nie mógłby zostać rozszerzony (zaimplementowany) przez żadną klasę(interface), oprócz tych określonych wprost.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;

  &lt;h5 id="resizableH5" &gt;Przegląd&lt;/h5&gt;
 &lt;p id="resizableP" &gt;&lt;b&gt;Podsumowanie:&lt;/b&gt;&lt;br /&gt;
&lt;/p&gt;
   

&lt;p id="resizableP" &gt;&lt;b&gt;Główne zalety / korzyści:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;&lt;li id="resizableLi" &gt;Ograniczenie pomyłek, zwłaszcza w przypadku dużych projektów.&lt;/li&gt;
    &lt;li id="resizableLi" &gt;Zwiększenie bezpieczeństwa.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Najistotniejsze wady:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Trzeba zaimplementować.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Inne rozwiązania:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt; &lt;li id="resizableLi" &gt;Agregacja + validacja.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;
    

    &lt;h5 id="resizableH5" &gt;Przykłady:&lt;/h5&gt;


    &lt;h5 id="resizableH5" &gt;Detale rozwiązania:&lt;/h5&gt;
&lt;code&gt;interface final Interface allow ClassI &lt;/code&gt;
   

    &lt;h5 id="resizableH5" &gt;Kompatybilność wsteczna:&lt;/h5&gt;
   &lt;p id="resizableP" &gt;Zapewniona.&lt;/p&gt;

    &lt;h5 id="resizableH5" &gt;Kompatybilność w przód:&lt;/h5&gt;
   &lt;p id="resizableP" &gt;Częściowa.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-1912274591525095014?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/1912274591525095014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/final-interfaces-proposal.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1912274591525095014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/1912274591525095014'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/final-interfaces-proposal.html' title='Final interfaces... proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-7217530045414085541</id><published>2009-03-08T19:29:00.000+01:00</published><updated>2011-03-04T17:03:01.689+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>'forget' keyword proposal</title><content type='html'>&lt;h5 id="resizableH5" &gt;Instrukcje&lt;/h5&gt;
&lt;p id="resizableP" &gt;Słowo '&lt;b&gt;forget&lt;/b&gt;' powodowało by wymazanie zmiennej z obecnego kontekstu. Co pozwoliło by na bardziej intuicyjne operowanie logiką programu, w przypadku gdy dana zmienna nie może(powinna być) być już używana. Ma to niebanalne znaczenie gdy po jakimś czasie wracamy do napisanego kodu.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;





  &lt;h5 id="resizableH5" &gt;Przegląd&lt;/h5&gt;
  &lt;p id="resizableP" &gt;&lt;b&gt;Podsumowanie:&lt;/b&gt;&lt;br /&gt;
   Rozszerzenie kontroli nad zasięgiem istnienia zmiennych.&lt;/p&gt;

  &lt;p id="resizableP" &gt;&lt;b&gt;Główne zalety / korzyści:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;&lt;li id="resizableLi" &gt;Brak konieczności wprowadzania sztucznych bloków. Czyli używania bloków do limitowania dostępu do zmiennych oraz wyodrębniania logicznie spójnych fragmentów kodu.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Czytelniejszy kod.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Mniej bugów (Możemy jasno określić gdy nie nie wolno dam już danej zmiennej użyć).&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Najistotniejsze wady:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;&lt;li id="resizableLi" &gt;Trzeba zaimplementować.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Niektórzy mogą nadużywać tych samych nazw.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Inne rozwiązania:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;&lt;li id="resizableLi" &gt;Przeważnie można używać zmiennych o &lt;b&gt;zasięgu&lt;/b&gt; bloku. Niestety zmuszeni jesteśmy wtedy wcześniej deklarować zmienne(przed blokiem/pascal like).&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Podstawić null (najwyżej wyleci wyjątek).&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;
    

    &lt;h5 id="resizableH5" &gt;Przykłady:&lt;/h5&gt;

&lt;div class='table'&gt;&lt;code&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; read(String path) throws IOException {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(path)));
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int some = isr.read();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// read
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isr.close();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;forget&lt;/span&gt; isr;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// other operations
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(path+".txt")));
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// other operations ...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/code&gt;&lt;/div&gt;

    &lt;h5 id="resizableH5" &gt;Detale rozwiązania:&lt;/h5&gt;
  
    &lt;h5 id="resizableH5" &gt;Kompatybilność wsteczna:&lt;/h5&gt;
   &lt;p id="resizableP" &gt;&lt;b&gt;Zapewniona pod warunkiem automatycznej zmiany nazw zmiennych, bądź przy możliwości współistnienia zmiennej o nazwie słowa kluczowego.&lt;/b&gt;&lt;/p&gt;

    &lt;h5 id="resizableH5" &gt;Kompatybilność w przód:&lt;/h5&gt;
   &lt;p id="resizableP" &gt;&lt;b&gt;Zapewniona na poziome bytecodu&lt;/b&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-7217530045414085541?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/7217530045414085541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/forget-keyword-proposal.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/7217530045414085541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/7217530045414085541'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/forget-keyword-proposal.html' title='&apos;forget&apos; keyword proposal'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-6613505693796226883</id><published>2009-03-03T19:40:00.010+01:00</published><updated>2011-03-04T17:01:10.539+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='proposal'/><title type='text'>'This' type</title><content type='html'>&lt;p id="resizableP" &gt;&lt;b&gt;AUTHOR:&lt;/b&gt; Lasu aka Marek Kozieł http://lasu2string.blogspot.com/&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;OVERVIEW&lt;/b&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;FEATURE SUMMARY:&lt;br /&gt;
This type add ability to project valid interfaces(classes) for further extending/implementing.
&lt;b&gt;'This'&lt;/b&gt; means current interface/class type or  something implementing/extending it.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;





&lt;span class="posthidden" id="this0000"&gt;
&lt;p id="resizableP" &gt;MAJOR ADVANTAGE:&lt;br /&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Support of interface projecting at interface level.&lt;/li&gt;
&lt;li id="resizableLi" &gt;More readable code structure (interfaces/methods).&lt;/li&gt;
&lt;li id="resizableLi" &gt;Making refactor more enjoyable (much easier).&lt;/li&gt;
&lt;li id="resizableLi" &gt;Discarding request of replacing 'void' with 'this'.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Splitting interfaces to sub-interfaces can become pleasant.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Down casting working properly.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Decreasing number of method signatures in classes/interfaces.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;MAJOR DISADVANTAGE:&lt;br /&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Class 'This' may already exist somewhere in code(?)&lt;/li&gt;
&lt;li id="resizableLi" &gt;As so far, it's not been thought over know if there is point of using it for input parameters.&lt;/li&gt;
&lt;li id="resizableLi" &gt;'This.class' might be a problem for generics, but generally everything depends on how 'This' is interpreted(personally, I think that it should be generic with arguments)(this.getClass()).&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;ALTERNATIVES:&lt;br /&gt;
Rewriting each method's signature on every class / interface.&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;EXAMPLES&lt;/b&gt;&lt;/p&gt;

&lt;div class='table'&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IB &lt;span class='key' &gt;implements&lt;/span&gt; Iterable&amp;lt;This&amp;gt; {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;

&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IC &lt;span class='key' &gt;implements&lt;/span&gt; IB {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;br /&gt;
&lt;p id="resizableP" &gt;Would mean(which is impossible now time):
&lt;div class='table'&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IC &lt;span class='key' &gt;implements&lt;/span&gt;IB, Iterable&amp;lt;IC&amp;gt; {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/p&gt;

&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IA {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;This&lt;/span&gt; write(String s);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IB &lt;span class='key' &gt;extends&lt;/span&gt; IA {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;This&lt;/span&gt; write(double value);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; CC &lt;span class='key' &gt;implements&lt;/span&gt; IB {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;This&lt;/span&gt; write(int value){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; CD &lt;span class='key' &gt;extends&lt;/span&gt; CC {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;This&lt;/span&gt; write(double value) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;This&lt;/span&gt; write(String s) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;&lt;br /&gt;
&lt;div class='table'&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CD object = new CD();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;object.write("Some").write(3).write(3.11);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;

&lt;p id="resizableP" &gt;Nowdays, the same code would look as:
&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IA {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IA write(String s);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IB &lt;span class='key' &gt;extends&lt;/span&gt; IA {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IB write(double value);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IB write(String s);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; CC &lt;span class='key' &gt;implements&lt;/span&gt; IB {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CC write(int value){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; CC write(double value);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; CC write(String s);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; CD &lt;span class='key' &gt;extends&lt;/span&gt; CC {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; CD write(double value) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; CD write(String s) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CD write(int value){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;&lt;/p&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;DETAILS&lt;/b&gt;:&lt;/p&gt;
&lt;p id="resizableP" &gt;SPECIFICATION:&lt;br /&gt;
(I did not have time to analyze this completely.)&lt;/p&gt;
&lt;p id="resizableP" &gt;COMPILATION:&lt;br /&gt;
With 'This' type is valid:
&lt;ul&gt;&lt;li id="resizableLi" &gt;this&lt;/li&gt;
&lt;li id="resizableLi" &gt;null&lt;/li&gt;
&lt;li id="resizableLi" &gt;? extends This&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;'This' should be considered to be able to appear in:
&lt;ul&gt;&lt;li id="resizableLi" &gt;return type(yes).&lt;/li&gt;
&lt;li id="resizableLi" &gt;input type(yes/no?).&lt;/li&gt;
&lt;li id="resizableLi" &gt;method body(yes?).&lt;/li&gt;
&lt;li id="resizableLi" &gt;As generic parameter(yes/only if they appear as return types?).&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;List&amp;lt;This extends Container&amp;lt;This&amp;gt;&amp;gt; would mean This but not less than Container&lt;/p&gt;
&lt;p id="resizableP" &gt;This could be reduced to last superclass&lt;/p&gt;


&lt;p id="resizableP" &gt;&lt;b&gt;COMPATIBILITY&lt;/b&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;Only programs where are class/interface named 'This' used can be problem.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;REFERENCES&lt;/b&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;Notice that considered document does not contain complete analyze of those solutions and can have some lacks. So if you have some questions/advices that it does not fully fit with Project Coin, post it on my blog to discuss:&lt;br /&gt; 
&lt;a href="http://lasu2string.blogspot.com/2009/03/this-type.html"&gt;http://lasu2string.blogspot.com/2009/03/this-type.html&lt;/a&gt;&lt;/p&gt;
&lt;p id="resizableP" &gt;:&lt;/p&gt;
&lt;/span&gt;

  &lt;h5 id="resizableH5" &gt;Instrukcje&lt;/h5&gt;
&lt;p id="resizableP" &gt;Może to nie jest jasne jednak o ile klasy podlegają dziedziczeniu to już typy nie. Efektem tego jest dość paranoidalna sytuacja w której z jednej strony sugeruje się stosowanie interfejsów a z drugiej uniemożliwia się tworzenie ciągów wywołań.&lt;/p&gt;
&lt;p id="resizableP" &gt;Dość średnim sposobem rozwiązania tego problemu była propozycja wprowadzenia automatycznej konwersji void na this. Jednak są ludzie którzy świadomie stosują void np. żeby później zdefiniować pożądany zwracany typ ( bugi wynikajace ze zmian murowane ). &lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;Przegląd
&lt;/h5&gt;
&lt;span class="posthidden" id="this001"&gt;



&lt;p id="resizableP" &gt;&lt;b&gt;Główne zalety / korzyści:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;
   &lt;li id="resizableLi" &gt;Uproszczenie struktury kodu.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Uproszczenie projektowania złożonych interfejsów.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Najistotniejsze wady:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;
   &lt;li id="resizableLi" &gt;Komplikacja struktury kodu.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Trzeba się zastanowić czy &lt;b&gt;This&lt;/b&gt; ma sens jako parametr wejściowy.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Istnieją klasy o nazwie 'This'.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Inne rozwiązania:&lt;/b&gt;&lt;br /&gt;
   &lt;ul&gt;
   &lt;li id="resizableLi" &gt;Przepisać każdą metodę jeszcze raz w każdej klasie/interfejsie ze zmienionym typem zwracanym.&lt;/li&gt;
   &lt;li id="resizableLi" &gt;Zwracać void i zmuszać programistów do bardziej 'jawnych' wywołań.&lt;/li&gt;
   &lt;/ul&gt;&lt;/p&gt;
    

  &lt;b&gt;Podsumowanie:&lt;/b&gt;&lt;br /&gt;
&lt;/span&gt;



    &lt;h5 id="resizableH5" &gt;Przykłady:&lt;/h5&gt;
&lt;span class="posthidden" id="this002"&gt;

&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IA {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;This&lt;/span&gt; write(String s);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IB &lt;span class='key' &gt;extends&lt;/span&gt; IA {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;This&lt;/span&gt; write(double value);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; CC &lt;span class='key' &gt;implements&lt;/span&gt; IB {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;This&lt;/span&gt; write(int value){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; CD &lt;span class='key' &gt;extends&lt;/span&gt; CC {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;This&lt;/span&gt; write(double value) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;This&lt;/span&gt; write(String s) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;&lt;br /&gt;
&lt;div class='table'&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; main(String[] args) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CD object = new CD();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;object.write("Some").write(3).write(3.11);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;
Aby osiągnąć podobny efekt dziś musieli byśmy napisać:
&lt;div class='table'&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IA {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IA write(String s);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IB &lt;span class='key' &gt;extends&lt;/span&gt; IA {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IB write(double value);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IB write(String s);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; CC &lt;span class='key' &gt;implements&lt;/span&gt; IB {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CC write(int value){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; CC write(double value);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;abstract&lt;/span&gt; CC write(String s);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; CD &lt;span class='key' &gt;extends&lt;/span&gt; CC {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; CD write(double value) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; CD write(String s) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CD write(int value){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; this;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;

&lt;/span&gt;




  &lt;h5 id="resizableH5" &gt;Detale rozwiązania:&lt;/h5&gt;
 &lt;span class="posthidden" id="this003"&gt;
&lt;p id="resizableP" &gt;Co jest typu &lt;b&gt;This&lt;/b&gt;?&lt;/p&gt;
  &lt;ul&gt;
    &lt;li id="resizableLi" &gt;zmienne typu This&lt;/li&gt;
    &lt;li id="resizableLi" &gt;&lt;b&gt;this&lt;/b&gt;&lt;/li&gt;
    &lt;li id="resizableLi" &gt;&lt;b&gt;null&lt;/b&gt;&lt;/li&gt;
    &lt;li id="resizableLi" &gt;zmienne typu &lt;b&gt;? extends This&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;
 &lt;/span&gt;   



   &lt;h5 id="resizableH5" &gt;Kompatybilność:&lt;/h5&gt;
&lt;span class="posthidden" id="this004"&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;Wsteczna:&lt;/b&gt;&lt;br /&gt;Pełna.&lt;/p&gt;

&lt;p id="resizableP" &gt;&lt;b&gt;W przód:&lt;/b&gt;&lt;br /&gt;Brak.&lt;/p&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-6613505693796226883?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/6613505693796226883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/03/this-type.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6613505693796226883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/6613505693796226883'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/03/this-type.html' title='&apos;This&apos; type'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-4435669534849628929</id><published>2009-02-18T17:11:00.022+01:00</published><updated>2011-03-03T20:42:41.599+01:00</updated><title type='text'>Project Coin: Known enhancements</title><content type='html'>&lt;p id="resizableP" &gt;You can read about really nice idea to make Java better: &lt;a target='sun' href="http://blogs.sun.com/darcy/entry/fosdem_2009_openjdk_6_project#comments"&gt;FOSDEM 2009: OpenJDK 6 and Project Coin&lt;/a&gt;. So lets see some of them...&lt;/p&gt;


&lt;a name='more'&gt;&lt;/a&gt;



  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4032740" &gt;(Reflection) Accessibilities of members should be ACCESS-LEVEL sensitive&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I do not like reflection (yet). And do not see point to increase it's range. But idea about considering context of method call is nice for security.
&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4041479"&gt;
String conversion needs another index entry&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;It's about(I think): &lt;a target='sun' href="http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.18.1"&gt;String Concatenation Operator +&lt;/a&gt; ?
&lt;/p&gt;







  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4071299"&gt;
Compilation spec needed: should state if private should imply final for a method&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I do not know why some one would like to see some methods to be final without 'final' word. This could be pretty troublesome.
&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4088441"&gt;
long double support&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Why not?
&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4093687"&gt;
Extension of 'Interface' definition to include class (static) methods.&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I wandered about this some time ago. But maybe I'll be able to introduce better way to provide this.
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4191243"&gt;
Method forwarding - Subclassing without subtyping&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;This need to be inspected. I wandered about similar idea (but more Java-like).&lt;br /&gt;
&lt;a target='sun' href="http://www.fernuni-hagen.de/ps/prjs/RIWD/"&gt;The Replace Inheritance with Delegation Refactoring (RIWD)&lt;/a&gt;
&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4206170"&gt;
Cloning inner classes&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;It's no problem for me ;P
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4213096"&gt;
A Proposal for User-Defined Lightweight Value-Semantics Objects&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I'll have to take more time to consider it...&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4223287"&gt;
Suggestion for "atomic" keyword for try {} blocks&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;What for(increase complex)?&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4228585"&gt;
Explicit (language) support for properties&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Problem is real but solution is &lt;b&gt;weak&lt;/b&gt;.&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4230600"&gt;
Ease the JLS to allow mathematical symbols in indentifiers (defined operators or operator overloading)&lt;/a&gt;&lt;br /&gt;
&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4344759"&gt;Allow Unicode versions of operators&lt;/a&gt;&lt;br /&gt;
&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4905919"&gt;RFE: Operator overloading&lt;/a&gt;
&lt;/h5&gt;
&lt;p id="resizableP" &gt;But why in Java?&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4260488"&gt;
RFE: Please add nested /* */ comments&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Interesting for consideration, but impossible.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4262078"&gt;
Maximum method size is too small (64Kb)&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Heavy methods ^_^&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4269827"&gt;Allow multiple constants and ranges in case labels&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Why not?&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4300222"&gt;
Object Oriented Callbacks&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;code&gt;callbackName = myObject.myFunction&lt;/code&gt;&lt;br /&gt; NOT in this form.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4351453"&gt;
'final' variables and inner classes&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I'll have to take more time to consider it...&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4384324"&gt;
java really needs a complex (number) primitive type&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Life is not always nice. &lt;a target='sun' href="https://algebraicmath.dev.java.net/"&gt;AlgebraicMath&lt;/a&gt;&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4395264"&gt;Allow this/super in certain static contexts&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Really bad solution(not the problem).&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4432337"&gt;Catching multiple exceptions simultaneously&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;YES!&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4456057"&gt;package access for interface methods&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I wander about further problems...&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4472509"&gt;Add support for vertabim string literals&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Should be deeply considered.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4487555"&gt;Java Generics Support should support primitive types&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Nice idea but impossible.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4617197"&gt;RFE: Add Immutable types to Java&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Agree with problem / do not agree with solution.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4630147"&gt;silly JLS rule that restricts the throw clause in a hiding method&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I think I do agree.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4632701"&gt;http://bugs.sun.com/view_bug.do?bug_id=4632701&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;As I already said. Make language depended from one implementation is not good idea.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4649007"&gt;Document class file attributes for compilation date/time + debugging&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Hard to say.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4662939"&gt;wanted: constant pool entries for arrays&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I think I need better description.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4726340"&gt;RFE: Tail Call Optimization&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I want to meet the men who introduced this idea.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4748349"&gt;Multiple return values from a method&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;It's matter of time.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4809540"&gt;RFE: permit allocation of new objects on stack&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;"Unfortunately, it's not that simple.&lt;br /&gt;

The constructor, for example, might leak the reference.  Or any method
called on the object might do so."&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4888664"&gt;RFE: syntactic sugar to simulate C++ stack-allocted object destructor semantics&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Such big tank to kill the rabbit.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4963452"&gt;RFE: 64 bit pointers needed&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;Not this year.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4983159"&gt;Typedef (alias)&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;NO?&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;a target='sun' href="http://bugs.sun.com/view_bug.do?bug_id=4988583"&gt;AutomaticException chaining for exception in try and exception thrown in finally&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;I would prefer option to select which exception should be dropped.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-4435669534849628929?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/4435669534849628929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/02/project-coin-known-enhancements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/4435669534849628929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/4435669534849628929'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/02/project-coin-known-enhancements.html' title='Project Coin: Known enhancements'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-9160769099041474487</id><published>2009-02-11T02:48:00.005+01:00</published><updated>2011-03-03T20:32:02.099+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='encapsulation'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Encapsulation though access control</title><content type='html'>&lt;p id="resizableP" &gt;Encapsulation does not necessarily means getters and setters. And have more than one aspects:
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Inside structure control.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Input data validation.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Outside access control.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Lets consider 'Outside access control'.&lt;/h5&gt;
&lt;p id="resizableP" &gt;While we directly do not know which class calls method, it's hard to limit context of (method) call. It is possible, but amount of work is to big now time.&lt;br /&gt;
Any way what solutions do we have?&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;





  &lt;h5 id="resizableH5" &gt;Control by 'key'.&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table'&gt;&lt;code&gt;
&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; SetByLock {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; SetByLock(Object acessKey) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.acessKey = acessKey;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; Object&amp;nbsp;&amp;nbsp;acessKey;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; String&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; String getData() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; setData(Object accessKey, String data) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (acessKey != accessKey) { throw new UnauthorizedAccessException(accessKey == &lt;span class='key' &gt;null&lt;/span&gt; ? "null" : accessKey.toString()); }
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.data = data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}&lt;/code&gt;&lt;/div&gt;
As we can see in the example above, we have to pass the &lt;b&gt;key&lt;/b&gt; each time we want to execute protected method. For limiting access this solution is good enough, as only creator have the powder to access danger space (method, …), and only he can lend this powder to other objects.&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Control by 'delegated accessor'.&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table'&gt;&lt;code&gt;
&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Container&amp;lt;Type&amp;gt; {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Type&amp;nbsp;&amp;nbsp;element;
&lt;br /&gt;
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; SetByAccessor {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; SetByAccessor(Container&amp;lt;Accessor&amp;gt; accessorContainer, String data) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.data.data = data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (accessorContainer != null) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accessorContainer.element = new Accessor(this.data);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; Local&amp;nbsp;&amp;nbsp;data&amp;nbsp;&amp;nbsp;= new Local();
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; String getData() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; data.data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/*
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Store local data
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Local {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Local() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; String&amp;nbsp;&amp;nbsp;data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/*
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Allow to more access
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Accessor {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Accessor(Local data) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (data == null) { throw new NullPointerException(Local.class.getSimpleName()); }
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.data = data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; Local&amp;nbsp;&amp;nbsp;data;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; setData(String data) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.data.data = data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;
In this solution we can lend 'limited' access just by one object, while previous one required pair: object &amp; key .&lt;br /&gt;
Problem is when we have lot's of elements to control. 1000 objects force us to store 1000 Accessor-s&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;Mixed solution.&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table'&gt;&lt;code&gt;

&lt;br /&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; SetByMixed {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; SetByMixed(Object accessKey, String data) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.data.data = data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.accessKey = accessKey;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; Object&amp;nbsp;&amp;nbsp;accessKey;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; Accessor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accessor;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Accessor getAccessor(Object accessKey) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (this.accessKey != accessKey) { throw new UnauthorizedAccessException(accessKey == &lt;span class='key' &gt;null&lt;/span&gt; ? "null" : accessKey.toString()); }
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (accessor == null) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accessor = new Accessor(data);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; accessor;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; Local&amp;nbsp;&amp;nbsp;data&amp;nbsp;&amp;nbsp;= new Local();
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; String getData() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; data.data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/*
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Store local data
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Local {
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Local() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; String&amp;nbsp;&amp;nbsp;data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/*
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Allow to 'limited' access
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; Accessor {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; Accessor(Local data) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (data == null) { throw new NullPointerException(Local.class.getSimpleName()); }
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.data = data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; Local&amp;nbsp;&amp;nbsp;data;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; setData(String data) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.data.data = data;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;}
&lt;/code&gt;&lt;/div&gt;
At final here we have 'nice' part of code. Keys can be reused and there no need to store pairs to have full access. What more we do not need to write 'secure check' on each method and worry if we have access to every method (it's possible for each method to have own key in control by 'key').&lt;br /&gt;
Key just need to be controlled to do not leak out.&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Summary.&lt;/h5&gt;
&lt;p id="resizableP" &gt;
I just wander, if we really need all this stuff when we want limit write access?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-9160769099041474487?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/9160769099041474487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/02/encapsulation-though-access-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/9160769099041474487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/9160769099041474487'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/02/encapsulation-though-access-control.html' title='Encapsulation though access control'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-5511350821792982873</id><published>2009-02-04T21:50:00.000+01:00</published><updated>2011-03-04T17:04:53.635+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='workaround'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><title type='text'>Using Strings and Objects in Switch case statements.</title><content type='html'>&lt;h5 id="resizableH5" &gt;Lets consider enhancement on Sun Bug Database : &lt;a href="http://bugs.sun.com/view_bug.do?bug_id=5012262"&gt;5012262&lt;/a&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;
It's about letting us using String in switch.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;





&lt;p id="resizableP" &gt;
Sample workaround:
&lt;div class='table'&gt;
&lt;span class='key' &gt;switch&lt;/span&gt;(inputString.hashCode()){
&lt;br /&gt;&amp;nbsp;&lt;span class='key' &gt;case&lt;/span&gt; 3541040: //Hashcode of "strA"
&lt;br /&gt;&amp;nbsp;&amp;nbsp;System.out.println("strA");
&lt;br /&gt;&amp;nbsp;&lt;span class='key' &gt;case&lt;/span&gt; 3541041: //Hashcode of "strB"
&lt;br /&gt;&amp;nbsp;&amp;nbsp;System.out.println("strB");
&lt;br /&gt;}
&lt;/div&gt;&lt;br /&gt;

Now let's see why this will do not work:&lt;br /&gt;

&lt;div class='table' &gt;System.out.println("aa".hashCode());&lt;br /&gt;
System.out.println("bB".hashCode());&lt;/div&gt;

Will result with:&lt;br /&gt;

&lt;div class='table' &gt;3104&lt;br /&gt;
3104&lt;/div&gt;&lt;br /&gt;

Quite lol?&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;So finally lets see more interesting workaround:&lt;/h5&gt;
&lt;p id="resizableP" &gt;

&lt;div class='table'&gt;
&lt;span class='key' &gt;enum&lt;/span&gt; Switch {&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ONE("asd") {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; action() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(this.text);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},//
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TWO("bad");//&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;protected&lt;/span&gt; String&amp;nbsp;&amp;nbsp;text;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; action() {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new NotImplementedException();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Switch(String text) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (text == null) { throw new NullPointerException("text"); }
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.text = text;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; Switch getByText(String text) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (text == null) &lt;span class='key' &gt;return&lt;/span&gt; &lt;span class='key' &gt;null&lt;/span&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (Switch casee : Switch.values()) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (casee.text.equals(text)) &lt;span class='key' &gt;return&lt;/span&gt; casee;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; &lt;span class='key' &gt;null&lt;/span&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; Switch getByTextForStartWith(String prefix) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (prefix == null) &lt;span class='key' &gt;return&lt;/span&gt; &lt;span class='key' &gt;null&lt;/span&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (Switch casee : Switch.values()) {
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (casee.text.startsWith(prefix)) &lt;span class='key' &gt;return&lt;/span&gt; casee;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; &lt;span class='key' &gt;null&lt;/span&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;
&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;&lt;center&gt;Can we?&lt;/center&gt;&lt;/h5&gt;
  &lt;h5 id="resizableH5" &gt;&lt;center&gt;&lt;b&gt;Sure we can!&lt;/b&gt;&lt;/center&gt;&lt;/h5&gt;


&lt;p id="resizableP" &gt;
@see: &lt;a href="http://lasu2string.blogspot.com/2008/12/string-switch-small-language-changes-on.html"&gt;String switch: Small language changes on JDK 7&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-5511350821792982873?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/5511350821792982873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/02/using-strings-and-objects-in-switch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/5511350821792982873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/5511350821792982873'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/02/using-strings-and-objects-in-switch.html' title='Using Strings and Objects in Switch case statements.'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-2078282609750423009</id><published>2009-02-03T00:35:00.014+01:00</published><updated>2011-03-03T20:07:55.438+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='memory optimization'/><title type='text'>Memory management in Java</title><content type='html'>&lt;table style="border: 0px solid black" &gt;&lt;tr&gt; &lt;td width="50%" &gt;&lt;/td&gt; &lt;td style="background-color:#222222;   float:right;   line-height:10px;   padding: 9px 9px 1px;   text-align:right;" &gt;&lt;img border="0" style="border: 0px solid black; padding:0px;"  src="http://alan.umcs.lublin.pl/~lasu/memory.l.jpg"/&gt;&lt;br /&gt;&amp;nbsp;
&lt;/td&gt; &lt;td width="50%" &gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

  &lt;h5 id="resizableH5" &gt;Different look on memory leak problem.&lt;/h5&gt;
&lt;p id="resizableP" &gt;
We have garbage collector in Java, but this do not prevent us from make memory to leak. What more even standard library isn't leak-free.&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;How can we spare memory easly?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;b&gt;String.intern()&lt;/b&gt; is one of the easiest way. 
&lt;ul&gt;
&lt;li id="resizableLi" &gt;It do not interfere with gc.&lt;/li&gt;
&lt;li id="resizableLi" &gt;It's fast.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Multi thread safe.&lt;/li&gt;
&lt;/ul&gt;
I just need to check if &lt;b&gt;.intern()&lt;/b&gt; work with &lt;b&gt;.substring(...)&lt;/b&gt;
&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;Where we loose memory quietly?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Most &lt;b&gt;Classes&lt;/b&gt; created to store high amount of dynamic data have their own memory menage system. &lt;b&gt;ArrayList&lt;/b&gt;, &lt;b&gt;StringBuilder&lt;/b&gt;, ...  they all allocate *2 memory. Which  mean that is we have 1024 elements and need to add one while no free space is available then space will be extended to 2024.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;How much memory do we loose?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Calling &lt;b&gt;.trimToSize()&lt;/b&gt; can spare approximately 10% of memory.&lt;br /&gt;
On &lt;b&gt;String.intern()&lt;/b&gt; I used to save up to 70%.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-2078282609750423009?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/2078282609750423009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/02/memory-management-in-java.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/2078282609750423009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/2078282609750423009'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/02/memory-management-in-java.html' title='Memory management in Java'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-3598799582485999945</id><published>2009-02-02T01:14:00.019+01:00</published><updated>2011-03-03T20:02:53.660+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='evolution'/><title type='text'>Digital TV in Poland</title><content type='html'>&lt;table style="border: 0px solid black" &gt;&lt;tr&gt; &lt;td width="50%" &gt;&lt;/td&gt; &lt;td style="background-color:#222222;   float:right;   line-height:10px;   padding: 9px 9px 1px;   text-align:right;" &gt;&lt;img width="192" heigh="256" border="0" style="border: 0px solid black; padding:0px;"  src="http://upload.wikimedia.org/wikipedia/commons/b/b9/1950's_television.jpg"/&gt;
&lt;a href="http://en.wikipedia.org/wiki/Digital_television" style="font-family: Georgia,Georgia,serif;   font-size:10px;   line-height:1;   " &gt;Wikipedia: Digital television&lt;/a&gt;&lt;/td&gt; &lt;td width="50%" &gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p id="resizableP" &gt;
Slowly but unstoppable Digital TV will finally come to us.
&lt;/p&gt;





&lt;a name='more'&gt;&lt;/a&gt;






&lt;p id="resizableP" &gt;
I just wander why people are so enthusiastic about it?&lt;br /&gt;
Let's try to predict sample chronology:&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Digital TV work.&lt;/li&gt;
&lt;li id="resizableLi" &gt;People buy new TV-s and/or other equipment.&lt;/li&gt;
&lt;li id="resizableLi" &gt;People open eyes and notice that 3D is better.&lt;/li&gt;
&lt;li id="resizableLi" &gt;3D TV work.&lt;/li&gt;
&lt;li id="resizableLi" &gt;...&lt;/li&gt;
&lt;/ul&gt;
Is there really point to introduce Digital TV to market (for customers) while 3D is quite near?&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=cNVhlEkakxY"&gt;CES 2008: 3DIS 3D monitor Aving&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blogs.techrepublic.com.com/itdojo/?p=218"&gt;Sony shows 3D television prototypes at CES 2009&lt;/a&gt;&lt;/p&gt;

&lt;p id="resizableP" &gt;Some more information about images:&lt;br /&gt;

&lt;a href="http://www.cybergrain.com/tech/hdr/"&gt;The Future of Digital Imaging - High Dynamic Range Photography:&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-3598799582485999945?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/3598799582485999945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/02/digital-tv-in-poland.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/3598799582485999945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/3598799582485999945'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/02/digital-tv-in-poland.html' title='Digital TV in Poland'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-7366425257635856237</id><published>2009-02-01T22:10:00.005+01:00</published><updated>2011-03-03T19:57:17.072+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='develop'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Genesis of Programming</title><content type='html'>&lt;table style="border: 0px solid black" &gt;&lt;tr&gt; &lt;td width="50%" &gt;&lt;/td&gt; &lt;td style="background-color:#222222;   float:right;   line-height:10px;   padding: 9px 9px 1px;   text-align:right;" &gt;&lt;img border="0" style="border: 0px solid black; padding:0px;"  src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Brueghel-tower-of-babel.jpg/400px-Brueghel-tower-of-babel.jpg"/&gt;
&lt;a href="http://en.wikipedia.org/wiki/Tower_of_Babel" style="font-family: Georgia,Georgia,serif;   font-size:10px;   line-height:1;   " &gt;Wikipedia: Tower of Babel&lt;/a&gt;&lt;/td&gt; &lt;td width="50%" &gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p id="resizableP" &gt;
&lt;b&gt;1&lt;/b&gt; At one time the whole earth had the same programming language and vocabulary. &lt;b&gt;2&lt;/b&gt; As people  migrated from the asembler, they found a valley in the land of Shinar and settled there &lt;b&gt;3&lt;/b&gt; They said to each other, "Come, let us make libraries ." They had objects for stone and patterns for mortar. &lt;b&gt;4&lt;/b&gt; And they said, "Come, let us build ourselves a language and a standard library with everything programmer can need under the sky. Let us make a name for ourselves; otherwise, we will be scattered over the face of the whole earth."&lt;/p&gt;




&lt;p id="resizableP" &gt;
&lt;b&gt;5&lt;/b&gt; Then the marketing came down to look over the language concepts and the library that the men were building. &lt;b&gt;6&lt;/b&gt; The marketing said, "If, as one people all having the same language, they have begun to do this, then nothing they plan to do will be impossible for them. &lt;b&gt;7&lt;/b&gt; Come, let Us go down there and forbid them to create language so that they will not be able to create programs for all the platforms."&lt;/p&gt;




&lt;p id="resizableP" &gt;
&lt;b&gt;8&lt;/b&gt; So the marketing scattered them from there over the firms on the whole earth, and they stopped building the language. &lt;b&gt;9&lt;/b&gt; Therefore its name is called Babylon, for there the marketing confused the programmers of the whole earth, and from there the marketing scattered them over the face of the firms on the whole earth.&lt;/p&gt;



&lt;a name='more'&gt;&lt;/a&gt;




  &lt;h5 id="resizableH5" &gt;Did anyone wonder how many code go to trash because of current situation?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
When you will visit &lt;a href="http://99-bottles-of-beer.net/"&gt;99 Bottles of Beer&lt;/a&gt; you will see sample program in 1249 different programming languages and variations. And as it's easy to predict, it's not all what we can find on the web.
&lt;/p&gt;



&lt;p id="resizableP" &gt;
That's why, I do like Java. I do not need to worry for which platform the code is, or learn new language. It may not be clear but Windows is not the entire world.&lt;/p&gt;





&lt;p id="resizableP" &gt;&lt;code&gt;The LORD said, "If, as one people all having the same language, they have begun to do this, then nothing they plan to do will be impossible for them.&lt;/code&gt;Genesis 11:6&lt;/p&gt;




&lt;p id="resizableP" &gt;Was it really LORD's punishment or maybe people still are not able to find compromise? As we can see, language is not the only problem, there's something more deeper in it.&lt;/p&gt;

&lt;p id="resizableP" &gt;Direct consequence of current situation is confusion. Students / programmers when they have to much to choose, they try to know as much as possible. With every new language we have more people that know many languages in a base level. :/&lt;/p&gt;

&lt;p id="resizableP" &gt;@see &lt;a href="http://blog.jaoo.dk/2008/10/07/the-future-of-programming-languages/"&gt;The future of programming languages (Anders Hejlsberg speech)&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-7366425257635856237?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/7366425257635856237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/01/genesis-of-programming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/7366425257635856237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/7366425257635856237'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/01/genesis-of-programming.html' title='Genesis of Programming'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-5571314874317593885</id><published>2009-01-19T22:25:00.021+01:00</published><updated>2011-03-03T19:49:38.453+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='polski'/><title type='text'>Gdyby ludzie mówili językami programowania?</title><content type='html'>&lt;p id="resizableP" &gt;Generalnie programowanie sprowadza się do myślenia w określony sposób. Często opanowanie tego sposobu zajęło nam tyle czasu i w trakcie użycia sprawia tyle trudności, że nie mamy czasu się zastanawiać co my właściwie myślimy.
&lt;/p&gt;
&lt;p id="resizableP" &gt;Tak więc spróbuje przedstawić jak wyglądała by przykładowa sytuacja w której to Heniek mówi Marianowi, że ten ma udać  się do monopolowego po flaszkę oraz bimber który kochana sprzedawczyni Hela trzyma za pazuchą dla najlepszych klientów, a co gorsza z nimi wrócić.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;






  &lt;h5 id="resizableH5" &gt;Asembler:&lt;/h5&gt;
&lt;p id="resizableP" &gt;

Marian robisz tak:
&lt;ul&gt;
&lt;li id="resizableLi" &gt;wsadź rękę w prawą kieszeń Heńka&lt;/li&gt;
&lt;li id="resizableLi" &gt;wyciągnij zawartość&lt;/li&gt;
&lt;li id="resizableLi" &gt;wsadź to co żeś wziął do swojej prawej kieszeni&lt;/li&gt;
&lt;li id="resizableLi" &gt;obróć się w prawo o 90%&lt;/li&gt;
&lt;li id="resizableLi" &gt;zrób 40 kroków w przód&lt;/li&gt;
&lt;li id="resizableLi" &gt;obróć się w prawo o 30%&lt;/li&gt;
&lt;li id="resizableLi" &gt;zrób 40 kroków w przód&lt;/li&gt;
&lt;li id="resizableLi" &gt;otwórz drzwi&lt;/li&gt;
&lt;li id="resizableLi" &gt;zrób 4 kroki w przód&lt;/li&gt;
&lt;li id="resizableLi" &gt;obróć się w prawo o 90%&lt;/li&gt;
&lt;li id="resizableLi" &gt;wsadź prawą rękę za pazuchę Heli&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli nie ma bimbru przejdź do kupowania flaszki&lt;/li&gt;
&lt;li id="resizableLi" &gt;zaciśnij prawą rękę na bimbrze &lt;/li&gt;
&lt;li id="resizableLi" &gt;wyjmij bimber&lt;/li&gt;
&lt;li id="resizableLi" &gt;schowaj bimber do lewej kieszeni&lt;/li&gt;
&lt;li id="resizableLi" &gt;(kupowanie flaszki):&lt;/li&gt;
&lt;li id="resizableLi" &gt;wsadź prawą rękę za ladę&lt;/li&gt;
&lt;li id="resizableLi" &gt;sprawdź czy jest tam flaszka&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli flaszki nie ma to (kończ zakupy)&lt;/li&gt;
&lt;li id="resizableLi" &gt;wyjmij prawą rękę z za lady&lt;/li&gt;
&lt;li id="resizableLi" &gt;wyjmij zawartość prawej kieszeni&lt;/li&gt;
&lt;li id="resizableLi" &gt;wsadź to co wziąłeś do kasy&lt;/li&gt;
&lt;li id="resizableLi" &gt;wsadź prawą rękę za ladę&lt;/li&gt;
&lt;li id="resizableLi" &gt;weź flaszkę &lt;/li&gt;
&lt;li id="resizableLi" &gt;wyjmij prawą rękę z za lady&lt;/li&gt;
&lt;li id="resizableLi" &gt;wsadź zawartość ręki do prawej kieszeni.&lt;/li&gt;
&lt;li id="resizableLi" &gt;(kończ zakupy)&lt;/li&gt;
&lt;li id="resizableLi" &gt;….. powrót ….&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;PHP:&lt;/h5&gt;
&lt;p id="resizableP" &gt;

Marian robisz tak:
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Ktoś ci da coś nie pytaj kto i nie sprawdzaj co, bo jeszcze się coś stanie.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Idziesz z tym do sklepu na pewno trafisz nie ma wielu możliwości&lt;/li&gt;
&lt;li id="resizableLi" &gt;Jeśli są flaszki to bierzesz jedną i dajesz temu kto co dal to coś wcześniej  i zostawiasz to coś co dostałeś wcześniej.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Jeśli sprzedawczyni ma za pazuchą flaszkę to jest Hela weź to od niej i daj temu co poprzednio.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Wracasz!&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Pascal:&lt;/h5&gt;
&lt;p id="resizableP" &gt;

Marian robisz tak:
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Możesz mieć do dyspozycji:&lt;/li&gt;
&lt;li id="resizableLi" &gt;Heniek&lt;/li&gt;
&lt;li id="resizableLi" &gt;Hela&lt;/li&gt;
&lt;li id="resizableLi" &gt;flaszka&lt;/li&gt;
&lt;li id="resizableLi" &gt;bimber&lt;/li&gt;
&lt;li id="resizableLi" &gt;kasa&lt;/li&gt;
&lt;li id="resizableLi" &gt;zaczynasz robić&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli Heniek ma kasę wówczas &lt;/li&gt;
&lt;li id="resizableLi" &gt;zaczynasz robić&lt;/li&gt;
&lt;li id="resizableLi" &gt;bierzesz kasę od Heniek&lt;/li&gt;
&lt;li id="resizableLi" &gt;idziesz do Hela&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli Hela ma do sprzedania flaszkę wówczas&lt;/li&gt;
&lt;li id="resizableLi" &gt;zaczynasz robić&lt;/li&gt;
&lt;li id="resizableLi" &gt;kupujesz flaszkę od Hela&lt;/li&gt;
&lt;li id="resizableLi" &gt;chowasz flaszkę&lt;/li&gt;
&lt;li id="resizableLi" &gt;wracasz do Heniek&lt;/li&gt;
&lt;li id="resizableLi" &gt;oddajesz flaszkę dla Heniek&lt;/li&gt;
&lt;li id="resizableLi" &gt;idziesz do Hela&lt;/li&gt;
&lt;li id="resizableLi" &gt;kończysz robić&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli Hela ma bimber wówczas bierzesz bimber od Hela&lt;/li&gt;
&lt;li id="resizableLi" &gt;wracasz do Heniek&lt;/li&gt;
&lt;li id="resizableLi" &gt;kończysz robić&lt;/li&gt;
&lt;li id="resizableLi" &gt;kończysz robić&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Perl:&lt;/h5&gt;
&lt;p id="resizableP" &gt;

Marian robisz tak:
&lt;ul&gt;
&lt;li id="resizableLi" &gt;bierzesz kasę od Heniek&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli wciąż nie masz kasy sprzedajesz włosy Heńka.&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli wciąż nie masz kasy zatrudniasz się do kopania działki jakiejś babci.&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli wciąż nie masz kasy zatrudniasz się Heńka kopania działki jakiejś babci.&lt;/li&gt;
&lt;li id="resizableLi" &gt;idziesz do Sklep, hryyy, bierzesz bimber od Hela, hry, hryy, jeśli masz kasę kupujesz flaszkę.&lt;/li&gt;
&lt;li id="resizableLi" &gt;kaszl ; kaszl&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli nie masz bimber wyciągasz tajne zapasy z piwnicy sąsiada.&lt;/li&gt;
&lt;li id="resizableLi" &gt;jeśli nie masz flaszka to podkradasz z domu.&lt;/li&gt;
&lt;li id="resizableLi" &gt;wraczasz&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;Perl (wersja identyczna)&lt;/h5&gt;
&lt;p id="resizableP" &gt;

Marian robisz tak:
&lt;ul&gt;&lt;li id="resizableLi" &gt;b|erzesz kasę od msr Hen|ek&lt;/li&gt;
&lt;li id="resizableLi" &gt;|eśl| wc|ąż n|e masz ka$y sprzeda|esz włosy Heńka.&lt;/li&gt;
&lt;li id="resizableLi" &gt;|f wc|ąż n|e have ka$y zatródn|asz s|ę to kOpan|a dz|ałk| |ak|e|ś babc|.&lt;/li&gt;
&lt;li id="resizableLi" &gt;|eśl| wc|ąż n|e masz ka$y zatrudn|asz s|ę Heńka diging dz|ałk| |ak|e|ś babc|.&lt;/li&gt;
&lt;li id="resizableLi" &gt;|dz|esz do Sklep, hryyy, b|erzesz b|mber od Hela, hry, hryy, |eśl| masz kasę kupu|esz flaszkę.&lt;/li&gt;
&lt;li id="resizableLi" &gt;kaszl ; kaszl&lt;/li&gt;
&lt;li id="resizableLi" &gt;|eśl| n|e masz b|mber wyc|ągasz ta|ne zapasy z p|wn|cy sąs|ada.&lt;/li&gt;
&lt;li id="resizableLi" &gt;|eśl| n|e masz flaszka to podkradasz z house.&lt;/li&gt;
&lt;li id="resizableLi" &gt;wraaaaaaaczasz&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-5571314874317593885?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/5571314874317593885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2009/01/gdyby-ludzie-mwili-jzykami.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/5571314874317593885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/5571314874317593885'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2009/01/gdyby-ludzie-mwili-jzykami.html' title='Gdyby ludzie mówili językami programowania?'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-9055815241208092351</id><published>2008-12-30T00:32:00.036+01:00</published><updated>2011-03-03T19:28:02.439+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><title type='text'>What do I need in JDK ?</title><content type='html'>&lt;p id="resizableP" &gt;I'll put some staff that I found that are much problem from time to time for me.&lt;/p&gt;



&lt;p id="resizableP" &gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Lack of methods in File class...&lt;/li&gt;
&lt;li id="resizableLi" &gt;String Comparator...&lt;/li&gt;
&lt;li id="resizableLi" &gt;Thread Statics...&lt;/li&gt;
&lt;li id="resizableLi" &gt;Add .shrink() for StringBuffer &amp; StringBuilder...&lt;/li&gt;
&lt;li id="resizableLi" &gt;1st lvl type validation in standard Generics...&lt;/li&gt;
&lt;li id="resizableLi" &gt;Generics variables...&lt;/li&gt;
&lt;li id="resizableLi" &gt;Support for method to be able to return more than one variable...&lt;/li&gt;
&lt;li id="resizableLi" &gt;Extended printStackTrace...&lt;/li&gt;
&lt;li id="resizableLi" &gt;Read-Only Arrays...&lt;/li&gt;
&lt;li id="resizableLi" &gt;'forget' keyword...&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;




  &lt;h5 id="resizableH5" &gt;Add to File class:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;.copy(File)&lt;/li&gt;
&lt;li id="resizableLi" &gt;.compareFileData(File)&lt;/li&gt;
&lt;li id="resizableLi" &gt;. ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;String Comparator&lt;/h5&gt;
&lt;p id="resizableP" &gt;

String Comparator is horrible, it's provide much useless information. Who need 'this.charAt(k)-anotherString.charAt(k)' mixed with 'this.length()-anotherString.length()' ?&lt;br /&gt;
Let's see other way to implement comparator:&lt;br /&gt;
stringA.compare5StateTo(stringB)
&lt;ul&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;return -2&lt;/b&gt; if stringB is greater than stringA&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;return -1&lt;/b&gt; if stringB start with stringA&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;return 0&lt;/b&gt; if stringA equals stringB&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;return +1&lt;/b&gt; if stringA start with stringB&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;return +2&lt;/b&gt; if stringA is greater than stringB&lt;/li&gt;
&lt;/ul&gt;
Now time I need perform 3 operations to obtain same target.
&lt;/p&gt;






  &lt;h5 id="resizableH5" &gt;Thread Statics&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Static is global, but allow to make thread static would allow to remove 10~100% synchronization blocks. But it's really hard task and need to be deeply considered. Main problem is to prevent all thread-static data to be created with each thread, and make it available on demand only. Resources pool with auto–pinning to thread would be some solution as well.
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Add &lt;b&gt;.shrink()&lt;/b&gt; for &lt;i&gt;StringBuffer&lt;/i&gt; &amp; &lt;i&gt;StringBuilder&lt;/i&gt;&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Now time array inside of this Objects can only increase with it's size. This can be problem if happen that for one moment some one will put there a lot of data remove it and skip the object for new one.&lt;br /&gt;
Scenario:&lt;br /&gt;
We have 100  &lt;i&gt;StringBuffer&lt;/i&gt; shared between threads (so we cannot dispose memory).&lt;br /&gt;
In 99,9..% of time &lt;i&gt;StringBuffer&lt;/i&gt; store 1kb of data and in 0,001% there is 1mb of data.&lt;br /&gt;
In that case after some time there will be 100Mb unnecessarily allocated memory.&lt;br /&gt;
Other solution is conditional decreasing array size on &lt;b&gt;.remove()&lt;/b&gt; (I prefer that).
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;1st lvl type validation in standard Generics&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Personally I used to pass &lt;i&gt;Class&amp;lt;? super ComponentType&amp;gt;&lt;/i&gt; in constructor. This solution can to be done easily. With no backward impact.&lt;br /&gt;
This cannot be overestimated as one of the best solution to prevent stupid bugs.&lt;br /&gt;
Second solution is to add validators on .add(...). More powder full but not as easy to use as previous one. 
&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Generics variables&lt;/h5&gt;
&lt;p id="resizableP" &gt;
We have methods, classes, why there are no variables?&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Support for method to be able to return more than one variable&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Sample:
&lt;div class='table'&gt;
public &lt;span class='key' &gt;static&lt;/span&gt; (int:index, double avg) some(...){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (isRequested(index)) index = binarySearch(...);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (isRequested(avg)){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; main(...){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;int index;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;index=some(...).index;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;double avg;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;(index=.index,avg=.avg)=some(...);
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;some(...).{//here we have access to returned values here 
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (.avg&amp;gt;0){
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;};
&lt;br /&gt;}
&lt;/div&gt;
&lt;br /&gt;
Notice that &lt;b&gt;isRequested()&lt;/b&gt; is a method which tells us if parameter needs to be returned.&lt;/p&gt;



&lt;p id="resizableP" &gt;
Simple tuples are bad, the same as a return by reference because you need to remember parameters' sequence. That's why, even if we are able to return more than one value, we may have implemented the same method in a few different ways (and it's not so rare) depending on what we need. &lt;br /&gt;&lt;br /&gt;
You may do not see the power of this solution, however, when you analyze the given case you will see that the return values do not need to be counted if a used method is not requested for them.&lt;br /&gt;&lt;br /&gt;
Creating a new Class for that purpose is not a solution as well. If you analyze this you will see that it is not so rare to define unnecessary classes for each method ( or most of them) that do not allow us to tell if we need a full result or only part of it.
&lt;/p&gt;




&lt;p id="resizableP" &gt;
Have you ever wandered what you return when you add many elements to container? It really would be nice to get back:&lt;br /&gt;&lt;br /&gt;
Did even wander what would u return in case that when u add many elements to container.
What would be nice to get back?
&lt;ul&gt;
&lt;li id="resizableLi" &gt;number of added elements&lt;/li&gt;
&lt;li id="resizableLi" &gt;number of not added elements&lt;/li&gt;
&lt;li id="resizableLi" &gt;list of added elements&lt;/li&gt;
&lt;li id="resizableLi" &gt;list of not added elements&lt;/li&gt;
&lt;/ul&gt;

Of course, overkill might be a bad solution, as always.&lt;br /&gt;

 
I will describe it in more details on free time.
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Extend printStackTrace&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Allow to print stack trace only from throw exception point to exception handling point.
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Read-Only Arrays&lt;/h5&gt;
&lt;p id="resizableP" &gt;
It's really hard to pinpoint what solution would be best. &lt;br /&gt;
At first I wander about 'context' access like:&lt;br /&gt;
&lt;div class="table" &gt;Type[] readOnly =array.getReadOnly(from,to);&lt;br /&gt;
array[from] = t;&lt;br /&gt;
if (readOnly[0]==t) is always true&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
This would be peaty powder full solution, and it would allow to write more secure programs. Unfortunately every operation on arrays could bring unexpected problems if some one would use base array as buffer. Is that clear?&lt;br /&gt;
&lt;div class="table" &gt;System.arraycopy(readOnly, srcPos, array, destPos, length);&lt;/div&gt;&lt;br /&gt;
We need check if readOnly and array point same space!&lt;br /&gt;
&lt;br /&gt;
Other solution is about giving always read only arrays:&lt;br /&gt;
&lt;div class="table" &gt;Type[] readOnly =array.copyAsReadOnly(from,to)
array[from] = t;&lt;br /&gt;
if (readOnly[0]==t) can be false&lt;br /&gt;&lt;/div&gt;
&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;'forget' keyword&lt;/h5&gt;
&lt;p id="resizableP" &gt;
with 'forget':&lt;br /&gt;
&lt;div class="table"&gt;String data =readLine();&lt;br /&gt;
data =  operate(data);&lt;br /&gt;
boolean isOk = data.contains(“contains”);&lt;br /&gt;
forget data;&lt;br /&gt;
// here we do not have access to data object
&lt;/div&gt;&lt;br /&gt;
now time:&lt;br /&gt;
&lt;div class="table" &gt;boolean isOk;&lt;br /&gt;
{&lt;br /&gt;
  String data =readLine();&lt;br /&gt;
  data =  operate(data);&lt;br /&gt;
  isOk = data.contains(“contains”);&lt;br /&gt;
}&lt;br /&gt;
// here we do not have access to data object&lt;/div&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-9055815241208092351?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/9055815241208092351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2008/12/what-do-i-need-in-jdk.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/9055815241208092351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/9055815241208092351'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2008/12/what-do-i-need-in-jdk.html' title='What do I need in JDK ?'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-98327838766015831</id><published>2008-12-28T19:03:00.000+01:00</published><updated>2011-03-04T17:02:40.392+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Null handling: Small language changes on JDK 7</title><content type='html'>&lt;p id="resizableP" &gt;The idea is about allowing people to handle null object situation as easy as possible (here by new operator). And I agree with that since even before.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;




  &lt;h5 id="resizableH5" &gt;Discussion can be seen on:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;&lt;a href='http://groups.google.com/group/lublin-jug/browse_thread/thread/ea6b11dbc0b297d1?hl=pl' &gt;&lt;img class='cleanImg' src='http://alan.umcs.lublin.pl/~lasu/pl.gif'/&gt; Lublin JUG&lt;/a&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;a href='http://groups.google.com/group/polish-java-user-group/browse_thread/thread/29afc1d5e227a27c?hl=pl' &gt;&lt;img class='cleanImg' src='http://alan.umcs.lublin.pl/~lasu/pl.gif'/&gt; Polish JUG&lt;/a&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;a href='http://groups.google.com/group/pl.comp.lang.java/browse_thread/thread/d290ced113686b34/4753d18d694f43db' &gt;&lt;img class='cleanImg' src='http://alan.umcs.lublin.pl/~lasu/pl.gif'/&gt; pl.comp.lang.java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;




&lt;p id="resizableP" &gt;
Current (sample) implementation use '&lt;b&gt;?.&lt;/b&gt;' as operator, but in my opinion '&lt;b&gt;.?.&lt;/b&gt;' would be more appropriate, because '?' following directly by some name can be hardly noticed when we only inspect code. Example:&lt;br /&gt;
&lt;img src='http://i716.photobucket.com/albums/ww165/photo4lasu/nullOperator.jpg'&gt;&lt;br /&gt;
This attribute can be important for people who did not used to this operator.&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;Autoboxing issues&lt;/h5&gt;
&lt;p id="resizableP" &gt;
Most disputation about this operator connects with autoboxing issue where options are:
&lt;ul&gt;&lt;li id="resizableLi" &gt;Forbid autoboxing that is simple and should not bring any problems, as we still have if  and (?:).&lt;/li&gt;
&lt;li id="resizableLi" &gt;Turn on autoboxing that can kill program efficiency and through exception. &lt;/li&gt;
&lt;li id="resizableLi" &gt;Turn on autoboxing only if object is a target.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Add other operator to this one.&lt;/li&gt;&lt;/ul&gt;
Notice that forbidding autoboxing is a good solution because does not cause unnecessary syntax complication.
Autoboxing (if object is a target) responses to operator logic and what's important, it should not cause any additional bad impacts on program logic.
What more adding another operator may drastically increase code complication.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-98327838766015831?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/98327838766015831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2008/12/null-handling-small-language-changes-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/98327838766015831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/98327838766015831'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2008/12/null-handling-small-language-changes-on.html' title='Null handling: Small language changes on JDK 7'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-3407190573589597618</id><published>2008-12-28T15:45:00.027+01:00</published><updated>2011-03-03T19:15:23.905+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='optimisation'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>What did we loose with hiding object's address?</title><content type='html'>&lt;h5 id="resizableH5" &gt;Let's list advantages:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;More control over application security! Mostly, it's impossible to get forbidden information.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Information has to be delivered overtly.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Garbage collector can work easier, more reliable and it's not so rare to be  faster than manual deallocating memory. What's more, programmers have more time for code quality and efficiency.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Disadvantages:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Programmer is obliged to predict which data will be needed in future.&lt;/li&gt;
&lt;li id="resizableLi" &gt;&lt;b&gt;Natural (physical) objects order&lt;/b&gt; has been lost.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;



&lt;a name='more'&gt;&lt;/a&gt;




&lt;p id="resizableP" &gt;
Let's look closer to consequences of &lt;b&gt;natural ordered lost&lt;/b&gt;.
At first, it may seem like there is no negative impact and for most common problems it's truth.&lt;br /&gt;
Secondly, after a closer look we may notice that accessing objects by address is not necessary. However, there are some groups of algorithms that need some kind of order, like binary-search. For example:&lt;br /&gt;
We have two collections of objects and we wand to do some operation on them like: &lt;b&gt;intersection&lt;/b&gt;.&lt;/p&gt;




&lt;p id="resizableP" &gt;
&lt;b&gt;How big is that task (approximately)?&lt;/b&gt;&lt;br /&gt;
n : size of 1st collection&lt;br /&gt;
m : size of 2nd collection&lt;br /&gt;
k : average size important information in single object&lt;/p&gt;



&lt;p id="resizableP" &gt;
&lt;b&gt;Now time in java in &lt;i&gt;==&lt;/i&gt; sense :&lt;/b&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;&lt;i&gt;n*m&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;



&lt;p id="resizableP" &gt;
&lt;b&gt;Now time in java in &lt;i&gt;.equals(...)&lt;/i&gt; sense :&lt;/b&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;&lt;i&gt;n*m*k&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;



&lt;p id="resizableP" &gt;
&lt;b&gt;Now time if programmer provide Comparator (it might be impossible):&lt;/b&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;&lt;i&gt;min(n,m)*log(max(n,m))*k&lt;/i&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;+time to write valid comparator and rewrite it on any data structure change.&lt;/li&gt;
&lt;li id="resizableLi" &gt;+sorting time &lt;i&gt;n*log(n)*k + m*log(m)*k&lt;/i&gt; (this do not have to be done each time)&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;




&lt;p id="resizableP" &gt;
&lt;b&gt;Same task with some (like physical in memory) order:&lt;/b&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;&lt;i&gt;min(n,m)*log(max(n,m))&lt;/i&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;+sorting time &lt;i&gt;n*log(n) + m*log(m)&lt;/i&gt; (this do not have to be done each time)&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;




&lt;p id="resizableP" &gt;
So if we get some data (static for object) we would be able to make some algorithms real-time. For example, I may say that a simple optimalization of searching in a dictionary can widely decrease server's usage. For me, it was 30%. &lt;br /&gt;
It does not have to be address, Handle^someRandom is appropriate as well.&lt;br /&gt;
Solving this problem would not make the impact of all Java community, but it would allow to make reliable and fast tools for programmers that would be a great advantage.&lt;/p&gt;




&lt;p id="resizableP" &gt;
The main problem is that object address in Java is not constant, so I'll need to check if there are some static handlers that would allow to make one step forward after successful step back.&lt;/p&gt;



&lt;p id="resizableP" &gt;
Of course, I disagree with allowing to access object with handlers.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-3407190573589597618?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/3407190573589597618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2008/12/what-did-we-loose-with-hiding-objects.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/3407190573589597618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/3407190573589597618'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2008/12/what-did-we-loose-with-hiding-objects.html' title='What did we loose with hiding object&apos;s address?'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-3722395830200108203</id><published>2008-12-27T12:07:00.041+01:00</published><updated>2011-03-03T19:29:59.302+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>For-each loop: Small language changes on JDK 7</title><content type='html'>&lt;p id="resizableP" &gt;
Lets talk about:
&lt;ul&gt;&lt;li id="resizableLi" &gt;For-each loop over a Map&lt;/li&gt;
&lt;li id="resizableLi" &gt;Control over for-each loops (index/remove)&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;


&lt;p id="resizableP" &gt;
At first, I asked myself if it's possible to obtain those targets just by a simple code.?&lt;br /&gt;
It's not so clear for all, but answer is &lt;b&gt;YES&lt;/b&gt;.&lt;br /&gt;
However, there are still some small languages changes that would improve programming quality.&lt;/p&gt;




&lt;a name='more'&gt;&lt;/a&gt;




  &lt;h5 id="resizableH5" &gt;Indexing control over for-each loops&lt;/h5&gt;
&lt;p id="resizableP" &gt;&lt;b&gt;What would be the effect of adding indexing directly to for-each loop?&lt;/b&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Language syntax need to be extended.&lt;/li&gt;
&lt;li id="resizableLi" &gt;While loop can iterate more than MAX_INT there might be possibility to obtain exception (IndexOutOfBoundsException)&lt;/li&gt;
&lt;li id="resizableLi" &gt;We will not be able to obtain some more complicated indexes &lt;i&gt;(like even numbers, numbers started from 333, ...)&lt;/i&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;It's higher probability that when people get used to it they will want a more complicated syntax&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;




&lt;p id="resizableP" &gt;&lt;b&gt;What is the impact of other solutions?&lt;/b&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Implement &lt;b&gt;IntIterator&lt;/b&gt;, &lt;b&gt;LongIterator&lt;/b&gt; &lt;/li&gt;
&lt;li id="resizableLi" &gt;Possible to extend for-each loop with increment (initialization) expression &lt;b&gt;for (String s:array; intIterator.next()) { ... }&lt;/b&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;We would be able to index everything&lt;/li&gt;
&lt;li id="resizableLi" &gt;No negative impact during extending loop statement&lt;/li&gt;
&lt;li id="resizableLi" &gt;We could selectively index elements&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;



&lt;p id="resizableP" &gt;
   &lt;b&gt;Sample:&lt;/b&gt;&lt;br /&gt;
&lt;div class='table' &gt;&lt;span class='com' &gt;/*&lt;br /&gt;
&amp;nbsp;* @author Marek Kozieł&lt;br /&gt;
&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; IntIterator &lt;span class='key' &gt;extends&lt;/span&gt; Serializable {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/*&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* Returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; &lt;span class='key' &gt;if&lt;/span&gt; the iteration has more elements. (In other words, returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; &lt;span class='key' &gt;if&lt;/span&gt; &amp;lt;tt&amp;gt;next&amp;lt;/tt&amp;gt; would &lt;span class='key' &gt;return&lt;/span&gt; an element rather than throwing an exception.)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @return &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; &lt;span class='key' &gt;if&lt;/span&gt; the iterator has more elements.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; boolean hasNext();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/*&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* Returns the next element in the iteration.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @return the next element in the iteration.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @exception NoSuchElementException iteration has no more elements.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; int next();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; IntIteratorImpl &lt;span class='key' &gt;implements&lt;/span&gt; IntIterator {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; IntIteratorImpl() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last = 0 - 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; IntIteratorImpl(int starValue) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (starValue == Integer.MIN_VALUE) { throw new IllegalArgumentException("Start value(" + starValue + ") is unsupported"); }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last = starValue - 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; int&amp;nbsp;&amp;nbsp;last&amp;nbsp;&amp;nbsp;= 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; boolean hasNext() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; (last != Integer.MAX_VALUE);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; int next() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;if&lt;/span&gt; (last == Integer.MAX_VALUE) { throw new NoSuchElementException(); }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; (last++);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
}&lt;/div&gt;&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Removing control over for-each loops&lt;/h5&gt;

&lt;p id="resizableP" &gt;
&lt;b&gt;What would be the effect of adding indexing directly to for-each loop?&lt;/b&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Possible, but for loop should know if it's iterate through Iterator.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Syntax need to be extended like: &lt;br /&gt;&lt;b&gt;for.remove(...)&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;





&lt;p id="resizableP" &gt;&lt;b&gt;What is the impact of another solutions?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Allow for-each loop to iterate through Iterator not only through Iterable!&lt;/b&gt;&lt;br /&gt;
    &lt;ul&gt;&lt;li id="resizableLi" &gt;Will allow use more complicated Iterators!&lt;/li&gt;
&lt;li id="resizableLi" &gt;Container would be able to return easily few iterators &lt;i&gt;(Map  iterator over: keys, values, distinct values, keys &amp; values )&lt;/i&gt; without complicated objects structure.&lt;/li&gt;
&lt;li id="resizableLi" &gt;No syntax change is required!&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;






  &lt;h5 id="resizableH5" &gt;For-each loop over a Map&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;b&gt;What would be the effect of allowing loop to work on Map-s?&lt;/b&gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Language would become dependent from Map implementation&lt;/li&gt;
&lt;li id="resizableLi" &gt;Syntax need to be extended!&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;






&lt;p id="resizableP" &gt;&lt;b&gt;What is the impact of another solution?&lt;/b&gt;&lt;br /&gt;
I personally use solution that allow me to iterate through my own Map-s for a few months. Container is just able to return a few different iterators (see previous solution).&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Summary&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Language changes can have high negative impact.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Making language dependent from one implementation will skip people from implemending better ones.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Another sugestion: Allow for-each loop iterator through more than one container&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;b&gt;Effect:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li id="resizableLi" &gt;Syntax need to be extended:&lt;br /&gt; &lt;b&gt;for(String s: array,collection,iterator)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;if (for.current==array) { ... }&lt;/b&gt;&lt;/li&gt;
&lt;li id="resizableLi" &gt;Skipping people from writing a few loops with the same content!&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-3722395830200108203?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/3722395830200108203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2008/12/for-each-loop-small-language-changes-on.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/3722395830200108203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/3722395830200108203'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2008/12/for-each-loop-small-language-changes-on.html' title='For-each loop: Small language changes on JDK 7'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-2644117916357235338</id><published>2008-12-26T16:58:00.041+01:00</published><updated>2011-03-03T17:32:49.991+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='encapsulation'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk 7'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>String switch: Small language changes on JDK 7</title><content type='html'>&lt;p id="resizableP" &gt;According to &lt;a href="http://www.jroller.com/scolebourne/entry/jdk_7_language_changes_javaedge"&gt;Stephen Colebourne's Weblog: JDK 7 language changes - JavaEdge votes!&lt;/a&gt;&lt;br /&gt;
Allowing put String into switch statement is OK for me. But I cannot agree with placing that into JDK.&lt;br /&gt;
You can ask why. For me it's quite simple. Java is Object oriented language, while this change we make it more String or 'Script' oriented.
&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;

&lt;p id="resizableP" &gt;
I need to suggest other solution. Allow to use switch with any kind of object.&lt;br /&gt;
In that case we would have add 2 or more switch statement.&lt;/p&gt;




&lt;p id="resizableP" &gt;How would that look?&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Base Interfaces:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table' &gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; Equally&amp;lt;Type&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @return true &lt;span class='key' &gt;if&lt;/span&gt; objects are equal&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;boolean equal(Type object, Type other);&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;div class='table' &gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; EquallyAsymmetric&amp;lt;Source,Target&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @return true &lt;span class='key' &gt;if&lt;/span&gt; objects are equal&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;boolean equal(Source source, Target target);&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;div class='table' &gt;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;interface&lt;/span&gt; ComparatorAsymmetric&amp;lt;Source,Target&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;int compare(Source source, Target target);&lt;br /&gt;
}&lt;/div&gt;&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Switch:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table' &gt;switch ( Expression : Equally) SwitchBlock&lt;/div&gt;&lt;br /&gt;
&lt;div class='table' &gt;switch ( Expression : EquallyAsymmetric) SwitchBlock&lt;/div&gt;&lt;br /&gt;
&lt;div class='table' &gt;switch ( Expression : Comparator) SwitchBlock&lt;/div&gt;&lt;br /&gt;
&lt;div class='table' &gt;switch ( Expression : ComparatorAsymmetric) SwitchBlock&lt;/div&gt;&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;How would that work?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table' &gt;public &lt;span class='key' &gt;class&lt;/span&gt; SomeData {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; SomeData(String key, Data data) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.key = key;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.data = data;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// validation&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; Data data;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; String key;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; Equally&amp;lt;SomeData&amp;gt; equally = new EquallySomeData();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; EquallyAsymmetric&amp;lt;SomeData, String&amp;gt; equallyAsymmetric = new EquallyAsymmetricSomeData();&amp;nbsp;&amp;nbsp;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;final&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; Comparator&amp;lt;SomeData&amp;gt; comparator = new ComparatorSomeData();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; ComparatorSomeData implements Comparator&amp;lt;SomeData&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; int compare(SomeData o1, SomeData o2) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; o1.key.compareTo(o2.key);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; EquallyAsymmetricSomeData implements EquallyAsymmetric&amp;lt;SomeData, String&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; boolean equal(SomeData source, String target) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; source.key.equals(target);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;private&lt;/span&gt; &lt;span class='key' &gt;static&lt;/span&gt; &lt;span class='key' &gt;class&lt;/span&gt; EquallySomeData implements Equally&amp;lt;SomeData&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; boolean equal(SomeData object, SomeData other) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; object.key.equals(other.key);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
}&lt;/div&gt;&lt;/p&gt;




  &lt;h5 id="resizableH5" &gt;Equally sample:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table' &gt;SomeData getMatch(String key)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&lt;span class='key' &gt;switch&lt;/span&gt; (new SomeData(key,null):SomeData.equally) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;case&lt;/span&gt; someData:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;default:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/div&gt;&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Equally asymmetric sample:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table' &gt;SomeData getMatch(String key)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&lt;span class='key' &gt;switch&lt;/span&gt; (new SomeData(key,null):SomeData.equallyAsymmetric ) {&lt;br /&gt;
&amp;nbsp;&lt;span class='key' &gt;case&lt;/span&gt; „some”:&lt;br /&gt;
&amp;nbsp;&lt;span class='key' &gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&lt;span class='key' &gt;default:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&lt;span class='key' &gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
}&lt;/div&gt;&lt;/p&gt;





  &lt;h5 id="resizableH5" &gt;Comparator sample:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;div class='table' &gt;SomeData getMatch(String key)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&lt;span class='key' &gt;switch&lt;/span&gt; (new SomeData(key,null):SomeData.equallyAsymmetric ) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;case&lt;/span&gt; lower &amp;lt;= ... &amp;lt; upper:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;default:&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;break&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
}&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Asymmetric look on operation allow to keep encapsulation while perform operation we need.&lt;/p&gt;

&lt;p&gt;
@see &lt;a href="http://lasu2string.blogspot.com/2009/02/using-strings-and-objects-in-switch.html"&gt;Using Strings and Objects in Switch case statements&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-2644117916357235338?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/2644117916357235338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2008/12/string-switch-small-language-changes-on.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/2644117916357235338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/2644117916357235338'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2008/12/string-switch-small-language-changes-on.html' title='String switch: Small language changes on JDK 7'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3916529971656854151.post-2333581790835258440</id><published>2008-12-19T20:15:00.014+01:00</published><updated>2011-03-03T17:20:12.247+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javadoc'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='evolution'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Is Javadoc killing program evolution?</title><content type='html'>&lt;h5 id="resizableH5" &gt;Hello!&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;img src="http://alan.umcs.lublin.pl/~lasu/emots/kichot.gif" /&gt;&lt;br /&gt;
When I found what &lt;span style="font-weight: bold;"&gt;Javadoc&lt;/span&gt; was, I was totally impressed. The way that it made code more readable was increadible for me. So it didn't take too much time until I used to comment each class, method and parameter. I did that in one project and was satisfied with results. However, in the second one I found a problem that improving Javadoc after rebuilding some parts of code took even 3x more time and efford than it should have. That's why nowadays, I'm used to providing comments as little as possible. This doesn't mean that I avoid using Javadoc. I just try to make it as brief as possible, omitting as much as I can without harming a project.&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;

  &lt;h5 id="resizableH5" &gt;What is the reason?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Let's use a standard library &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Arrays.html"&gt;java.util.Arrays&lt;/a&gt; as an example in which each comment is repeated 1~8+ times with immortal [CTRL +C] [CTRL +V]. &lt;/li&gt;
&lt;li id="resizableLi" &gt;In code I use approximately 30% of my classes, 30% of base types &amp; classes, 30% of generic classes. For those generics there's also no dedicated tag to describe parameter type for generic. What's more, if I declare generic, there is no way to make a nice description for it as well (this include simple arrays too).&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;What do we lose?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Each time when we make some changes, we need to search for all comments and fix them.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Even if all code works fine and we want only to improve documentation, we need to search all places where documentation is pleased.&lt;/li&gt;
&lt;li id="resizableLi" &gt;If we use generics, we need to search the way to describe it clearly and we also should have a hope that someone reading it will understand comments in the same (our) way.&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;What do I expect?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Javadoc support for convention. I want to be able to define one describe for parameter, method, variable, ... and reuse it.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Reusing docs from implemented interfaces (classes).&lt;/li&gt;
&lt;li id="resizableLi" &gt;Being able to describe generic once I define and use them.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Being able to call direct parameters(safe for refactor).&lt;/li&gt;
&lt;li id="resizableLi" &gt;Support for multi-language comments&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;

  &lt;h5 id="resizableH5" &gt;What would that give to me?&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;ul&gt;&lt;li id="resizableLi" &gt;Evolution Javadoc in the same speed as code.&lt;/li&gt;
&lt;li id="resizableLi" &gt;Improvement in usage. It would direct people to use the same names for the same aims.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


  &lt;h5 id="resizableH5" &gt;Sample:&lt;/h5&gt;
&lt;p id="resizableP" &gt;

&lt;div class='table' &gt;&lt;br /&gt;
&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;* ...&lt;br /&gt;
&amp;nbsp;* @paramconv element element that will be proceed&lt;br /&gt;
&amp;nbsp;* @methodconv addFromCollection add all elements from given container&lt;br /&gt;
&amp;nbsp;* @gen Unit component &lt;span class='key' &gt;for&lt;/span&gt; this &lt;span class='key' &gt;class&lt;/span&gt; ...&lt;br /&gt;
&amp;nbsp;* @author Marek Kozieł&lt;br /&gt;
&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&lt;span class='key' &gt;public&lt;/span&gt; abstract &lt;span class='key' &gt;class&lt;/span&gt; DocSample&amp;lt;Unit&amp;gt; implements List&amp;lt;Unit&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* ... &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;class&lt;/span&gt; Entry&amp;lt;K, V&amp;gt; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @gen ArrayList#1 pair key and value&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @get ArrayList#1#K Key &lt;span class='key' &gt;for&lt;/span&gt; list of units&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @gen ArrayList#1#V List of units&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @get ArrayList#1#2#1 unit ... &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;ArrayList&amp;lt;Entry&amp;lt;String, List&amp;lt;Unit&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;list;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @methodinherit&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* {@link #add(Object)#index} index at which to insert the first element from the specified collection&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @paraminherit index&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param element&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &lt;span class='key' &gt;void&lt;/span&gt; add(int index, Unit element) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// TODO Auto-generated method stub&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @methodconv&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param iterator ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; int addFromCollection(Iterator&amp;lt;? extends Unit&amp;gt; iterator) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int count = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;while&lt;/span&gt; (iterator.hasNext()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count += (add(iterator.next())?1:0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; count;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @methodconv&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param iterable ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; int addFromCollection(Iterable&amp;lt;? extends Unit&amp;gt; iterable) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; addFromCollection(iterable.iterator());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @methodconv&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @param array ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;public&lt;/span&gt; &amp;lt;EUnit extends Unit&amp;gt; int addFromCollection(EUnit[] array) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int count = 0;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;for&lt;/span&gt; (EUnit eUnit : array) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count += (add(eUnit)?1:0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class='key' &gt;return&lt;/span&gt; count;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @paramconv element&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;abstract &lt;span class='key' &gt;public&lt;/span&gt; boolean add(Unit element);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class='com' &gt;/**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;* @paramconv element&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;abstract &lt;span class='key' &gt;public&lt;/span&gt; int remove(Unit element);&lt;br /&gt;
&lt;br /&gt;
}&lt;/div&gt;
&lt;/p&gt;



  &lt;h5 id="resizableH5" &gt;Meaning:&lt;/h5&gt;
&lt;p id="resizableP" &gt;
&lt;span style="font-weight: bold;"&gt;@gen&lt;/span&gt; : represent generic parameter&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;@paramconv&lt;/span&gt; : get describe from same name @paramconv from class comment.&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;@methodconv&lt;/span&gt; : get describe from same name @methodconv from class comment.&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;@methodinherit&lt;/span&gt; : get describe from implemented Interface / Class from override method&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;@methodinherit(Interface/Class)&lt;/span&gt; : get describe from given implemented Interface / Class from override method&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;@paraminherit&lt;/span&gt; index ...&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;@paraminherit(Interface/Class)&lt;/span&gt; index ..&lt;br /&gt;
&lt;br /&gt;
For&lt;br /&gt;
ArrayList&amp;lt;Entry&amp;lt;String, List&amp;lt;Unit&amp;gt;&amp;gt;&amp;gt;  list;&lt;br /&gt;
describe would look like:&lt;br /&gt;
&lt;br /&gt;
ArrayList&amp;lt; ... &amp;gt; :&lt;br /&gt;
-Entry&amp;lt; ... , ... &amp;gt; : pair key and value&lt;br /&gt;
--String : Key for list of units&lt;br /&gt;
--List&amp;lt; ... &amp;gt; : List of units&lt;br /&gt;
---Unit : unit ...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3916529971656854151-2333581790835258440?l=lasu2string.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lasu2string.blogspot.com/feeds/2333581790835258440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lasu2string.blogspot.com/2008/12/is-javadoc-killing-program-evolution.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/2333581790835258440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3916529971656854151/posts/default/2333581790835258440'/><link rel='alternate' type='text/html' href='http://lasu2string.blogspot.com/2008/12/is-javadoc-killing-program-evolution.html' title='Is Javadoc killing program evolution?'/><author><name>Lasu aka Marek Kozieł</name><uri>http://www.blogger.com/profile/02386422649418906804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__fPcHgMbKgo/SVU9EcPmYII/AAAAAAAAAC0/EUFFXwq1Eec/S220/Lasu_94x94.gif'/></author><thr:total>3</thr:total></entry></feed>
