tag:blogger.com,1999:blog-83266427064731915552024-02-19T08:41:29.772-08:00Sun Certified Java Programmer (SCJP)Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.comBlogger29125tag:blogger.com,1999:blog-8326642706473191555.post-20472447902754903462010-02-12T08:30:00.000-08:002010-02-12T08:30:58.633-08:00Fin del Blog<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">Como lo dice el título, este es el último post de este blog. Sin embargo, los temas tratados en este mismo, se seguirán manteniendo a través del blog <a href="http://onj2ee.blogspot.com/">http://onj2ee.blogspot.com/</a> debido a que permite una mejor organización, y además se tratan temas relacionados a muchas tecnologías (principalmente a Java y J2EE).</div><div style="text-align: justify;">OnJ2EE es el nombre de este blog, pero en realidad (como ya se menciono) este no se limita a esta plataforma.</div><div style="text-align: justify;">De más esta decir que invito a todos los seguidores, lectores y visitantes del blog a seguirme a través de mi nuevo blog.</div><div style="text-align: justify;">Acutlamente en el blog OnJ2EE se están tratando temas relacionados a las certificaciones SCJP, SCWCD y SCBCD.<br />
</div><div style="text-align: justify;"></div><div style="text-align: justify;">Saludos</div><div style="text-align: justify;"><div class="separator" style="clear: both; text-align: center;"><a href="http://onj2ee.blogspot.com/" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="97" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-9bPAlPesCOUiS-4fEIEcrADAextZHm3HenXBZywO9B4V1tf1Me-HpQdDeiKcWj-PscYrL5GcPZmuO2jqZeRkIRSEEw9-DexZiNAoIBs7t1IpKk5uHkGk6vbyuDjUGbnaF-rNDfF7kY/s400/onj2ee_black.jpg" width="400" /></a></div></div><div style="text-align: justify;"><br />
</div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com1tag:blogger.com,1999:blog-8326642706473191555.post-67460579959443377112009-12-30T08:54:00.001-08:002009-12-30T08:56:40.393-08:00JavaWorld - SCJP - Capítulo 3<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">Bienvenidos a una nueva entrega de JavaWorld.<br />
A partir de este capítulo introducimos una nueva sección dedicada a la industria del software desde una perspectiva comercial.<br />
El encargado de estas notas es nuestro diseñador y estudiante de ingeniería industrial Leonardo Blanco. Pueden pasar por su <a href="http://valorcreativo.blogspot.com/">blog</a> para ver esto y más de otros temas.<br />
Como presente para navidad queremos anunciar que las publicaciones de cada capítulo se realizarán cada semana. Espero que les guste.<br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><img border="0" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyNjIxOTE2ODU3OTYmcHQ9MTI2MjE5MTY4NzY4NyZwPTEwMTkxJmQ9V*ZfZW1iZWRfZG9jdW1lbnQmZz*yJm89NjQzODQ2NWU*MWMxNDE*MDg3YzExYjQ5YjQwOTQwZDYmb2Y9MA==.gif" style="height: 0px; visibility: hidden; width: 0px;" width="0" /><br />
<div id="__ss_2779639" style="text-align: left; width: 477px;"><a href="http://www.slideshare.net/zurielcode/javaworld-scjp-capitulo-3" style="display: block; font-family: Helvetica,Arial,Sans-serif; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 12px 0pt 3px; text-decoration: underline;" title="JavaWorld - SCJP - Capitulo 3">JavaWorld - SCJP - Capitulo 3</a><object height="510" style="margin: 0px;" width="477"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=capitulo3-091226182742-phpapp01&stripped_title=javaworld-scjp-capitulo-3" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=capitulo3-091226182742-phpapp01&stripped_title=javaworld-scjp-capitulo-3" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="477" height="510" FlashVars="gig_lt=1262191685796&gig_pt=1262191687687&gig_g=2"></embed> <param name="FlashVars" value="gig_lt=1262191685796&gig_pt=1262191687687&gig_g=2" /></object><br />
<div style="font-family: tahoma,arial; font-size: 11px; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/zurielcode" style="text-decoration: underline;">Universidad Tecnológica Nacional</a>.<br />
</div></div></div><div style="text-align: justify;"><span style="font-size: small;"> </span><br />
</div><div style="text-align: justify;"><span style="font-size: small;">O puedes descargarlo de <a href="http://thechroniclesofbinary.googlecode.com/files/Capitulo%203.pdf">aquí</a>.</span><br />
<span style="font-size: small;"><br />
</span><br />
<span style="font-size: small;">Grupo dentro del OSUM:</span><br />
<span style="font-size: small;"><a href="http://osum.sun.com/group/utn_mdp/forum/topics/javaworld-scjp">UTN - Centro de estudios Mar del Plata</a></span><br />
<span style="font-size: small;"> </span><br />
<span style="font-size: small;"> </span><br />
</div><div style="font-family: Times,"Times New Roman",serif;"><span style="font-size: small;">Autores:</span><br />
</div><div style="font-family: Times,"Times New Roman",serif;"><span style="font-size: small;"><a href="http://www.blogger.com/post-create.g?blogID=3087772918919355922">Gustavo Alberola</a> - <a href="http://gustavoalberola.blogspot.com/">Blog</a></span><br />
</div><div style="font-family: Times,"Times New Roman",serif;"><span style="font-size: small;"><a href="http://www.blogger.com/post-create.g?blogID=3087772918919355922">Matias Alvarez</a> - <a href="http://onj2ee.blogspot.com/">Blog</a></span><br />
<span style="font-size: small;"><br />
</span><br />
</div><div style="font-family: Times,"Times New Roman",serif;"><span style="font-size: small;">Diseñador:</span><br />
</div><span style="font-size: small;"><a href="http://www.blogger.com/post-create.g?blogID=3087772918919355922">Leonardo Blanco</a> - <a href="http://valorcreativo.blogspot.com/">Blog</a></span><br />
<div style="text-align: justify;"><br />
<div style="text-align: justify;">Desde aquí pueden acceder a todos los números: <br />
</div><div style="text-align: justify;"><a href="http://scjp-preparacion.googlecode.com/files/JavaWorld%20-%20Revista%20Digital%20-%20SCJP%20Capitulo%201.pdf" style="white-space: nowrap;">JavaWorld - Revista Digital - SCJP Capitulo 1.pdf </a><br />
</div><div style="text-align: justify;"><a href="http://scjp-preparacion.googlecode.com/files/JavaWorld%20-%20Revista%20Digital%20-%20SCJP%20Capitulo%202.pdf" style="white-space: nowrap;">JavaWorld - Revista Digital - SCJP Capitulo 2.pdf</a><br />
<table border="0" cellpadding="2" cellspacing="0" class="results" id="resultstable"><tbody>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"></tr>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"> <td class="vt id col_0"><a href="http://scjp-preparacion.googlecode.com/files/JavaWorld%20-%20Revista%20Digital%20-%20SCJP%20Capitulo%203.pdf" style="white-space: nowrap;"> JavaWorld - Revista Digital - SCJP Capitulo 3.pdf </a><br />
</td></tr>
</tbody></table><br />
</div><div style="text-align: justify;"><table border="0" cellpadding="2" cellspacing="0" class="results" id="resultstable"><tbody>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"> <td class="vt id col_0"></td></tr>
</tbody></table></div><table border="0" cellpadding="2" cellspacing="0" class="results" id="resultstable" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"> <td class="vt id col_0"></td></tr>
</tbody></table><table border="0" cellpadding="2" cellspacing="0" class="results" id="resultstable" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"></tr>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"> <td class="vt id col_0"><a href="http://scjp-preparacion.googlecode.com/files/JavaWorld%20-%20Revista%20Digital%20-%20SCJP%20Capitulo%202.pdf" style="white-space: nowrap;"> </a><br />
</td><td class="vt id col_0"><br />
</td></tr>
</tbody></table><div style="text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-9bPAlPesCOUiS-4fEIEcrADAextZHm3HenXBZywO9B4V1tf1Me-HpQdDeiKcWj-PscYrL5GcPZmuO2jqZeRkIRSEEw9-DexZiNAoIBs7t1IpKk5uHkGk6vbyuDjUGbnaF-rNDfF7kY/s1600-h/onj2ee_black.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-9bPAlPesCOUiS-4fEIEcrADAextZHm3HenXBZywO9B4V1tf1Me-HpQdDeiKcWj-PscYrL5GcPZmuO2jqZeRkIRSEEw9-DexZiNAoIBs7t1IpKk5uHkGk6vbyuDjUGbnaF-rNDfF7kY/s320/onj2ee_black.jpg" /></a><br />
</div><div style="text-align: justify;"></div>Recuerden que cualquier comentario o duda que les surga la pueden hacer en el <a href="http://osum.sun.com/group/utn_mdp">grupo de la UTN</a>, o a través de mi blog nuevo. <a href="http://onj2ee.blogspot.com/">http://onj2ee.blogspot.com/</a> <br />
</div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-10351825129291729432009-12-16T03:08:00.000-08:002009-12-16T03:10:52.622-08:00JavaWorld - SCJP - Capítulo 2<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;"><a href="http://onj2ee.blogspot.com/">http://onj2ee.blogspot.com/</a>Gente, ya esta listo el segundo número de la revista digital JavaWorld. Recuerden que a esta revista se le da seguimiento a través del grupo '<a href="http://osum.sun.com/group/utn_mdp">UTN - Centro de estudios Mar del Plata</a>'. Pueden seguir este <a href="http://osum.sun.com/group/utn_mdp/forum/topics/javaworld-scjp">post</a> el cual se va actualizando con los nuevos número y todo tipo de novedades.<br />
</div><div style="text-align: justify;">Espero les sea de utilidad.<br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><img border="0" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyNjA4ODkwODE3NTAmcHQ9MTI2MDg4OTA4NzA2MiZwPTEwMTkxJmQ9V*ZfZW1iZWRfZG9jdW1lbnQmZz*yJm89NjQzODQ2NWU*MWMxNDE*MDg3YzExYjQ5YjQwOTQwZDYmb2Y9MA==.gif" style="height: 0px; visibility: hidden; width: 0px;" width="0" /><br />
</div><div id="__ss_2722588" style="text-align: justify; width: 477px;"><a href="http://www.slideshare.net/zurielcode/javaworld-scjp-capitulo-2" style="display: block; font-family: Helvetica,Arial,Sans-serif; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; margin: 12px 0pt 3px; text-decoration: underline;" title="JavaWorld - SCJP - Capitulo 2">JavaWorld - SCJP - Capitulo 2</a><object height="510" style="margin: 0px;" width="477"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=capitulo2-091215072402-phpapp02&stripped_title=javaworld-scjp-capitulo-2"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="never"></param><embed src="http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=capitulo2-091215072402-phpapp02&stripped_title=javaworld-scjp-capitulo-2" type="application/x-shockwave-flash" allowscriptaccess="never" width="477" height="510" flashvars="gig_lt=1260889081750&gig_pt=1260889087062&gig_g=2"></embed> <param name="FlashVars" value="gig_lt=1260889081750&gig_pt=1260889087062&gig_g=2"></param></object><br />
<div style="font-family: tahoma,arial; font-size: 11px; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/zurielcode" style="text-decoration: underline;">Universidad Tecnológica Nacional</a>.<br />
</div></div><div style="text-align: justify;">Autores:<br />
</div><div style="text-align: justify;"><a href="http://osum.sun.com/profile/GustavoAlberola">Gustavo Alberola</a> - <a href="http://gustavoalberola.blogspot.com/">Blog</a><br />
</div><div style="text-align: justify;"><a href="http://osum.sun.com/profile/MatiasAlvarez">Matías Alvarez</a> - <a href="http://onj2ee.blogspot.com/">Blog</a><br />
</div><div style="text-align: justify;">Diseño: Leonardo Blanco - <a href="http://valorcreativo.blogspot.com/">Blog</a><br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Desde aquí pueden acceder a todos los números: <br />
</div><table border="0" cellpadding="2" cellspacing="0" class="results" id="resultstable" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"></tr>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"> <td class="vt id col_0"><a href="http://scjp-preparacion.googlecode.com/files/JavaWorld%20-%20Revista%20Digital%20-%20SCJP%20Capitulo%201.pdf" style="white-space: nowrap;"> JavaWorld - Revista Digital - SCJP Capitulo 1.pdf </a><br />
</td></tr>
</tbody></table><table border="0" cellpadding="2" cellspacing="0" class="results" id="resultstable" style="margin-left: 0px; margin-right: 0px; text-align: left;"><tbody>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"></tr>
<tr class="" onmouseout="_rowRolloverOff(this); cancelBubble=false" onmouseover="_rowRolloverOn(this)"> <td class="vt id col_0"><a href="http://scjp-preparacion.googlecode.com/files/JavaWorld%20-%20Revista%20Digital%20-%20SCJP%20Capitulo%202.pdf" style="white-space: nowrap;"> JavaWorld - Revista Digital - SCJP Capitulo 2.pdf </a><br />
</td></tr>
</tbody></table><div style="text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-9bPAlPesCOUiS-4fEIEcrADAextZHm3HenXBZywO9B4V1tf1Me-HpQdDeiKcWj-PscYrL5GcPZmuO2jqZeRkIRSEEw9-DexZiNAoIBs7t1IpKk5uHkGk6vbyuDjUGbnaF-rNDfF7kY/s1600-h/onj2ee_black.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-9bPAlPesCOUiS-4fEIEcrADAextZHm3HenXBZywO9B4V1tf1Me-HpQdDeiKcWj-PscYrL5GcPZmuO2jqZeRkIRSEEw9-DexZiNAoIBs7t1IpKk5uHkGk6vbyuDjUGbnaF-rNDfF7kY/s320/onj2ee_black.jpg" /></a><br />
</div><div style="text-align: justify;">Recuerden que cualquier comentario o duda que les surga la pueden hacer en el <a href="http://osum.sun.com/group/utn_mdp">grupo de la UTN</a>, o a través de mi blog nuevo. <a href="http://onj2ee.blogspot.com/">http://onj2ee.blogspot.com/</a> <br />
</div><div style="text-align: justify;"></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-38288373996413068122009-12-09T06:14:00.000-08:002009-12-09T06:17:41.615-08:00OnJ2EE<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">Hace unos días creé un nuevo <a href="http://onj2ee.blogspot.com/">blog</a> enfocado al desarrollo en general pero más que nada a la plataforma Java (J2EE más que nada, JavaFX, JavaSE, etc.). <a href="http://onj2ee.blogspot.com/">OnJ2EE </a>es el nombre de este blog, pero como ya comenté, este no se limita solo a esta plataforma. Entre los temas tratados en el blog, comienzo con la certificación SCWCD que es para lo que me estoy preparando actualmente.<br />
</div><div style="text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-9bPAlPesCOUiS-4fEIEcrADAextZHm3HenXBZywO9B4V1tf1Me-HpQdDeiKcWj-PscYrL5GcPZmuO2jqZeRkIRSEEw9-DexZiNAoIBs7t1IpKk5uHkGk6vbyuDjUGbnaF-rNDfF7kY/s1600-h/onj2ee_black.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh-9bPAlPesCOUiS-4fEIEcrADAextZHm3HenXBZywO9B4V1tf1Me-HpQdDeiKcWj-PscYrL5GcPZmuO2jqZeRkIRSEEw9-DexZiNAoIBs7t1IpKk5uHkGk6vbyuDjUGbnaF-rNDfF7kY/s320/onj2ee_black.jpg" /></a>En la barra derecha del blog podrán encontrar los feeds del blog <a href="http://onj2ee.blogspot.com/">OnJ2EE</a>.<br />
</div><div style="text-align: justify;">Saludos y espero que les guste.<br />
</div><div style="text-align: justify;">Cualquier aporte será bienvenido.<br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><a href="http://onj2ee.blogspot.com/">http://onj2ee.blogspot.com/</a><br />
</div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-41668075248639977292009-11-30T13:07:00.000-08:002009-11-30T13:12:45.868-08:00JavaWorld - SCJP - Capítulo 1<div style="margin-left: 20px; margin-right: 20px;">JavaWorld es una revista digital creada para que otros estudiantes y/o profesionales que deseen rendir las certificaciones o adentrarse en el mundo de Java tengan otra alternativa para hacerlo. El autor de esta revista es Gustavo Alberola, miembro de la comunidad <a href="http://osum.sun.com/group/utn_mdp">UTN - Centro de estudios Mar del Plata</a>. Cualquier aporte, consulta o comentario se puede realizar a través de este grupo.<br />En esta primer entrega de JavaWorld y este es el primer número de la serie SCJP (Sun Certified Java Programmer).<br />Espero les sea de utilidad.<br /><br /><img style="visibility: hidden; width: 0px; height: 0px;" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyNTk2MTMxNTkwMzEmcHQ9MTI1OTYxMzk4NDc4MSZwPTEwMTkxJmQ9V*ZfZW1iZWRfZG9jdW1lbnQmZz*yJm89NjQzODQ2NWU*MWMxNDE*MDg3YzExYjQ5YjQwOTQwZDYmb2Y9MA==.gif" width="0" border="0" height="0" /><div style="width: 477px; text-align: left;" id="__ss_2617047"><a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/zurielcode/javaworld-scjp-capitulo-1" title="JavaWorld - SCJP - Capitulo 1">JavaWorld - SCJP - Capitulo 1</a><object style="margin: 0px;" width="477" height="510"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=capitulo1-091130140722-phpapp01&stripped_title=javaworld-scjp-capitulo-1"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="never"><embed wmode="opaque" src="http://static.slidesharecdn.com/swf/ssplayerd.swf?doc=capitulo1-091130140722-phpapp01&stripped_title=javaworld-scjp-capitulo-1" type="application/x-shockwave-flash" allowscriptaccess="never" flashvars="gig_lt=1259613159031&gig_pt=1259613984781&gig_g=2" width="477" height="510"></embed> <param name="FlashVars" value="gig_lt=1259613159031&gig_pt=1259613984781&gig_g=2"></object><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration: underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration: underline;" href="http://www.slideshare.net/zurielcode">Universidad Tecnológica Nacional</a>.</div></div><br />O puedes descargarlo de <a href="http://thechroniclesofbinary.googlecode.com/files/Capitulo%201.pdf">aquí</a><br /><br />Autor: <a href="http://osum.sun.com/profile/GustavoAlberola">Gustavo Alberola</a> - <a href="http://gustavoalberola.blogspot.com/">Blog</a><br />Diseño: Leonardo Blanco - <a href="http://valorcreativo.blogspot.com/">Blog</a></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com1tag:blogger.com,1999:blog-8326642706473191555.post-35673639618506471452009-11-18T05:04:00.000-08:002009-11-18T05:11:12.745-08:00OSUM<div style="margin-left: 20px; margin-right: 20px;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAyWt6oP-DJAJ2zoZotEPsHN1gbmbk6mqLxRprj-EPl6OEadRSTRoazuOwUVtwILxMz-qPn2ZRjI8jTf0ZLyg576aIGnklBuA-HcCZV5aq2nyGaLxyuw7NI5STtRn6xQrDU9LRoSO40zs/s400/OSUM.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 437px; height: 124px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAyWt6oP-DJAJ2zoZotEPsHN1gbmbk6mqLxRprj-EPl6OEadRSTRoazuOwUVtwILxMz-qPn2ZRjI8jTf0ZLyg576aIGnklBuA-HcCZV5aq2nyGaLxyuw7NI5STtRn6xQrDU9LRoSO40zs/s400/OSUM.png" alt="" border="0" /></a><span style="font-weight: bold;">OSUM (Open Source University Meet up)</span><br />OSUM es una red social creada por la empresa Sun, que tiene como objetivo crear una comunidad de estudiantes y desarrolladores que utilizan FOSS (Free Open Source Software) y todo tipo de tecnologías Open Source. Si bien, esta comunidad esta creada por Sun, la misma no se limita a los productos de esta empresa.<br />OSUM brinda a sus miembros:<br /><ul><li>Cursos y entrenamiento en las tecnologías con más demanda por la industria IT.</li><li>Acceso a recursos para mejorar sus carreras y habilidades.</li><li>La oportunidad de conocer gente alrededor de todo el mundo que utilice estas tecnologías.<br /></li></ul><span style="font-weight: bold;">Grupos OSUM</span><br />Esta red social, esta compuesta por grupos (o clubs) OSUM. Estos están integrados por universitarios pertenecientes a instituciones de todo el mundo. Se componen de estudiantes, profesores, y todas aquellas personas que quieran compartir sus conocimientos y colaborar para crear una comunidad de software libre en su ciudad.<br />Sun provee las herramientas necesarias para la organización y evolución de estos grupos, como:<br /><ul><li>Cursos gratuitos on-line.</li><li>Material para realizar eventos y charlas.</li><li>Material para ayudar a crear grupos de estudio.</li><li>Entrenamiento y asistencia a los OSUM's leader.</li><li>Descuentos en certificaciones JAVA, OpenSolaris y MySQL.</li></ul><span style="font-weight: bold;">Grupo OSUM: UTN - Centro de estudios Mar del Plata</span><br /><br />Este es un grupo OSUM de la UTN (Centro de estudios Mar del Plata), que tiene como objetivos:<br /><ul><li>Crear una comunidad de estudiantes (de la UTN y otras instituciones), desarrolladores y profesores, para mejorar la comunicación, generar eventos y brindar todo tipo de información relacionada a las tecnologías Open Source.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://osum.sun.com/group/utn_mdp"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 110px; height: 110px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh58_mhaXrEinhC5LeZmqz3RCaycAwWkDdTRQqwU5-X9SEZCzHg_Ayg6dcOnQKPC0DYovOwlV5Cm8cFSfzHj69_GC_qnW74wvxv52VIsx7G2CZRFune9pbEtZZ1Tkp7ER9NdDApQcWEYO8/s320/grupoUTNmdp.jpg" alt="" border="0" /></a></li><li>Crear grupos de estudio para prepararse para rendir certificaciones, sin la necesidad de tomar cursos (que son bastante costosos) en otras ciudades.</li><li>Que sus miembros colaboren para hacer crecer la comunidad, compartiendo información, invitando nuevos miembros, realizando críticas y comentarios, y aportando todo tipo de ideas.</li><li>Fomentar la utilización de tecnologías Open Source.<br /></li></ul>Link del grupo OSUM: <a href="http://osum.sun.com/group/utn_mdp">http://osum.sun.com/group/utn_mdp</a><br /><br /><span style="font-weight: bold;">SAI (Sun Academic Initiative)</span><br />El SAI es un programa de Sun Microsystems que ofrece (a las instituciones educativas y estudiantes) acceso gratuito a diversos cursos web de las últimas tecnologías de Java y Solaris. El SAI es uno de los recursos más importantes de los miembros de la comunidad OSUM.<br />Este programa otorga beneficios a:<br /><ul><li>Las instituciones educativas:<br />- Permitiendo a las mismas, brindar entrenamiento oficial sobre las tecnologías de Sun a sus estudiantes y profesores.</li><li>Los estudiantes:<br />- Acceso gratuito a diferentes cursos web, a través del SAI Learning Connection.<br />- Acceso a exámenes de práctica para las certificaciones (ePractice Certification Exams).<br />- Descuentos de hasta el 85% en los exámenes de certificación.<br /></li></ul><span style="font-weight: bold;">Más info</span><br />Para obtener más información acerca de OSUM, SAI y otros temas dirigirse a:<br /><ul><li>OSUM (Open Source University Meet up): <a href="http://osum.sun.com/">http://osum.sun.com/</a></li><li>Sitio de la iniciativa SAI: <a href="http://www.sun.com/solutions/landing/industry/education/sai/index.jsp">http://www.sun.com/solutions/landing/industry/education/sai/index.jsp</a></li><li>Acceso a cursos del SAI: <a href="http://sailearningconnection.skillport.com/">http://sailearningconnection.skillport.com/</a></li><li>Datos para registrarse en el SAI:<br />- Program name: SAI-Argentina<br />- Program ID: tbwg1fq8</li></ul><ul><li>Blog del programa Campus Ambassadors para las universidades argentinas: <a href="http://blogs.sun.com/argentina_ambassador/">http://blogs.sun.com/argentina_ambassador/</a></li><li>Grupo OSUM de la UTN (mdp): <a href="http://osum.sun.com/group/utn_mdp">http://osum.sun.com/group/utn_mdp</a></li></ul></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-83187694084411181272009-10-19T10:00:00.000-07:002009-10-19T10:23:01.410-07:00Diploma<div style="margin-left: 20px; margin-right: 20px;">Hace unos días me llego el diploma a mi casa. Por desgracia el cartero no sabía leer y no vio que lo tenía que entregar en mano, lo dejo doblado en tres y metido en el buzon de cartas :S. Pero bueno, dejando eso de lado, ya tengo mi diploma!!!<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinMtpuUyhtTWamDewektzUInGOV1wBmefoNk8irdJ6eH8H6NBcquXzVYI4gcAJayvOV5AqToZhugTIR8G4TK-zNcbyu0kbzxRu1hCKccj2C_jdw_q3CU_RGjfGMOkrHEEVemyte36UVmM/s1600-h/diploma.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinMtpuUyhtTWamDewektzUInGOV1wBmefoNk8irdJ6eH8H6NBcquXzVYI4gcAJayvOV5AqToZhugTIR8G4TK-zNcbyu0kbzxRu1hCKccj2C_jdw_q3CU_RGjfGMOkrHEEVemyte36UVmM/s400/diploma.png" alt="" id="BLOGGER_PHOTO_ID_5394360920247553010" border="0" /></a><br />Este es el resultado del examen, que te entregan ni bien terminas de rendirlo:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQrB8R5mf9_kw4MrXxTIwwFuQrCrPS6uK9vZT2HBsTet_amV6ne7e3iFD0NkT5lTk5I_eFKY__qa1ixo7PwvsAT5cL4tE2w9dk-tjsdP16FIWucJoVZpAsWu3GrcvkJvWF-MZhBE-z03U/s1600-h/resultados.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQrB8R5mf9_kw4MrXxTIwwFuQrCrPS6uK9vZT2HBsTet_amV6ne7e3iFD0NkT5lTk5I_eFKY__qa1ixo7PwvsAT5cL4tE2w9dk-tjsdP16FIWucJoVZpAsWu3GrcvkJvWF-MZhBE-z03U/s400/resultados.png" alt="" id="BLOGGER_PHOTO_ID_5394362505374643586" border="0" /></a><br />Saludos!<br /></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com4tag:blogger.com,1999:blog-8326642706473191555.post-68550383654874683612009-10-08T05:24:00.000-07:002009-10-08T06:53:49.015-07:00Ya soy SCJP !!!<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">Gente, el pasado 17 de Septiembre (como me lo había propuesto) rendí el examen de certificación. Tuve la suerte de aprobar, saque 86% (52 respuestas correctas de 60). Yo esperaba que el examen constaría de 72 preguntas y 210 minutos, pero al comenzar vi que en realidad constaba de 60 preguntas y un tiempo de 180 minutos. Y no solo eso, si no que el porcentaje de aprobación era del 58%.<br />Igualmente estas novedades (o información desactualizada que yo tenía) no me afectaron mucho a la hora de rendir, ya que me sentía bien preparado para hacerlo.<br /><br /><span style="font-weight: bold;">Claves de la preparación del examen</span><br /></div><ul style="text-align: justify;"><li>Objetivos del examen (para centrar la concentración solo en los temas tratados en el examen).<br /></li><li>El libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>". Todos los capítulos finalizan con ejercitación del tipo del examen, muy útiles para ir practicando y afianzando los temas.</li><li>Los cursos gratuitos del <a href="http://www.google.com.ar/url?sa=t&source=web&ct=res&cd=1&url=http%3A%2F%2Fsailearningconnection.skillport.com%2F&ei=Hd7NSuiOIsWm8Aaou6juAw&usg=AFQjCNGRPJPfoSCgPRgk9T607q8vakIrgQ&sig2=GV4cLeDWiyLL94IOVnWdTQ">SAI Learning Connection</a> (a continuación listo los que tome, hay otros cursos más pero estos tratan temas que escapan a objetivos del examen):<br />- <span style="font-weight: 400;color:silver;" ></span><span class="assetLink"> Getting Started with the Java Technology<br />- <span style="font-weight: 400;color:silver;" ></span></span><span class="assetLink"> Java Programming Language: Applying Exceptions, Collections Framework and Input/Output Classes (WJ-2753-SE6)<br />- <span style="font-weight: 400;color:silver;" ></span></span><span class="assetLink">Java Programming Language: Understanding the Building Blocks<br />- <span style="font-weight: 400;color:silver;" ></span></span><span class="assetLink">Java(TM) Programming Language: Applying Threading and Networking Concepts (WJ-2755-SE6)</span></li><li>Exámenes de práctica del SAI (<span style="font-style: italic;" class="bodytext">ePractice Certification Exam</span>): Sun Certified Programmer for the Java Platform, Standard Edition 6 (WGS-PREX-J065C) (Son dos exámenes que constan de 60 preguntas)<br /></li><li>Escribir mucho código de ejemplos y pruebas a lo largo de toda la preparación, utilizando el notepad y la consola de comandos.</li></ul><div style="text-align: justify;">Sin duda estos 5 puntos, fueron los que más me ayudaron en la preparación del examen. También hice muchos otros exámenes de prueba (algunos los aprobé, otros no), pero destaco los exámenes del SAI porque son los que más se asemejan al examen de certificación que yo rendí.<br />Debido a mi inexperiencia en rendir certificaciones, leí y realice muchas otras cosas más que estos puntos que describo, pero creo que no aportaron mucho a mi preparación. Es más hasta en algunos casos (como algunos mock test desactualizados) creo que lo único que me aportaron fueron dudas.<br />Desde mi punto de vista realizando estos puntos mencionados, uno ya esta en muy buena forma para rendir y aprobar el examen de certificación.<br /><br /><span style="font-weight: bold;">Comprando el voucher</span><br /><br />Como hasta hace poco tiempo yo era estudiante de la carrera "Técnico Superior en Sistemas Informáticos" de la <a href="http://www.utn.edu.ar/">UTN</a> (Universidad Tecnológica Nacional) <a href="http://www.mdp.utn.edu.ar/">centro de estudios Mar del Plata</a>, pude acceder a los descuentos del SAI, pagando solo unos u$s40.- por mi voucher. A este descuento solo pueden acceder aquellas personas que estén estudiando (o se hayan recibido hace no más de 6 meses) en una universidad afiliada al programa SAI (Sun Academic Institute).<br />Una vez pagado los u$s40.- la gente de Sun solicita que envíes información sobre tu estado académico. Lo que hice fue sacar una foto a mi libreta de estudiante y a un certificado de alumno regular, y los envíe por mail. Al día siguiente (oficialmente dicen dentro de los próximos 3 días hábiles) me enviaron mi voucher por mail.<br />Al recibir mi voucher, me di cuenta que no era para el examen 310-065 si no para el 212-065 (y entre en pánico), pero luego de ver el sitio <a href="http://www.prometric.com/Sun/default.htm">Prometric</a> me encontré con la siguiente información que me tranquilizo:<br /><br /><span style="font-style: italic;">"SAI Sun Certification Exams are denoted with a 212 prefix to signify that it is designated for SAI. There is no difference between the 212 and 310 exam series."</span><br /><br />La única diferencia entre estos dos exámenes, es que el 212-065 se puede rendir solo en inglés. Cosa que me preocupo en un principio, pero después pensándolo en frío, después de haber realizado toda la preparación y ejercitación en inglés fue mejor haberlo rendido en inglés.<br /><br /><span style="font-weight: bold;">Programando la fecha del exámen</span><br /><br />El sitio <a href="http://www.prometric.com/Sun/default.htm">Prometric</a> permite programar la fecha y hora en que vas a rendir el examen. Yo elegí el centro <a href="http://www.ctt-ar.com/">CTT Argentina</a> (Córdoba 939. Piso 1). Más que nada lo elegí porque fue el que más me gusto, y porque lo conocía. Para no llevarme sorpresas a último momento.<br />Una vez organizado el encuentro la gente de Prometric envía un email con los detalles y algunos consejos útiles para el día del examen.<br /><br /><span style="font-weight: bold;">El momento decisivo</span><br /><br />Debido a que tuve que viajar a capital federal (a unos 400 Km de mi ciudad) para rendir el examen, fui un par de días antes para que el tema del viaje no me afecte y estar bien descansado. Antes de rendir hice una previa en un café, repasando un resumen con puntos claves. Al llegar al centro estaba un poco nervioso, pero una vez que vi como eran las preguntas me tranquilice y comencé a responderlas.<br />Por suerte me fue muy bien y obtuve un 86% que era más o menos lo que yo quería, después de haber estudiado tanto.<br />Una vez finalizado el examen, te dan una hoja con tu puntaje global, y un puntaje en cada sección. No podes saber en qué preguntas te equivocaste, solo podes conocer en qué temas fallaste más.<br /><br /><span style="font-weight: bold;">Conclusiones</span><br /><br />Luego de haber obtenido mi certificación, lo más importante fueron los conocimientos que obtuve durante mi preparación (que duro casi 2 meses y medio). La verdad que me hubiera desilusionado mucho si desaprobaba, pero creo que cada uno sabe cómo va a rendir el examen, si uno estudió y conoce los temas es muy probable que se apruebe.<br />Una vez aprobado es importante solo el hecho de haber aprobado, el puntaje obtenido es una cosa más. Al fin y al cabo solo el hecho de haber estudiado es lo importante, y si se puede obtener la certificación mejor!<br /><br />Ahora comencé a preparar la certificación <a href="http://www.sun.com/training/certification/java/scwcd.xml">Sun Certified Web Component Developer (SCWCD)</a>. Si tengo tiempo voy a crear un blog como este. Nunca programé en JavaEE pero ya tengo muchos conocimientos en lenguajes web. Por lo que estuve viendo es distinto, pero muchas cosas se asemejan a otros frameworks y tienen varias similitudes.<br />Ya con una certificación aprobada espero no cometer los mismos errores que en la preparación anterior.<br /><br />Tengo algunos resumenes y cosas útiles (sobre los temas del exámen SCJP) que cuando tenga un poco de tiempo los voy a ir subiendo.<br /><br />Muchas gracias por todos los comentarios!<br />Hasta la próxima ;)<br /><br /></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com2tag:blogger.com,1999:blog-8326642706473191555.post-26442463144477205372009-09-04T05:17:00.000-07:002009-09-04T05:22:26.860-07:00Development<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del decimo (y último) capítulo (Development) del libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>".<br /><span style="font-weight: bold;"></span><br /><span style="font-weight: bold;">Utilización de los comandos javac y java (Objetivo 7.2):</span><br /></div><ul style="text-align: justify;"><li>La opción -d permite cambiar el destino de los archivos .class cuando se compila utilizando el comando javac.</li><li>La opción -d puede crear todos directorios (paquetes) necesarios para alojar los archivos .class, si el directorio raíz existe.</li><li>El comando java posee la opción -D la cual permite definir propiedades del sistema.</li><li>Las propiedades del sistema consisten en un par nombre=valor. Por ejemplo java -DmyProp=valueProp Clase</li><li>Los argumentos de línea de comandos siempre se tratan como Strings.</li><li>El primer argumento de la línea de comandos se almacena en la posición 0 del arreglo args.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Búsqueda con java y javac (Objetivo 7.5):</span><br /></div><ul style="text-align: justify;"><li>Ambos comandos utilizan el mismo algoritmo de búsqueda para encontrar las clases.</li><li>La búsqueda comienza en los directorios que contienen las clases de la librería J2SE.</li><li>El usuario puede definir una ruta secundaria de búsqueda, utilizando el classpath.</li><li>El classpath por defecto generalmente se definen utilizando las variables de entorno del sistema operativo.</li><li>Un classpath puede ser declarado desde la línea de comandos, el cual sobrescribe el classpath por defecto.</li><li>Un solo classpath puede definir muchas rutas de búsqueda diferentes.</li><li>En los sistemas Unix se utilizan las barras (/) para separar los directorios de un classpath. En Windows se utilizan las barras invertidas (\).</li><li>En los sistemas Unix se utilizan los dos puntos (:) para separar las rutas dentro de un classpath. En Windows se utiliza punto y coma (;).</li><li>En un classpath, para especificar el directorio actual como una ruta de búsqueda, se debe utilizar un punto (.).</li><li>En un classpath, una vez que se encuentra la clase, la búsqueda se detiene, por eso es muy importante el orden de las rutas de búsqueda.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Paquetes y búsqueda (Objetivo 7.5):</span><br /></div><ul style="text-align: justify;"><li>Cuando se coloca una clase dentro de un paquete, se debe utilizar su nombre completo. Es decir: nombrePaqueteA.paqueteB.Clase</li><li>Una declaración import establece un alias para el nombre completo de una clase.</li><li>Para localizar fácilmente una clase, su nombre completo debe coincidir con la estructura de directorios donde la misma se encuentra definida. Es decir, los paquetes deben representarse como directorios.</li><li>Un classpath puede contener rutas relativas tanto como absolutas.</li><li>Una ruta absoluto comienza con / o \.</li><li>Solo el ultimo directorio de una ruta se utiliza para la búsqueda.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Archivos JAR (Objetivo 7.5):</span><br /></div><ul style="text-align: justify;"><li>Una estructura completa de directorios puede ser archivada dentro de un archivo JAR.</li><li>Los archivos JAR pueden ser buscados por los comandos java y javac.</li><li>Cuando se incluye un archivo JAR en un classpath, se debe especificar tanto la ruta como el nombre del archivo.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Importaciones estáticas (Objetivo 7.1):</span><br /></div><ul style="text-align: justify;"><li>La declaración de una importación estática debe comenzar del siguiente modo: import static</li><li>Se pueden utilizar las importaciones estáticas para crear atajos a miembros estáticos (variables estáticas, constantes y métodos) de una clase.</li></ul><br /></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com1tag:blogger.com,1999:blog-8326642706473191555.post-29378701966365144962009-09-04T05:07:00.000-07:002009-09-04T05:12:12.604-07:00Hilos (Threads)<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del noveno capítulo (Threads) del libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>".<br /><br /><span style="font-weight: bold;">Definición, instanciación e iniciación de Threads (hilos) (Objetivo 4.1):</span><br /></div><ul style="text-align: justify;"><li>Un hilo se puede crear extendiendo de la clase Thread y sobrescribiendo el método: public void run().</li><li>Los objetos Thread pueden ser creados invocando el constructor que toma un argumento de tipo Runnable. Un objeto Runnable es llamado “el blanco” (target) de un hilo.</li><li>Sobre un hilo se puede invocar solo una vez el método start(). Si el método se invoca más de una vez, se lanza una excepción de tipo IllegalThreadStateException (la cual extiende de RuntimeException). </li><li>Es legal crear muchas instancias Thread con el mismo objeto Runnable.</li><li>Cuando se instancia un objeto Thread, este no es un hilo de ejecución hasta que no se invoque el método start(). Cuando exista un objeto Thread que todavía no haya sido iniciado, este es considerado vivo (alive).<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Transiciones entre estados de hilos (Objetivo 4.2):</span><br /></div><ul style="text-align: justify;"><li>Existen cinco estados: “nuevo”, “ejecutable”, “en ejecución”, “bloqueado/esperando/dormido”, y “muerto” (new, runnable, running, blocked/waiting/sleeping, dead).</li><li>Cuando se inicia un nuevo hilo, este siempre entra al estado “ejecutable”.</li><li>El programador de hilos puede mover un hilo de ejecución hacia los estados “ejecutable” y “en ejecución”.</li><li>En una maquina típica de un solo procesador, solo un hilo puede ser ejecutado a la vez, pero muchos hilos pueden estar en el estado “ejecutable”.</li><li>No está determinada la forma de ejecución de los hilos, ni siquiera por el orden en que se iniciaron.</li><li>La manera en que los hilos toman los turnos de ejecución no está garantizada de ninguna forma. El programador de hilos es el encargado de administrar esto, y la manera varía según la implementación de la JVM.</li><li>Un hilo en ejecución puede entrar en el estado “bloqueado/esperando/dormido” invocando algunos de los siguientes métodos: wait(), sleep() o join().</li><li>Un hilo en ejecución puede entrar en el estado “bloqueado/esperando/dormido” debido a que no puede adquirir la cerradura de un bloque de código sincronizado.</li><li>Cuando finalizan los efectos de los métodos wait() y sleep(), o cuando la cerradura de un objeto se encuentra disponible, el hilo solo puede volver al estado “ejecutable”.</li><li>Un hilo muerto no puede ser iniciado nuevamente.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Sleep, Yield y Join (Objetivo 4.2):</span><br /></div><ul style="text-align: justify;"><li>El método sleep() se utiliza para retardar la ejecución por un periodo de tiempo, durante dicho periodo las cerraduras no se liberan.</li><li>Se garantiza que un hilo estará dormido por lo menos, la cantidad de milisegundos especificados por el argumento de sleep() (a menos que sea interrumpido), pero no se puede garantizar cuando el mismo podrá ser ejecutado nuevamente.</li><li>El método estático Thread.sleep(), duerme el hilo de ejecución que invoca el método. Un hilo no puede dormir a otro hilo.</li><li>El método setPriority() se utiliza, solo sobre instancias de Thread, para dar una prioridad a los hilos entre los valores 1(baja) y 10(alta). Aunque no todas las JVM’s reconocen diez niveles de prioridades, debido a que depende de su implementación y del sistema operativo sobre el que se esté ejecutando.</li><li>Cuando no se especifica una prioridad para un hilo, este posee la misma prioridad que el hilo que lo creo.</li><li>El método yield() puede causar que se pare de ejecutar un hilo si existen otros hilos en el estado “ejecutable” con la misma prioridad. No se garantiza que cuando se ejecute el método será otro hilo el que se ejecutara. Es decir, un hilo puede salir y luego volver a entrar al estado “en ejecución”.</li><li>Lo que sí se puede garantizar es que cuando se está ejecutando un hilo, no habrá otros hilos con mayor prioridad en el estado “ejecutable”. Si en algún momento ingresa un nuevo hilo al estado “ejecutable” con mayor prioridad en relación al que se está ejecutando, la JVM pausará el hilo en ejecución para ejecutar el hilo con mayor prioridad.</li><li>Cuando un hilo invoca el método join() sobre otro hilo, el hilo en ejecución actual se detendrá hasta que el hilo al que se ha unido se complete. Es decir, el hilo se volverá a ejecutar al final de la ejecución del otro.</li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Problemas de acceso concurrente y sincronización de hilos (Objetivo 4.3):</span><br /></div><ul style="text-align: justify;"><li>Los métodos synchronized previenen que más de un hilo acceda al código de un método crítico simultáneamente.</li><li>Se puede utilizar la palabra clave synchronized como un modificador de un método, o como un iniciador de un bloque de código sincronizado.</li><li>Para sincronizar un bloque de código, se debe especificar un argumento que es el objeto que se utilizara como cerradura para la sincronización.</li><li>Mientras que solo un hilo puede acceder al código sincronizado de una instancia en particular, múltiples hilos pueden acceder al código no sincronizado de una misma instancia.</li><li>Cuando un hilo se duerme, su cerradura no se encuentra disponibles para otros hilos.</li><li>Los métodos estáticos pueden estar sincronizados, utilizando como cerradura la instancia java.lang.Class que representa la clase.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Comunicación con objetos a través de wait() y notify() (Objetivo 4.4):</span><br /></div><ul style="text-align: justify;"><li>El método wait() permite a un hilo pausar su ejecución hasta que se le notifique que ocurrió algo de lo que se tiene que encargar.</li><li>El método notify() se utiliza para enviar una señal a un y solo un hilo que se encuentra esperando en el pool de objetos en espera.</li><li>El método notify() no permite especificar que hilo en espera se va a notificar.</li><li>El método notifyAll() funciona del mismo modo que notify, a diferencia que envía señales a todos los hilos esperando por un objeto.</li><li>Los métodos wait(), notify() y notifyAll() deben ser invocados desde un contexto sincronizado.<br /></li></ul><br /></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-60049206218396730942009-09-04T04:57:00.000-07:002009-09-04T05:04:05.895-07:00Clases Internas - Resumen<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del octavo capítulo (Inner Classes) del libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>".<br />En el siguiente <a href="http://scjp-sun.blogspot.com/2009/08/clases-internas.html">post</a>, hay una explicación introductoria (con ejemplos de código) para el tema clases internas. Se recomienda ver este post antes de leer el siguiente resumen.<br /><span style="font-weight: bold;"></span><br /><span style="font-weight: bold;">Clases internas:</span><br /></div><ul style="text-align: justify;"><li>Una clase interna “regular” se declara dentro de las llaves de otra clase, pero fuera de cualquier método u otro bloque de código.</li><li>Una clase interna puede poseer cualquier modificador.</li><li>Una instancia de una clase interna comparte una relación especial con una instancia de la clase externa. Esta relación brinda a la clase interna acceso a todos los miembros de la clase externa, incluidos los que son privados.</li><li>Para instanciar una clase interna, se debe poseer una referencia de la clase externa.</li><li>Dentro de la clase externa, se puede instanciar la clase interna de la siguiente manera: MyInner mi = new MyInner();</li><li>Para el código fuera de la clase externa, se puede instanciar la clase interna solo utilizando ambos nombres (de la clase externa e interna):<br />MyOuter mo = new MyOuter();<br />MyOuter.MyInner mi = mo.new MyOuter();</li><li>Para el código dentro de una clase interna, la palabra clave this guarda una referencia a la instancia de la clase interna. Para hacer referencia a la instancia de la clase externa, se debe utilizar la siguiente sintaxis: MyOuter.this;<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Clases internas locales:</span><br /></div><ul style="text-align: justify;"><li>Una clase interna local es definida dentro de un método de la clase externa.</li><li>Una clase interna local no puede utilizar variables declaradas dentro del método (incluyendo parámetros) salvo que esas variables sean finales.</li><li>Los únicos modificadores que aplican a una clase interna local son abstract y final.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Clases internas anónimas:</span><br /></div><ul style="text-align: justify;"><li>Una clase interna anónima no tiene nombre, y debe ser una subclase o una implementación de una interface.</li><li>Una clase interna anónima siempre se crea como parte de una declaración, no se debe olvidar cerrar la declaración después de la definición de la clase. Esta es una sintaxis rara de Java una llave seguida de un punto y coma.</li><li>A causa del polimorfismo, los únicos métodos que se pueden invocar de una clase interna anónima son los métodos pertenecientes al supertipo o interface que implementa.</li><li>Una clase interna anónima puede extender de una clase o implementar solo una interface.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Clases anidadas (clases internas estáticas):</span><br /></div><ul style="text-align: justify;"><li>Las clases anidadas son clases internas marcadas con el identificador static.</li><li>Una clase anidada no es una clase interna, es una clase común dentro de otra.</li><li>Como la clase anidada es estática, esta no comparte ninguna relación con la instancia de la clase externa. De hecho, no se necesita una instancia de la clase externa para instanciar una clase anidada.</li><li>Para instanciar una clase anidada se necesitan utilizar ambos nombres de las clases (la externa y la anidada):<br />BigOuter.Nested n = new BigOuter.Nested();</li><li>Una clase anidada no puede acceder a los miembros no estáticos de la clase externa, ya que no posee una referencia implícita a ella.</li></ul><br /></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-26224897661303772142009-09-03T17:42:00.000-07:002009-09-04T13:53:11.079-07:00Genéricos y Colecciones<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del séptimo capítulo (Generics and Collections) del libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>".<br /><span style="font-weight: bold;"></span><br /><span style="font-weight: bold;">Sobreescribiendo hashCode() y equals() (Objetivo 6.2):</span><br />Métodos de la clase Object que se necesitan saber para el examen:<br /></div><ul style="text-align: justify;"><li>boolean equals(Object obj)</li><li>void finalize()</li><li>int hashCode()</li><li>final void notify()</li><li>final void notifyAll()</li><li>final void wait()</li><li>String toString()<br /></li></ul><div style="text-align: justify;"><span style="font-style: italic; font-weight: bold;">Método equals()</span><br />El operador == permite evaluar si dos referencias son iguales, es decir, cuando se refieren al mismo objeto. Para comparar si dos objetos son iguales, si los objetos en sí mismo son idénticos, se utiliza el método equals().<br />La clase String y todas las clases envoltorios (wrappers) de tipos primitivos, tienen el método equals() redefinido. Por esto mismo se pueden comparar si dos objetos tienen un mismo estado.<br />Si se quiere utilizar (de manera correcta) un objeto como clave en una colección hash, se debe sobreescribir el método equals(), para de este modo permitir considerar dos instancias iguales.<br /><br /><span style="font-style: italic; font-weight: bold;">Método hashCode()</span><br />Generalmente los hashcodes son utilizados para mejorar la performance de grandes colecciones de información. Este código se utiliza para determinar donde se guardará el objeto dentro de una colección (HashMap, HashSet o sus subtipos), y como se debe localizar. Para el examen se debe saber que colecciones lo utilizan, y diferenciar los usos apropiados o correctos de los legales.<br /><br /><span style="font-weight: bold;">Colecciones (Objetivo 6.1):</span><br />Tipos de colecciones:<br /></div><ul style="text-align: justify;"><li>List: Sus operaciones están basadas en los índices de los elementos en la colección. Todas sus implementaciones tienen sus índices ordenados. Cuando se agrega un elemento a la colección se puede hacer especificando el índice en el cual tiene que estar, o sin especificarlo (en este caso se posiciona al final).<br />- <span style="font-style: italic;">ArrayList</span>: Provee una rápida iteración y un rápido acceso aleatorio. Pero es más lento para insertar y quitar elementos que LinkedList.<br />- <span style="font-style: italic;">Vector</span>: Es una colección primitiva de las primeras versiones de java. Es básicamente similar a ArrayList, salvo que todos sus métodos están sincronizados para el manejo seguro de hilos (thread safe).<br />- <span style="font-style: italic;">LinkedList</span>: Es una colección como ArrayList, excepto porque sus elementos se encuentran doblemente ligados (uno con otro). Este doble vinculo otorga nuevos métodos para agregar o quitar elementos del principio o el final. Su iteración es más lenta que ArrayList. A partir de Java 5, esta colección implementa la interface Queue. De esta manera puede ser tratada como una cola, y posee los métodos: peek(), poll() y offer().</li><li>Set: Es un conjunto de elementos únicos. Es decir, no se permiten objetos duplicados. Para lograr este comportamiento se utiliza el método equals(), que permite verificar si dos instancias son idénticas.<br />- <span style="font-style: italic;">HashSet</span>: Es una colección que no mantiene un orden específico. Utiliza el código de hash de los objetos insertados. Por este motivo mientras más eficiente sea la implementación del método hashCode(), mejor será la performance de acceso. Es útil cuando se necesita una colección sin elementos duplicados y en la cual no importe el orden de iteración.<br />- <span style="font-style: italic;">LinkedHashSet</span>: Es la versión ordenada de HashSet. Mantiene un doble enlace entre sus elementos como si fuera una lista. Es útil cuando se necesita (a diferencia de HashSet) una colección en donde el orden de iteración sea importante.<br />- <span style="font-style: italic;">TreeSet</span>: Es una colección que contiene sus elementos ordenados. Utiliza un árbol de estructura rojo-negro, y garantiza que los elementos se encuentren en orden ascendente, de acuerdo a su orden natural. A partir de Java 6, esta colección implementa NavigableSet.</li><li>Map: Son colecciones con elementos compuestos de parejas clave/valor. Las claves de los elementos son únicas. Al igual que la interface Set, utiliza el método equals() para determinar si dos objetos son iguales. Muchas de sus operaciones están basadas en las claves.<br />- <span style="font-style: italic;">HashMap</span>: Es una colección que no mantiene un orden específico. Utiliza el código de hash sobre las claves, para determinar el orden de sus elementos. Es útil cuando se necesita un mapa en el cuál no importe el orden de iteración. Permite un solo valor null como clave, y multiples valores null en la colección.<br />- <span style="font-style: italic;">Hastable</span>: Como la clase Vector, es una implementación de las primeras versiones de java. Es similar a HashMap, a diferencia que sus métodos se encuentran sincronizados. Otra de las diferencias es que no permite valores null tanto en la claves como en los valores.<br />- <span style="font-style: italic;">LinkedHashMap</span>: Similar a HashMap, a diferencia que mantiene los elementos ordenados. Y porque es un poco más lento para agregar o quitar elementos de la colección. Pero permite una iteración más veloz.<br />- <span style="font-style: italic;">TreeMap</span>: Es un mapa ordenado de forma natural. También permite definir un tipo de orden (a través de las interfaces Comparable y Comparator). A partir de Java 6, implementa la interface NavigableMap.</li><li>Queue: Es una colección de tipo “cola”, la cual permite almacenar cosas que deben ser procesadas de cierta manera. Generalmente funcionan como colas FIFO (First-In, First-Out).<br />- <span style="font-style: italic;">PriorityQueue</span>: Es una clase nueva de Java 5. Generalmente se utiliza la clase LinkedList para implementar colas. Pero el propósito de esta colección, es crear colas con prioridades, a diferencia de las colas FIFO. Sus elementos se encuentran ordenados por orden natural, o de acuerdo a un objeto Comparator. El orden de los elementos representa la prioridad.<br /></li></ul><div style="text-align: justify;"><span style="font-style: italic; font-weight: bold;">Ordenando colecciones</span><br />Las clases Arrays y Collections poseen un método para ordenar sus elementos. Arrays.sort() y Collections.sort(). La única condición que deben cumplir los elementos del arreglo, es que sean del mismo tipo. Objetos de diferentes tipos no son mutuamente comparables.<br /><br /><span style="font-style: italic; font-weight: bold;">java.lang.Comparable</span><br />Para que una colección de objetos pueda ser ordenada, los mismos deben implementar las interface Comparable. Dicha interface solo posee el método compareTo().<br />thisObject.compareTo(anotherObject);<br />Este método devuelve un valor entero con las siguientes características:<br /></div><div style="text-align: justify;"><ul><li>Negativo: thisObject < anotherObject</li><li>Cero: thisObject == anotherObject</li><li>Positivo: thisObject > anotherObject<br /></li></ul>La interface Comparable (a partir de Java 5) permite utilizar un tipo genérico. De esta manera no se deben realizar casteos en ninguna parte del código. Cada clase que implemente la interface, definirá el tipo de objeto con el que trabajara.<br />public int compareTo(T o);<br /><br /><span style="font-style: italic; font-weight: bold;">java.util.Comparator</span><br />Existe una versión sobrecargada del método Collections.sort(), la cual permite pasar como argumento un objeto Comparator. La interface Comparator brinda la capacidad de ordenar una colección de diferentes maneras. Para utilizar esta interface, se debe declarar una nueva clase que la implemente, y sobrescriba el método compare(). Al igual que Comparable puede utilizar un tipo parametrizado (lo cual no es obligatorio, pero generará advertencias al momento de la compilación).<br />public int compare(T o1, T o2);<br /><br /><span style="font-weight: bold; font-style: italic;">Arrays.sort()</span><br />La clase Arrays (al igual que Collections) posee dos versiones del método sort():<br />• Arrays.sort(arrayToSort): Para cualquier tipo de objeto o tipos primitivos.<br />• Arrays.sort(arrayToSort, Comparator): se puede utilizar solo para objetos (NO primitivos).<br /><br /><span style="font-style: italic; font-weight: bold;">Buscando elementos en las colecciones</span><br />Las clases Collections y Arrays poseen un método que permite buscar un elemento específico, binarySearch(). Las búsquedas exitosas devuelven el valor entero del índice del elemento, las que no tienen éxito devuelven un entero negativo que representa el lugar de inserción. Es obligatorio que la colección se encuentre ordenada antes de realizar cualquier búsqueda, caso contrario se devolverá un valor impredecible. Si la colección ha sido ordenada mediante un objeto Comparator, la búsqueda debe realizarse pasando como segundo parámetro el mismo objeto Comparator.<br />Los siguientes métodos pertenecen tanto a Arrays como a Collections:<br />• binarySearch(ObjetoBuscado o)<br />• binarySearch(ObjetoBuscado o, Comparable c)<br /><br /><span style="font-style: italic; font-weight: bold;">Convirtiendo arreglos a listas y listas a arreglos</span><br />Las interfaces List y Set poseen el método toArray(), el cual convierte la lista de elementos en un arreglo. La clase Arrays tiene un método llamado asList(), este copia el contenido de un arreglo adentro de una lista.<br />Cuando se actualiza un elemento de algunas de las dos colecciones, automáticamente se actualiza la otra.<br /><br /><span style="font-style: italic; font-weight: bold;">Iterator</span><br />Es un objeto que está asociado con una colección específica. Permite iterar a través de la colección paso a paso. Los dos métodos de la interface Iterator que se deben saber para el examen son:<br /></div><ul style="text-align: justify;"><li>boolean hasNext(): Devuelve true si hay al menos un elemento más en la colección que se esta atravesando.</li><li>Object next(): Devuelve el próximo objeto en la colección, y mueve hacia adelante el puntero.<br /></li></ul><div style="text-align: justify;">Se puede utilizar un tipo parametrizado junto al objeto Iterator, de esta menara el método next() devolverá dicho tipo, evitando las necesidades de casteo.<br /><br /><span style="font-style: italic; font-weight: bold;">Set</span><br />Se debe prestar atención el tipo de implementación que se utiliza. Una colección HashSet permite contener elementos de diferentes tipos (si el tipo parametrizado es Object, o el mismo se excluye). Pero una colección TreeSet (la cual contiene a sus elementos en orden) no permite contener objetos que no sean comparables entre sí.<br /><br /><span style="font-style: italic; font-weight: bold;">Map</span><br />A la hora de utilizar este tipo de colecciones, se debe prestar atención a las claves utilizadas. Es decir, si un objeto clave (insertado en la colección) luego modifica su estado, puede ser que el mismo no sea hallado en el mapa. Esta situación se da debido a que el método hashCode(), devuelve un código diferente.<br /><br /><span style="font-style: italic; font-weight: bold;">NavigableSet</span><br />Esta interface (implementada únicamente por TreeSet) posee diversos métodos de utilidad:<br /></div><ul style="text-align: justify;"><li>lower(): Devuelve el elemento menor al elemento pasado como parámetro.</li><li>floor(): Devuelve el elemento menor o igual al elemento pasado como parámetro.</li><li>higher(): Devuelve el elemento mayor al elemento pasado como parámetro.</li><li>ceiling(): Devuelve el elemento mayor o igual al elemento pasado como parámetro.</li><li>pollFirst(): Devuelve el primer elemento y lo elimina de la colección.</li><li>pollLast(): Devuelve el último elemento y lo elimina de la colección.</li><li>descendingSet(): Devuelve una copia de la colección en orden inverso.</li><li>headSet(e): Devuelve un subconjunto que termina en el elemento (excluido) e.</li><li>tailSet(e): Devuelve un subconjunto que comienza en el elemento (incluido) e.</li><li>subSet(s, e): Devuelve un subconjunto que comienza en el elemento (incluido) s y finaliza en el elemento (excluido) e.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold; font-style: italic;">NavigableMap</span><br />Esta interface (implementada únicamente por TreeMap) posee diversos métodos de utilidad:<br /></div><ul style="text-align: justify;"><li>lowerKey(): Devuelve la clave menor a la clave pasada como parámetro.</li><li>floorKey(): Devuelve la clave menor o igual a la clave pasada como parámetro.</li><li>higherKey(): Devuelve la clave mayor a la clave pasada como parámetro.</li><li>ceilingKey(): Devuelve la clave mayor o igual a la clave pasada como parámetro.</li><li>pollFirstEntry(): Devuelve la primer pareja clave/valor y la elimina de la colección.</li><li>pollLastEntry(): Devuelve la ultima pareja clave/valor y la elimina de la colección.</li><li>descendigMap(): Devuelve una copia de la colección en orden inverso.</li><li>headMap(k): Devuelve un subconjunto que termina en la clave (excluida) k.</li><li>tailMap(k): Devuelve un subconjunto que comienza en la clave (incluida) k.</li><li>subMap(s, e): Devuelve un subconjunto que comienza en la clave (incluida) s y finaliza en la clave (excluida) e.<br /></li></ul><div style="text-align: justify;"><span style="font-style: italic; font-weight: bold;">Queue</span><br />La colección PriorityQueue ordena sus elementos utilizando una prioridad definida por el usuario. La prioridad puede ser el orden natural, pero también se puede ordenar utilizando un objeto Comparator. La interface Queue posee métodos que no se encuentran en ninguna otra colección:<br /></div><ul style="text-align: justify;"><li>peek(): Devuelve el primer elemento de la cola (o el que tenga mayor prioridad).</li><li>poll(): Devuelve el primer elemento de la cola (o el que tenga mayor prioridad), y luego lo elimina de la cola.</li><li>offer(T o): Agrega un elemento al final de la cola (o en el lugar donde indique su prioridad).<br /></li></ul><div style="text-align: justify;"><span style="font-style: italic; font-weight: bold;">RESUMEN: TWO-MINUTE DRILL</span><br /><span style="font-weight: bold;">Sobrescribiendo hashCode() y equals() (Objetivo 6.2):</span><br /></div><ul style="text-align: justify;"><li>Los métodos equals(), hashCode() y toString() son públicos.</li><li>El método toString() permite mostrar el estado de un objeto mediante un String.</li><li>El operador == sirve para determinar si dos variables de referencia apuntan al mismo objeto.</li><li>El método equals() sirve para determinar si dos objetos poseen un estado equivalente.</li><li>Si no se sobrescribe el método equals(), los objetos no serán útiles como claves hash.</li><li>Si no se sobrescribe el método equals(), objetos diferentes no pueden ser considerados iguales.</li><li>La clase String y las clases envoltorios (wrappers) sobrescriben equals() y son claves hash eficientes.</li><li>Cuando se sobrescribe el método equals(), es conveniente utilizar el operador instanceof para estar seguro de que se está evaluando un objeto correcto.</li><li>Cuando se sobrescribe el método equals(), es conveniente comprar los atributos significantes del objeto.</li><li>Los características más importantes del método equals() son:<br />- Es reflexivo: x.equals(x) es true.<br />- Es simétrico: Si x.equals(y) es true, entonces y.equals(x) debe ser true.<br />- Es transitivo: Si x.equals(y) es true, y y.equals(z) es true, entonces z.equals(x) es true.<br />- Es consistente: Múltiples llamadas a x.equals(y) deben retornar el mismo resultado.<br />- Null: Si x no es null, entonces x.equals(null) es false.</li><li>Si x.equals(y) es true, entonces x.hashCode() == y.hashCode() es true.</li><li>Si se sobrescribe equals(), es aconsejable sobrescribir hashCode().</li><li>HashMap, Hashtable, LinkedHashMap, HashSet y LinkedHashSet utilizan el código de hash.</li><li>Un hashCode() apropiado debe cumplir el contrato del método.</li><li>Un hashCode() eficiente debe retornar valores diferentes para distribuir a través de todas las claves.</li><li>El método equals() debe ser precioso como hashCode(), es decir, se deben utilizar las mismas variables de instancia para llevar a cabo sus operaciones.</li><li>Es legal que el método hashCode() devuelva el mismo valor para todas las instancias de una clase. Salvo que en la práctica esto no es eficiente.</li><li>Los características más importantes del método hashCode() son:<br />- Es consistente: Múltiples llamados a x.hashCode() devuelven el mismo valor entero.<br />- Si x.equals(y) es true, x.hashCode() == y.hashCode() es true.<br />- Si x.equals(y) es false, entonces x.hashCode() == y.hashCode() puede ser tanto true como false, pero si es false la implementación tiende a tener mayor eficiencia.</li><li>Las variables de instancia transient son inapropiadas para utilizar en equals() y hashCode().<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Colecciones (Objetivo 6.1):</span><br /></div><ul style="text-align: justify;"><li>Las acciones comunes sobre las colecciones son añadir elementos, eliminarlos, verificar su inclusión, obtenerlos y iterar sobre los mismos.</li><li>Existen cuatro tipos básicos de colecciones:<br />- Lists<br />- Sets<br />- Maps<br />- Queues</li><li>El ordenamiento puede ser alfabético, numérico o definido por el usuario.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Atributos clave de las clases de colección (Objetivo 6.1):</span><br /></div><ul style="text-align: justify;"><li>ArrayList: Rápida iteración y rápido acceso aleatorio.</li><li>Vector: Es como un ArrayList más lento, pero tiene sus métodos sincronizados.</li><li>LinkedList: Es bueno para agregar elementos al final, por ejemplo pilas y colas.</li><li>HashSet: Rápido acceso, asegura la no duplicación, no provee un orden.</li><li>LinkedHashSet: No posee elementos duplicados, itera por orden de inserción.</li><li>TreeSet: No posee elementos duplicados, itera en orden.</li><li>HashMap: Rápidas actualizaciones (clave/valor), permite una clave null y muchos valores null.</li><li>Hashtable: Es como un HashMap más lento, pero tiene sus métodos sincronizados. No permite valores null tanto en las claves como en los valores.</li><li>LinkedHashMap: Rápidas iteraciones, itera en orden de inserción o ultimo acceso. También permite valores null y una clave null.</li><li>TreeMap: Un mapa ordenado.</li><li>PriorityQueue: Una cola ordenada con las prioridades de sus elementos.</li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Utilizando las clases de colección (Objetivo 6.3):</span><br /></div><ul style="text-align: justify;"><li>Las colecciones pueden almacenar solo objetos, pero las primitivas pueden ser convertidas automáticamente a sus tipos envoltorios (autoboxed).</li><li>Las iteraciones se pueden realizar a través del operador for (nuevo) o con un objeto Iterator a través de los métodos hasNext() y next().</li><li>El método hasNext() determina si existen más elementos, el iterador no se mueve.</li><li>El método next() devuelve el siguiente elemento y mueve el iterador hacia adelante.</li><li>Para trabajar de manera eficiente, los objetos clave de un mapa deben sobrescribir el método equals() y hashCode().</li><li>Las colas utilizan el método offer() para añadir elementos, poll() para devolver y eliminar el elemento inicial, y peek() para obtener el elemento inicial.</li><li>A partir de Java 6 las clases TreeSet y TreeMap tienen nuevos métodos de navegación como floor() y higher().</li><li>Se pueden crear/extender sub-copias “respaldadas” de TreeSets y TreeMaps.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Ordenando y buscando en Arrays y Lists (Objetivo 6.5):</span><br /></div><ul style="text-align: justify;"><li>La ordenación se puede realizar en orden natural, o a través de un objeto Comparable o muchos Comparators.</li><li>Para implementar Comparable se debe utilizar el método compareTo(), el cual provee solo un modo de ordenación.</li><li>Se pueden crear muchos Comparators para ordenar una clase de diversas maneras, implementando el método compare().</li><li>Para que los elementos de una lista (List) puedan ser ordenados y buscados, los mismos deben ser comparables.</li><li>Para buscar elementos en un arreglo o lista, los elementos deben estar ordenados.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Clases de utilidad: Collections y Arrays (Objetivo 6.5):</span><br /></div><ul style="text-align: justify;"><li>Estas dos clases pertenecen al paquete java.util, y las mismas proveen:<br />- Un método sort(). El cual ordena los elementos en orden natural o a través de un objeto Comparator.<br />- Un método binarySearch(). Para buscar un elemento en un arreglo o lista previamente ordenado.<br />- El método Arrays.asList crea una lista (List) a partir de un arreglo.<br />- El método Collections.reverse() invierte el orden de los elementos de una lista.<br />- El método Collections.reverseOrder() devuelve un Comparator que ordena inversamente.<br />- Las interfaces List y Set poseen el método toArray() que convierte la colección en un arreglo.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Genéricos (Objetivo 6.4):</span><br /></div><ul style="text-align: justify;"><li>Los tipos genéricos permiten forzar la seguridad de los tipos, en tiempo de compilación, en las colecciones (o otras clases y métodos que utilicen tipos parametrizados).</li><li>Un ArrayList<T> permite almacenar objetos T o cualquier subtipo del mismo. (T también puede ser una interface).</li><li>Cuando se utilizan colecciones genéricas, no es necesario castear los objetos cuando se obtienen de la misma.</li><li>Se puede pasar una colección genérica como parámetro a un método que toma una colección no genérica, pero los resultados pueden ser inesperados.</li><li>Compilar sin ningún error no es lo mismo que compilar sin ninguna advertencia. Una advertencia de compilación no es considerado un error de compilación.</li><li>La información genérica de tipo no existe en tiempo de ejecución, es solo para la seguridad de tipos en tiempo de compilación. Mesclando genéricos con código legal se puede compilar correctamente, pero dicho código puede arrojar una excepción.</li><li>Las asignaciones polimórficas aplican solo al tipo base, no al parámetro de tipo genérico:<br />- List<Animal> l = new ArrayList<Animal>(); // valido<br />- List<Animal> l = new ArrayList<Dog>(); // inválido</li><li>La regla de asignación polimórfica aplica en cualquier lugar en donde se pueda realizar una asignación:<br />- void foo(List<Animal> l) { } // no puede tomar un argumento List<Dog><br />- List<Animal> bar() { } // no puede devolver un List<Dog></li><li>La sintaxis comodín permite a un método genérico, aceptar subtipos (o supertipos) de un tipo declarado como argumento de método: List<? extends Animal></li><li>Cuando se utiliza un comodin <? extends Dog>, la colección puede ser accedida pero no modificada.</li><li>Cuando se utiliza el comodin List<?>, cualquier tipo genérico puede ser asignado a la referencia, pero solo para acceso, no para modificaciones.</li><li>List<?> es igual a List<? extends Object>.</li><li>Las convenciones de declaración utilizan la letra T para tipos y E para elementos de una colección.</li><li>Se puede utilizar más de un tipo parametrizado en una declaración.</li><li>Se puede declarar un tipo genérico utilizando un tipo que no esté definido en la clase: public <T> void makeList(T t) { }</li></ul><br /></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-89695390030048078292009-09-03T17:16:00.000-07:002009-09-03T17:38:46.159-07:00Strings, I/O, Formateo, and Parseo<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del sexto capítulo (Strings, I/O, Formatting, and Parsing) del libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>".<br /><br /><span style="font-weight: bold;">String, StringBuilder y StringBuffer (Objetivo 3.1):</span><br />Un String es un objeto inmutable, una vez que el mismo se creó, no puede ser modificado. Cuando se realiza una concatenación de dos String, lo que hace la JVM es crear un nuevo objeto String con el valor de las dos cadenas concatenadas. Cuando se invoca un método del objeto String (por ej.: toUpperCase()), el método devuelve un nuevo objeto String con su correspondiente valor, no se modifica el valor original del String (con el que se invoco el método).<br />Algunos métodos de los objetos String:</div><ul style="text-align: justify;"><li>public char charAt(int index): Devuelve el carácter alojado en el índice pasado como parámetro.</li><li>public String concat(String s): Agrega un String al final de otro (como el operador ‘+’).</li><li>public boolean equalsIgnoreCase(String s): Determina la igualdad de dos String, ignorando las diferencias de mayúsculas y minúsculas.</li><li>public int length(): Devuelve la cantidad de caracteres que componen un String.</li><li>public String replace(char old, char new): Reemplaza las ocurrencias de un carácter con otro nuevo.</li><li>public String substring(int begin) - public String substring(int begin, int end): Devuelve una parte de un String.</li><li>public String toLowerCase(): Devuelve el String con todos los caracteres convertidos a minúsculas.</li><li>public String toUpperCase(): Devuelve el String con todos los caracteres convertidos a mayúsculas.</li><li>public String trim(): Remueve los espacios en blanco del principio y final del String.<br /></li></ul><div style="text-align: justify;">La clase StringBuilder (agregada en Java 5), posee exactamente los mismos métodos que la clase StringBuffer. La única diferencia entre ellas, es que la clase StringBuilder es más rápida debido a que sus métodos no están sincronizados. Estas dos clases se utilizan para realizar muchas modificaciones sobre los caracteres de una cadena. Los objetos de estas clases no crean un nuevo objeto cada vez que se modifican (como los objetos String), es por esto que son más eficientes para realizar muchas modificaciones sobre cadenas.<br />Algunos métodos de los objetos StringBuilder y StringBuffer:<br /></div><ul style="text-align: justify;"><li>public synchronized StringBuffer append(String s)</li><li>public StringBuilder delete(int start, int end)</li><li>public StringBuilder insert(int offset, String s)</li><li>public synchronized StringBuffer reverse()</li><li>public String toString()</li></ul><div style="text-align: justify;"><span style="font-style: italic;">Resumen (TWO-MINUTE DRILL):</span><br /></div><ul style="text-align: justify;"><li>Los objetos String son inmutables, pero las referencias a String no lo son.</li><li>Si se crea un nuevo objeto String, pero no se asigna a una variable de referencia, el mismo se pierde para el programa.</li><li>Si se redirecciona una variable referencia a un nuevo objeto String, el objeto String anterior se pierde.</li><li>Los métodos de objetos String utilizan los índices basados en cero, excepto el método substring(), el cuál utiliza su segundo argumento basado en uno.</li><li>La clase String es final, sus métodos no pueden ser sobreescritos.</li><li>Cuando la JVM encuentra un literal String, este se agrega al “String literal pool”.</li><li>Los objetos String poseen el método length(), los arreglos poseen la propiedad length.</li><li>La API de la clase StringBuffer es la misma que la de StringBuilder, salvo que los métodos de esta última no se encuentran sincronizados.</li><li>Los métodos de los objetos StringBuilder son más rápidos que los de StringBuffer.</li><li>Los siguientes puntos se aplican a ambas clases (StringBuilder y StringBuffer):<br />- Son mutables, pueden cambiar su valor sin crear un nuevo objeto.<br />- La invocación de sus métodos cambian el valor del objeto, sin realizar ninguna asignación explícita.<br />- El método equals() no está sobreescrito, no compara los valores.</li><li>La encadenación de métodos se evalúa de izquierda a derecha.<br /></li></ul><div style="text-align: justify;"><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/resumenes/06/codigo/Main01.java">Ver ejemplo: Main01.java</a><br /><br /><span style="font-weight: bold;">File e I/O (Objetivo 3.2):</span><br />Clases que se necesitan saber para el examen:<br /></div><ul style="text-align: justify;"><li>File: Es una representación abstracta de un archivo o directorio. Esta clase no se utiliza para escribir o leer datos, si no para trabajar a alto nivel. Es decir, para crear, buscar, eliminar archivos y para trabajar con directorios y rutas.</li><li>FileReader: Esta clase se usa para leer caracteres de un archivo. Tiene un método read() de bajo nivel, el cual se puede utilizar para leer un simple carácter, un flujo entero de caracteres, o un número especifico de caracteres.</li><li>BufferedReader: Esta clase se utiliza para hacer más eficientes las clases de bajo nivel como FileReader. Permite leer grandes cantidades de información de un archivo de una sola vez, y almacenar los datos en un buffer. De este modo cada vez que se necesite obtener la información, se obtendrá desde el buffer minimizando así los accesos a disco. También provee el método readLine().</li><li>FileWriter: Esta clase se usa para escribir caracteres en un archivo. Posee el método write() que permite escribir caracteres o Strings a un archivo.</li><li>BufferedWriter: Se utiliza para hacer más eficientes y más fácil de utilizar las clases de bajo nivel como FileWriter. Esta clase escribe grandes cantidades de información a un archivo de una vez, minimizando el número de operaciones de escritura. También provee el método writeLine(), el cual añade los caracteres de salto de línea correspondientes a la plataforma en la que se ejecuta.</li><li>PrintWriter: Envuelve las clases FileWriter y BufferedWriter. Añade varios métodos como format(), printf() y append() que brindan mayor flexibilidad y poder.<br /></li></ul><div style="text-align: justify;">Cuando se crea una instancia de la clase File, solo se está creando el nombre de un archivo. Esta clase contiene métodos de utilidad para realizar operaciones sobre archivos y directorios:<br /></div><ul style="text-align: justify;"><li>public boolean exists(): Devuelve true si el archivo existe.</li><li>public boolean createNewFile(): Crea un nuevo archivo, si el mismo no existe.</li><li>public boolean mkdir(): Crea un nuevo directorio, si el mismo no existe.</li><li>public boolean delete(): Elimina un archivo o directorio. No se puede eliminar directorios si los mismos no se encuentran vacios.</li><li>public boolean renameTo(): Se pasa como argumento una instancia de File con el nuevo nombre del archivo.</li><li>public String[] list(): Devuelve un arreglo de String’s con los archivos y directorios contenidos en la ubicación actual.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlHVpE_WUR4_1IjgExxSOjSp6TDQVm_7A_hXeV2tUTiEDbKot3XQe2TsNOcIDASQMfEpu4G1PdwQSdg_EOsAlOwRorrbiWSQRzKFg7dbw_hhyphenhyphenCb7AhGPBvkcg9-8byqvTX5_gTpDID-ds/s1600-h/imagen_01.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 277px; height: 355px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlHVpE_WUR4_1IjgExxSOjSp6TDQVm_7A_hXeV2tUTiEDbKot3XQe2TsNOcIDASQMfEpu4G1PdwQSdg_EOsAlOwRorrbiWSQRzKFg7dbw_hhyphenhyphenCb7AhGPBvkcg9-8byqvTX5_gTpDID-ds/s320/imagen_01.png" alt="" id="BLOGGER_PHOTO_ID_5377400912092954322" border="0" /></a></li></ul><div style="text-align: justify;">La clase Console permite aceptar entradas desde la línea de comandos. El método readLine() devuelve un String que contiene lo que el usuario haya ingresado. El método readPassword() devuelve un arreglo de caracteres que contienen el password solicitado. La clase Console no se puede instanciar a través de su constructor. Para obtener una instancia se debe invocar el método estático System.console().<br /><br /><span style="font-style: italic;">Resumen (TWO-MINUTE DRILL):</span></div><ul style="text-align: justify;"><li>Las clases que se deben entender del paquete java.io son: File, FileReader, BufferedReader, FileWriter, BufferedWriter, PrintWriter y Console.</li><li>Cuando se crea un nuevo objeto File, no significa que se crea un nuevo objeto.</li><li>Un objeto File puede representar tanto un archivo como un directorio.</li><li>La clase File permite administrar (crear, renombrar y eliminar) archivos y directorios.</li><li>Los métodos createNewFile() y mkdir() agregan archivos y directorios al sistema de archivos.</li><li>FileWriter y FileReader son clases I/O de bajo nivel. Se pueden utilizar para escribir y leer archivos, pero generalmente se envuelven en clases con mayor funcionalidad.</li><li>Es muy común envolver un objeto FileReader con una instancia de BufferedReader o una instancia de FileWriter con una de BufferedWriter, para tener métodos más eficientes y de alto nivel.</li><li>Los objetos PrintWriter’s pueden ser utilizados para envolver tipos Writer, pero desde Java 5 pueden ser instanciados directamente desde instancias File o String.</li><li>La clase PrintWriter desde Java 5 posee nuevos métodos: append(), format() y printf().<br /></li></ul><div style="text-align: justify;"><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/resumenes/06/codigo/Main02.java">Ver ejemplo: Main02.java</a><br /><br /><span style="font-weight: bold;">Serialización (Objetivo 3.3):</span><br />La serialización permite guardar el estado de un objeto (es decir, todas sus variables de instancia). Si una variable de instancia tiene el especificador transient, la misma no será almacenada por el proceso de serialización.<br />Para que un objeto pueda ser serializado, el mismo debe implementar la interface Serializable (dicha interface no posee métodos para implementar, solo es un marcador). Un objeto serializado se almacena en un archivo de bytes, se utilizan dos métodos que permiten leer y escribir un stream de datos.<br /></div><ul style="text-align: justify;"><li>ObjectOutputStream.writeObject()</li><li>ObjectInputStream.readObject()<br /></li></ul><div style="text-align: justify;">Ambas clases son envoltorios de las clases FileOutputStream y FileInputStream. Los métodos writeObject() y readObject() trabajan con objetos de tipo Serializable.<br /><br />Cuando se intenta serializar un objeto (Serializable) que contiene (relación TIENE-UN) una referencia a otro tipo de objeto pueden ocurrir ciertas situaciones:<br /></div><ul style="text-align: justify;"><li>Si el objeto contenido no implementa la interface Serializable: Se produce la siguiente excepción en tiempo de ejecución NoSerializableException.</li><li>Si la variable de referencia al objeto contenido está marcada con el especificador transient: Se serializa el estado del objeto contenedor, dejando de lado el estado del objeto contenido.</li><li>Si la clase del objeto contenido implementa la interface Serializable: Se guarda todo el estado completo del objeto. Es decir, cuando se deserialice el estado del objeto contenedor, también se recuperará el estado del objeto contenido.<br /></li></ul><div style="text-align: justify;">El proceso de serialización de Java posee un mecanismo especial para los objetos que son especiales y difíciles de guardar. Se trata de un conjunto de métodos privados que se pueden implementar en la clase en cuestión. Si dichos métodos concuerdan con la signatura exacta, se invocarán durante el proceso de serialización y deserialización del objeto. Las signaturas son las siguientes:<br /></div><ul style="text-align: justify;"><li>private void writeObject (ObjectOutputStream os) { }</li><li>private void readObject (ObjectInputStream is) { }<br /></li></ul><div style="text-align: justify;">Gracias a estos dos métodos es posible manejar el proceso de serialización. Esto se puede realizar debido a que los objetos ‘os’ e ‘is’ tienen un conjunto de métodos para invocar el proceso de serialización por defecto y además métodos para almacenar y leer datos adicionales.<br />Proceso de serialización por defecto:</div><ul style="text-align: justify;"><li>ObjectOutputStream.defaultWriteObject()</li><li>ObjectInputStream.defaultReadObject()<br /></li></ul><div style="text-align: justify;">Métodos para almacenar y leer datos adicionales:<br /></div><ul style="text-align: justify;"><li>ObjectOutputStream.writeInt()</li><li>ObjectOutputStream.writeFloat()</li><li>ObjectInputStream.readInt()</li><li>ObjectInputStream.readFloat()<br /></li></ul><div style="text-align: justify;">La herencia también se ve afectada por el proceso de serialización. Cuando una clase base implementa la interface Serializable, hace que todas sus subclases también la implementen.<br />El problema real se da cuando una clase base no es Serializable pero una de sus clases hijas si lo es. Esta situación produce que se serialice solo el estado de la clase hija, dejando de lado todas las variables de instancia de la clase base. Para que este escenario sea posible, la clase base debe poseer un constructor por defecto. En caso contrario se producirá un error en tiempo de ejecución a la hora de deserializar el objeto, ya que se intentará invocar automáticamente el constructor por defecto de clase base.<br /><br /><span style="font-style: italic;">Resumen (TWO-MINUTE DRILL):</span><br /></div><ul style="text-align: justify;"><li>Las clases que se necesitan conocer del paquete java.io son: ObjectInputStream, ObjectOutputStream, FileInputStream, FileOutputStream.</li><li>Una clase debe implementar la interface Serializable antes de poder ser serializada.</li><li>El método ObjectOutputStream.writeObject() serializa los objetos, y el método ObjectInputStream.readObject() deserializa los objetos.</li><li>Si una variable de instancia es marcada con el especificador transient, la misma no será serializada, aunque todas las demás variables de instancia si lo hagan.</li><li>Si una superclase implementa la interface Serializable, entonces las subclases lo hacen automáticamente.</li><li>Si una superclase no implementa Serializable, cuando una subclase se deserializa, se invoca el constructor por defecto de la clase padre.</li><li>DataInputStream y DataOutputStream no se toman en el examen.<br /></li></ul><div style="text-align: justify;"><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/resumenes/06/codigo/Main03.java">Ver ejemplo: Main03.java</a><br /><br /><span style="font-weight: bold;">Fechas, números y monedas (Objetivo 3.4):</span><br />Clases que se necesitan saber para el examen:<br /></div><ul style="text-align: justify;"><li>java.util.Date: La mayoría de los métodos de esta clase están depreciados. Pero esta clase es útil como puente entre Calendar y DateFormat.</li><li>java.util.Calendar: Provee una gran variedad de métodos que ayudan a convertir y manipular fechas y tiempos.</li><li>java.text.DateFormat: Esta clase se utiliza no solo para formatear fechas en varios estilos, sino también para formatear fechas de varias localidades del planeta.</li><li>java.text.NumberFormat: Esta clase se utiliza para formatear números y monedas para varias localidades del planeta.</li><li>java.util.Locale: Esta clase se utiliza junto con DateFormat y NumberFormat para formatear fechas, números y monedas para una localidad específica.<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsX6XRCKtHen3SEQJiTuiLvjr_8WwdhyPv99Uu8MrK2CZCBmAOQBKeTrKjJSNpzGlVypkwcVhPD0wLJYmYUS1cDc-M9dQ-QbmPjSmuFpIe4gR_bBYTM_i3CRq-kPfp9AkQEYf1cSqAOe8/s1600-h/imagen_02.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 302px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsX6XRCKtHen3SEQJiTuiLvjr_8WwdhyPv99Uu8MrK2CZCBmAOQBKeTrKjJSNpzGlVypkwcVhPD0wLJYmYUS1cDc-M9dQ-QbmPjSmuFpIe4gR_bBYTM_i3CRq-kPfp9AkQEYf1cSqAOe8/s320/imagen_02.png" alt="" id="BLOGGER_PHOTO_ID_5377402284489316098" border="0" /></a></li></ul><div style="text-align: justify;"><span style="font-style: italic;">Resumen (TWO-MINUTE DRILL):</span><br /></div><ul style="text-align: justify;"><li>Las clases que se necesitan saber para este objetivo son: java.util.Date, java.util.Calendar, java.text.DateFormat, java.text.NumberFormat y java.util.Locale.</li><li>La mayoría de los métodos de la clase Date están depreciados.</li><li>Dentro de una instancia Date, la fecha se almacena como un valor long, la cantidad de milisegundos desde el 1ro de Enero de 1970.</li><li>Los objetos Date son utilizados con instancias Calendar y Locale.</li><li>La clase Calendar provee un poderoso conjunto de métodos para manipular fechas, realizar tareas como obtener los días de la semana, o agregar un numero de meses o años (u otros tipos de incrementos) a una fecha.</li><li>Para crear una instancia de la clase Calendar, se debe invocar el método estático (getInstance()).</li><li>Los métodos de Calendar que se deben conocer son:<br />- add(): Permite adicionar o sustraer varias piezas (minutos, días, horas, etc.) de fechas.<br />- roll(): Funciona al igual que add(), a diferencia que no incrementa las piezas más grandes de la fecha.</li><li>Para crear instancias de la clase DateFormat, se deben utilizar los métodos estáticos getInstance() y getDateInstance().</li><li>Existen diferentes estilos disponibles en la clase DateFormat.</li><li>El método DateFormat.format() se utiliza para crear String que contienen fechas formateadas.</li><li>La clase Locale se utiliza conjuntamente con las clases DateFormat y NumberFormat.</li><li>Las instancias de DateFormat y NumberFormat pueden ser creadas con un objeto Locale específico, el cuál es inmutable.</li><li>Para el examen se debe saber cómo crear objetos Locale utilizando el leguaje, o la combinación de lenguaje y país.<br /></li></ul><div style="text-align: justify;"><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/resumenes/06/codigo/Main04.java">Ver ejemplo: Main04.java</a><br /><br /><span style="font-weight: bold;">Parseo, Tokenizing y Formateo (Objetivo 3.5):</span><br /><span style="font-style: italic;">Resumen (TWO-MINUTE DRILL):</span><br /></div><ul style="text-align: justify;"><li>Las expresiones regulares, son patrones utilizados para buscar información dentro de grandes fuentes de datos.</li><li>Las expresiones regulares, son un sub-lenguaje que existe dentro de Java.</li><li>Las expresiones regulares permiten crear patrones de búsqueda mediante caracteres o metacaracteres. Los metacaracteres permiten buscar información más abstracta como dígitos o espacios en blanco.</li><li>Los metacaracteres utilizados en el examen son: ‘\d’, ‘\w’, ‘\s’ y ‘.’.</li><li>Los cuantificadores utilizados en el examen son: ‘?’, ‘*’ y ‘+’.</li><li>Los metacaracteres deben ser escapados dentro de los Strings. String s = “\\d”.</li><li>Las clases Pattern y Matcher poseen las capacidades más poderosas de Java para las expresiones regulares.</li><li>Los métodos que son utilizados en el examen son:<br />- Pattern: compile()<br />- Matcher: matches(), pattern(), find(), start() y group().</li><li>Tokenizing es el proceso de dividir información delimitada en pequeñas piezas.</li><li>El proceso Tokenizing se puede llevar a cabo mediante la clase Scanner o a través del método String.split().</li><li>Los delimitadores pueden ser caracteres simples como una coma, o expresiones regulares.</li><li>La clase Scanner permite dividir información dentro de un bucle, pero también permite parar este proceso en cualquier parte (a diferencia del método String.split() el cuál debe procesar todos los datos de una vez para obtener un resultado).</li><li>La clase Scanner permite dividir Strings, streams (flujos de datos) o archivos.</li><li>A partir de Java 5 se encuentran disponibles los métodos format() y printf(). Los cuales pertenecen a la clase PrintWriter. Ambos métodos poseen la misma funcionalidad, formatear una salida.</li><li>%[arg_index$][flags][ancho][.precision]carcter de conversión<br />- Flags: ‘-‘, ‘+’, ‘0’, ‘,’ y ‘(‘.<br />- Conversiones: b, c, d, f y s.</li><li>Si en carácter de conversión no concuerda con el tipo de argumento, se lanza una excepción.<br /></li></ul><div style="text-align: justify;"><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/resumenes/06/codigo/Main05.java">Ver ejemplo: Main05.java</a><br /><br /></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-62557562865562569472009-09-03T16:42:00.000-07:002009-09-03T16:52:15.439-07:00Control de flujo, Excepciones y Assertions<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del quinto capítulo (Flow Control, Exceptions, and Assertions) del libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>".<br /></div><br /><div style="text-align: justify;"><span style="font-weight: bold;">Escribir código que utiliza los bloques if y switch (Objeto 2.1):</span><br /></div><ul style="text-align: justify;"><li>En un bloque if la única expresión legal es una booleana. Es decir, una expresión que pueda resolverse como un valor boolean o Boolean.</li><li>Tener cuidado con las asignaciones booleanas (=) ya que pueden ser confundidas con una comprobación de igualdad (==).</li><li>Los corchetes son opcionales en un bloque if que tenga solo una línea. Tener cuidado con la identación.</li><li>Un bloque switch solo puede evaluar enumeraciones (enums) o alguno de los tipos primitivos que puedan ser promovidos implícitamente al tipo int (byte, short, int o char).</li><li>Una constante case debe ser un literal o una variable final, o una expresión constante (incluido un enum). No puede existir una clausula case con una variable que no sea final, o con un rango de valores.</li><li>Si una condición en un bloque switch coincide con una constante case, la ejecución comenzará a partir de dicha constante case y continuará hasta que se encuentre con una instrucción break, o hasta la finalización del bloque switch. Es decir, la primer constante case que coincida será el punto de de comienzo de la ejecución.</li><li>La palabra clave default puede ser utilizada en un bloque switch si se quiere ejecutar algún código cuando ninguna de las constantes case aplican.</li><li>El bloque default puede estar situado en cualquier parte del bloque switch, es decir, antes, después o entre media de constantes case.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Escribir código que utilice bucles (Objetivo 2.2):</span><br /></div><ul style="text-align: justify;"><li>Un bloque básico for está compuesto por tres partes: declaración y/o inicialización, evaluación booleana, y la expresión de iteración.</li><li>Si una variable es incrementada o evaluada dentro de un bucle for, aquella debe estar declarada antes del este, o dentro de la declaración del bucle for.</li><li>Una variable declarada dentro de la sección de declaración de un bucle for solo puede ser utilizada dentro de este. Es decir, el ámbito de la variable es solo dentro del bucle for.</li><li>Se puede inicializar más de una variable del mismo tipo dentro de la sección de declaración del bucle for; cada inicialización debe estar separada por una coma.</li><li>Un bloque foreach (introducido en Java 6), está compuesto de dos partes, la declaración y la expresión. Es utilizado solo para iterar a través de los elementos de un arreglo o una colección.</li><li>En un for (de tipo foreach), la expresión es el arreglo o la colección a través de la cual se va a iterar.</li><li>En un for (de tipo foreach), la declaración es donde se declara la variable (la cuál es del mismo tipo que los elementos) que contendrá el valor de cada uno de los elementos de la colección.</li><li>Solo pueden ser utilizados valores o expresiones booleanas dentro de una condición de un if o un bucle. No se pueden utilizar números.</li><li>En el bucle do, su cuerpo siempre se ejecuta al menos una vez, incluso si la condición no se cumple.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Utilizar break y continue (Objetivo 2.2):</span><br /></div><ul style="text-align: justify;"><li>La clausula break provoca que la iteración actual de un bucle se detenga y que se ejecute la siguiente línea de código fuera del bucle.</li><li>La clausula continue provoca que la iteración actual de un bucle se detenga, luego se comprueba la condición del bucle, y en caso de ser afirmativa el bucle se ejecuta nuevamente.</li><li>Si una clausula break o una continue se encuentran etiquetadas, estas provocan la misma acción pero en el bucle etiquetado, no en el que se está ejecutando.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Manejando excepciones (Objetivos 2.4, 2.4 y 2.6):</span><br /></div><ul style="text-align: justify;"><li>Existen dos tipos de excepciones: comprobadas y no comprobadas.</li><li>Las excepciones comprobadas incluyen todos los subtipos de la clase Exception, salvo las subclases de RuntimeException.</li><li>Cualquier método que pueda lanzar una excepción comprobada la debe declarar en la clausula throws, o tratarla en los correspondientes bloques try/catch.</li><li>Los subtipos de Error y RuntimeException no son comprobados, por lo tanto el compilador no obliga a tratarlas o declararlas en la clausula throws.</li><li>Si se utiliza el bloque (opcional) finally, este será ejecutado tanto si el código del bloque try termina correctamente, como si se genera una excepción y la misma es atrapada por un bloque de tratamiento.</li><li>La única excepción en la que el bloque finally no será ejecutado, es si dentro del bloque try (o algún bloque catch) se realiza una invocación el método System.exit().</li><li>Que el bloque finally siempre se ejecute, no quiere decir que el mismo se ejecutará completamente. El código dentro de un bloque finally puede lanzar una excepción o invocar el método System.exit().</li><li>Las excepciones no atrapadas se propagan hacia abajo a través de la pila de llamadas (call stack). Comenzando a partir del método en el que la excepción fue lanzada y terminando en el lugar donde se trate la misma, o finalizando la ejecución del programa.</li><li>Se pueden declarar nuevas excepciones extendiendo de la clase Exception o alguno de sus subtipos. Estas excepciones son consideradas comprobadas y el compilador obliga a tratarlas o declararlas en la clausula thorws cada vez que sean generadas.</li><li>Los bloques catch deben estar ordenados desde los tipos de excepciones más específicos hacia los más generales (primero los subtipos y luego las clases bases). En caso contrario, el compilador generará un error porque algún bloque catch nunca va a poder ser alcanzado.</li><li>Las excepciones pueden ser creadas por la JVM o por un programador.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Trabajando con el mecanismo Assertions (Objetivo 2.3):</span><br /></div><ul style="text-align: justify;"><li>Una Assertion brinda una manera de testear las suposiciones durante el desarrollo y el debug.</li><li>Las Assertions típicamente están activadas durante el testeo pero desactivadas durante la implementación.</li><li>Se puede utilizar ‘assert’ como una palabra clave (a partir de la versión 1.4) o como un identificador, pero nunca de las dos maneras. Para compilar código antiguo que utilice la palabra ‘assert’ como un identificador, se debe usar el comando –source 1.3 a la hora de compilar.</li><li>El mecanismo Assertions por defecto esta desactivado en tiempo de ejecución. Para activarlo se debe utilizar el comando –ea o –enableassertions.</li><li>Para desactivar el mecanismo se debe utilizar el comando –da o –disableassertions.</li><li>Para activar o desactivar el mecanismo Assertions en general, se lo debe hacer sin ningún argumento. Se puede combinar la activación y desactivación para utilizar el alguna clase y/o paquete en especial.</li><li>No utilizar las assertions para validar argumentos de métodos públicos.</li><li>No utilizar expresiones assert que provoquen efectos. No se garantiza que las assertions siempre se van a ejecutar, y no se aconseja tener diferentes comportamientos dependiendo de si están o no activadas.</li><li>Utilizar assertions (incluso en los métodos públicos) para validar bloques de código que nunca van a ser alcanzados. Por ejemplo: assert false; Esto provoca un error en caso de que el código sea ejecutado.</li></ul><br /></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-12880326182862865702009-08-18T05:46:00.000-07:002009-08-18T06:12:38.102-07:00Cadenas de caracteres<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">Resumen del capítulo 13 (Cadenas de caracteres) del "<a style="font-style: italic;" href="http://scjp-preparacion.googlecode.com/files/TJAVA.pdf">Libro Thinking in Java (4ta Edición)</a>".<br /><br /><span style="font-weight: bold;">Introducción</span><br /><br />Los objetos de clase <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a> son inmutables. Todos los métodos de la clase que parecen modificar una cadena de caracteres, lo que hacen en realidad, es devolver un objeto <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a> completamente nuevo que contiene dicha modificación. Puesto a que este tipo de objetos es inmutable, se pueden establecer tantos alias como se desee, pero no hay ninguna posibilidad de que una referencia modifique algo que pueda afectar a otras referencias.<br />Los operadores ‘+’ y ‘=+’ para objetos <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a> son los únicos operadores sobrecargados en Java. El compilador cuando se encuentra con alguno de estos operadores (que intentan concatenar Strings), lo que hace es crear un objeto <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html">StringBuilder</a>. Con una instancia de esta clase, se invoca el método <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#append%28java.lang.String%29">append()</a> la cantidad de veces necesarias para cada concatenación, y finalmente se invoca el método <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#toString%28%29">toString()</a> para devolver el resultado.<br />Los objetos <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html">StringBuilder</a> disponen de un conjunto completo de métodos como: <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#insert%28int,%20boolean%29">insert()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#delete%28int,%20int%29">delete()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#replace%28int,%20int,%20java.lang.String%29">replace()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#substring%28int%29">substring()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#reverse%28%29">reverse()</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#append%28boolean%29">append()</a> y <a href="http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#toString%28%29">toString()</a>.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/13/codigo/Main01.java">Ver ejemplo: Main01.java</a><br /><br /><span style="font-weight: bold;">Clase Formatter</span><br /><br />Una de las características incorporadas en Java SE5 es el formateo de la salida al estilo de la instrucción printf() de C. Toda la nueva funcionalidad de formateo de Java es gestionada por la clase <a href="http://java.sun.com/javase/6/docs/api/java/util/Formatter.html">Formatter</a> del paquete java.util. Esta clase se puede considerar como una especie de traductor que convierte la cadena de formato y los datos al resultado deseado. Cuando se instancia un objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/Formatter.html">Formatter</a>, se le indica a donde se deben mandar los resultados. El constructor de la clase se encuentra sobrecargado para admitir diversas ubicaciones de salida, pero las más útiles son <a href="http://java.sun.com/javase/6/docs/api/java/io/PrintStream.html">PrintStream</a>, <a href="http://java.sun.com/javase/6/docs/api/java/io/OutputStream.html">OutputStream</a> y <a href="http://java.sun.com/javase/6/docs/api/java/io/File.html">File</a>.<br />Existe un atajo para realizar el formateo de la salida sin utilizar un objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/Formatter.html">Formatter</a>. Todos los objetos <a href="http://java.sun.com/javase/6/docs/api/java/io/PrintStream.html">PrintStream</a> o <a href="http://java.sun.com/javase/6/docs/api/java/io/PrintWriter.html">PrintWriter</a> (dentro de los que se incluye System.out) tienen disponible el método <a href="http://java.sun.com/javase/6/docs/api/java/io/PrintStream.html#format%28java.lang.String,%20java.lang.Object...%29">format()</a>.<br />Para controlar el espaciado y la alineación cuando se insertan los datos, hacen falta especificadores de formato más elaborados:<br /><span style="font-style: italic;">%[indice_argumento$][indicadores][anchura][.precisión]conversión</span><br /><ul><li>Índice argumento: Indica el índice del argumento que será utilizado para realizar la conversión.</li><li>Indicadores: De manera predeterminada, los datos se justifican a la derecha. Para justificar los datos a la izquierda se debe incluir el indicador ‘-‘.</li><li>Anchura: Permite controlar el tamaño mínimo de un campo. Se garantiza que un campo tenga al menos una anchura de un cierto número de caracteres, rellenándolo con espacios en caso de ser necesario. (Es aplicable a todos los tipos de conversión de datos).</li><li>Precisión: Se utiliza para especificar un máximo. Tiene un significado distinto para los diferentes tipos:<br />- Cadenas de caracteres: Especifica el número máximo de caracteres del objeto String que hay que imprimir.<br />- Números en coma flotante: Especifica el numero de posiciones decimales que hay que mostrar (el valor predeterminado el 6), efectuando un redondeo si hay más dígitos o añadiendo más ceros al final si hay pocos.<br />- Enteros: La precisión no es aplicable ya que no tienen parte fraccionaría. Se generará una excepción si se utiliza este argumento.<br /></li></ul>Caracteres de conversión:<br /><ul><li>d: Entero (como decimal)</li><li>c: Carácter Unicode</li><li>b: Valor booleanos: Cadena de caracteres</li><li>f: Coma flotante (como decimal)</li><li>e: Coma flotantes (en notación científica)</li><li>x: Entero (como hexadecimal)</li><li>h: Código hash (como hexadecimal)<br /></li></ul>Java SE5 también ha tomado prestado de C la idea de sprintf(), que es un método que se utiliza para crear cadenas de caracteres. <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html#format%28java.lang.String,%20java.lang.Object...%29">String.format()</a> es un método estático que toma los mismos argumentos que el método <a href="http://java.sun.com/javase/6/docs/api/java/io/PrintStream.html#format%28java.lang.String,%20java.lang.Object...%29">format()</a> de <a href="http://java.sun.com/javase/6/docs/api/java/util/Formatter.html">Formatter</a> pero devuelve un objeto <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a>.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/13/codigo/Main02.java">Ver ejemplo: Main02.java</a><br /><br /><span style="font-weight: bold;">Expresiones regulares</span><br /><br />Las expresiones regulares son herramientas de procesamiento de texto muy potentes y flexibles. Nos permiten especificar patrones complejos de texto que pueden buscarse en una cadena de entrada. Proporcionan un lenguaje compacto y dinámico que puede emplearse para resolver todo tipo de tareas de procesamiento, comparación, selección, edición y verificación de cadenas de una forma general.<br />La forma más simple de utilizar las expresiones regulares consiste en utilizar la funcionalidad incluida dentro de la clase <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a>. Esta clase permite realizar búsquedas (<a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html#matches%28java.lang.String%29">matches()</a>), partir la cadena (<a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29">split()</a>) y realizar sustituciones (<a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html#replaceFirst%28java.lang.String,%20java.lang.String%29">replaceFirst()</a> o <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29">replaceAll()</a>).<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/13/codigo/Main03.java">Ver ejemplo: Main03.java</a><br /><br />En general, lo que se hace es compilar objetos de expresión regular en lugar de emplear las utilidades <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a>, que son bastante limitadas. Para ello, se debe importar la librería <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/package-frame.html">java.util.regex</a>, y luego compilar una expresión regular utilizando el método estático <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#compile%28java.lang.String%29">Pattern.compile()</a>. Esto genera un objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html">Pattern</a> basado en su argumento <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a>. Para utilizar el objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html">Pattern</a>, lo que se hace es invocar el método <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#matcher%28java.lang.CharSequence%29">matcher()</a>, pasándole la cadena de caracteres que se quiere buscar. Este método genera un objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html">Matcher</a>, el cual tiene muchas operaciones para trabajar con cadenas.<br /><ul><li>public boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#matches%28%29">matches()</a>: Devolverá true solo si el patrón se corresponde con la cadena de entrada completa.</li><li>public boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#lookingAt%28%29">lookingAt()</a>: Devolverá true solo si la cadena de entrada, comenzando por el principio, permite establecer una correspondencia con el patrón.</li><li>public boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#find%28%29">find()</a>: Puede utilizarse para descubrir múltiples correspondencias de patrón en el objeto CharSequence al cuál se aplique. Es como un iterador, que se desplaza hacia adelantea través de la cadena de caracteres de entrada.</li><li>public boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#find%28int%29">find(int start)</a>: El argumento indica en qué posición de la cadena debe comenzar la búsqueda.</li><li>public String <a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#group%28%29">group()</a>: Devuelve la correspondencia completa de la operación anterior de establecimiento de correspondencias (<a href="http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#find%28%29">find()</a>).<br /></li></ul><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/13/codigo/Main04.java">Ver ejemplo: Main04.java</a><br /><br /><span style="font-weight: bold;">Clase Scanner</span><br /><br />Otra característica agregada en Java SE5 es la clase <a href="http://java.sun.com/javase/6/docs/api/java/util/Scanner.html">Scanner</a>. Dicha clase permite eliminar buena parte de la complejidad relacionada con el análisis de una entrada. Esta entrada puede ser tanto un archivo como un flujo de datos. El constructor de <a href="http://java.sun.com/javase/6/docs/api/java/util/Scanner.html">Scanner</a> admite casi cualquier tipo de objeto de entrada, <a href="http://java.sun.com/javase/6/docs/api/java/io/File.html">File</a>, <a href="http://java.sun.com/javase/6/docs/api/java/io/InputStream.html">InputStream</a>, <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a> o un objeto que implemente la interface <a href="http://java.sun.com/javase/6/docs/api/java/lang/Readable.html">Readable</a>. Con <a href="http://java.sun.com/javase/6/docs/api/java/util/Scanner.html">Scanner</a>, los pasos de entrada, extracción de elementos y análisis sintáctico están implementados mediante diferentes tipos de métodos. El método <a href="http://java.sun.com/javase/6/docs/api/java/util/Scanner.html#next%28%29">next()</a> devuelve el siguiente elemento <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html">String</a> y existen métodos similares para todos los tipos primitivos (excepto char), como para también para los tipos BigDecimal y BigInteger. También existen los métodos “hasNext” correspondientes que devuelven true si el siguiente elemento de entrada es del tipo correcto.<br />De manera predeterminada, un objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/Scanner.html">Scanner</a> divide los elementos de entrada según los caracteres de espaciados, pero también podemos especificar nuestro patrón delimitador en forma de expresión regular a través del método <a href="http://java.sun.com/javase/6/docs/api/java/util/Scanner.html#useDelimiter%28java.util.regex.Pattern%29">useDelimiter()</a>.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/13/codigo/Main04.java">Ver ejemplo: Main05.java</a><br /><br /></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-80124391672019618592009-08-12T10:11:00.000-07:002009-08-12T10:56:19.491-07:00Tratamiento de errores mediante excepciones<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">Resumen del capítulo 12 (Tratamiento de errores mediante excepciones) del "<a style="font-style: italic;" href="http://scjp-preparacion.googlecode.com/files/TJAVA.pdf">Libro Thinking in Java (4ta Edición)</a>".<br /><br /><span style="font-weight: bold;">Introducción</span><br /><br />Para crear un sistema robusto, cada componente tiene que ser robusto. Al proporcionar un modelo coherente de informe de errores utilizando excepciones, Java permite que los componentes comuniquen los problemas de manera fiable al código cliente. Imponer esta formalidad para el tratamiento de errores permite crear sistemas de gran envergadura utilizando menos código de lo habitual y reducir la complejidad del mismo.<br />Una excepción se genera cuando ocurre una situación inesperada, lo cual impide continuar con el normal procesamiento, ya que no se posee la información necesaria para tratar con el problema en el contexto actual.<br />Sucesos que se dan a partir de la generación de una excepción:<br /><ol><li>Se crea un objeto excepción de la misma manera que cualquier otro objeto (utilizando la instrucción new).</li><li>Se detiene la ruta actual de ejecución y se extrae del contexto actual la referencia al objeto excepción.</li><li>Luego el mecanismo de tratamiento de excepciones se hace cargo del problema y comienza a buscar un lugar apropiado donde continuar ejecutando el programa.</li><li>Dicho lugar es la rutina de tratamiento de excepciones, cuya tarea consiste en recuperarse del problema de modo que el programa pueda intentar hacer otra cosa o simplemente continuar con lo que estuviera haciendo.<br /></li></ol>Existen tres secciones importantes a la hora de utilizar el mecanismo de excepciones:<br /><ul><li>Región protegida (o bloque try): Este bloque de código es un ámbito de ejecución ordinario, salvo que dentro del mismo se incluye código que podría generar excepciones. Es decir, lo que se hace es “probar” el código (generalmente invocaciones a métodos).</li><li>Rutina de tratamiento: Cuando se genera una excepción en el bloque try, esta se debe tratar en algún lugar. Este lugar son las rutinas de tratamiento. Generalmente existe una rutina de tratamiento para cada tipo de excepción que pueda ser generada en el bloque try (esto permite actuar en consecuencia de la generación de diversos tipos de errores). Estas rutinas están situadas luego del bloque try y se denotan mediante la palabra clave catch. Solo se ejecutará una sola clausula catch, la que se ajuste al tipo de excepción generada.</li><li>Finalización (o bloque finally): Es un bloque de código que se ejecuta siempre, más allá de que se haya generado una excepción, o no se haya hecho. Esta sección generalmente se utiliza cuando es necesario restaurar a su estado original alguna otra cosa distinta de la propia memoria. (Es importante recalcar que la ejecución de este bloque de código se realiza SIEMPRE, más allá de que dentro del bloque try haya una instrucción return.)<br /></li></ul><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/12/codigo/Main01.java">Ver ejemplo: Main01.java</a><br /><br /><span style="font-weight: bold;">Excepciones definidas por el usuario</span><br /><br />La jerarquía de excepciones de Java no puede prever todos los errores de los que vayamos a querer informar, por eso se pueden crear excepciones definidas por el usuario que indican errores especiales para una biblioteca. Para crear excepciones definidas por el usuario, se debe heredar de una clase de excepción existente, preferiblemente de una cuyo significado esté próximo al de nuestra propia excepción (aunque a menudo esto no es posible). Lo más importante acerca de una excepción es el nombre de la clase, que hace referencia al tipo de error.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/12/codigo/Main02.java">Ver ejemplo: codigo/Main02.java</a><br /><br /><span style="font-weight: bold;">Especificación de excepciones</span><br /><br />Mientras se ejecuta un método se puede dar la situación de que se genere una excepción, ante este escenario, se pueden realizar dos cosas. El propio método puede contener una rutina de tratamiento para dicha excepción o que el mismo lance la excepción a un contexto superior. En el segundo caso, la excepción es lanzada al contexto en donde el método fue invocado. Esto significa que la invocación de un método puede generar una excepción (por lo cual la invocación debe estar dentro de un bloque try).<br />Java proporciona una sintaxis (y es obligatorio utilizarla) para permitir especificar las excepciones que puede generar un método. Se trata de la especificación de excepciones, la cual forma parte de la declaración del método y aparece luego de la lista de argumentos. Utiliza la palabra clave throws y contiene todos los tipos potenciales de excepciones que puede generar el método. El compilador provocará un error en caso de que se intente lanzar una excepción (de tipo comprobada) no declarada en la clausula throws.<br /><span style="font-weight: bold;">NOTA</span>: Las excepciones no comprobadas (excepciones que heredan de la clase <a href="http://java.sun.com/javase/6/docs/api/java/lang/RuntimeException.html">RuntimeException</a> o algún subtipo de ella) no se necesitan declarar en la clausula throws. Es obligatorio declarar todas las excepciones comprobadas potenciales que puede lanzar un método.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/12/codigo/Main03.java">Ver ejemplo: codigo/Main03.java</a><br /><br />La clase <a href="http://java.sun.com/javase/6/docs/api/java/lang/Throwable.html">Throwable</a> describe todas las cosas que pueden generarse como una excepción. Existen dos tipos generales de objetos <a href="http://java.sun.com/javase/6/docs/api/java/lang/Throwable.html">Throwable</a> (que heredan de ella). El subtipo <a href="http://java.sun.com/javase/6/docs/api/java/lang/Error.html">Error</a> representa los errores de tiempo de compilación y del sistema de los que no tenemos que preocuparnos de capturar. El subtipo <a href="http://java.sun.com/javase/6/docs/api/java/lang/Exception.html">Exception</a> es el tipo básico que puede generarse desde cualquiera de los métodos de la biblioteca estándar de Java.<br />Existe un conjunto completo de tipos de excepción que son generadas de forma automática por Java y que no es necesario incluir en las especificaciones de excepciones (como se mostro en el ejemplo de código anterior <a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/12/codigo/Main03.java">Main03.java</a>). Estas excepciones están agrupadas y son subtipos de la clase <a href="http://java.sun.com/javase/6/docs/api/java/lang/RuntimeException.html">RuntimeException</a>. Son denominadas excepciones no comprobadas. Las mismas indican errores de programación, normalmente no se suelen capturar, ya que el sistema las trata automáticamente.<br /><br />Las excepciones que se necesitan saber para el exámen son:<br />Derivadas de <a href="http://java.sun.com/javase/6/docs/api/java/lang/RuntimeException.html">RuntimeException</a>:<br /><ul><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/ArrayIndexOutOfBoundsException.html">ArrayIndexOutOfBoundsException</a>: Excepción que hereda de <a href="http://java.sun.com/javase/6/docs/api/java/lang/IndexOutOfBoundsException.html">IndexOutOfBoundsException</a>. Se lanza cuando se intenta acceder a un elemento de un arreglo con un índice inválido o con un valor negativo.<a href="http://java.sun.com/javase/6/docs/api/java/lang/IndexOutOfBoundsException.html"><br /></a></li><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/ClassCastException.html">ClassCastException</a>: Se lanza cuando se intenta castear una variable de referencia a un tipo que no cumple con la relación ES-UN.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException</a>: Se lanza cuando un método recibe un argumento formateado diferente a como el método lo espera. Por ej.: el método parseInt() genera esta excepción.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/IllegalStateException.html">IllegalStateException</a>: Se lanza cuando el estado de un ambiente no es el correcto para la operación que se esta intentando. Por ej.: utilizar un objeto Scanner que esta cerrado.<br /></li><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/NullPointerException.html">NullPointerException</a>: Se lanza cuando se intenta acceder a un objeto con una variable de referencia con valor null.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/NumberFormatException.html">NumberFormatException</a>: Excepción que hereda de <a href="http://java.sun.com/javase/6/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException</a>. Se lanza cuando un método que convierte un String a un número, recibe un String que no puede ser convertido.<br /></li></ul>Derivadas de <a href="http://java.sun.com/javase/6/docs/api/java/lang/Error.html">Error</a>:<br /><ul><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/AssertionError.html">AssertionError</a>: Se lanza cuando cuando la expresión dentro de un assert tiene el resultado false.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/ExceptionInInitializerError.html">ExceptionInInitializerError</a>: Hereda de <a href="http://java.sun.com/javase/6/docs/api/java/lang/LinkageError.html">LinkageError</a>. Se lanza para indicar que ha ocurrido una excepción al momento de inicializar una variable estática o un bloque de inicialización estático.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/StackOverflowError.html">StackOverflowError</a>: Hereda de <a href="http://java.sun.com/javase/6/docs/api/java/lang/VirtualMachineError.html">VirtualMachineError</a>. Se lanza cuando se produce un desbordamiento de la pila. Esta situación se da debido a un método que recursa profundamente.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/lang/NoClassDefFoundError.html">NoClassDefFoundError</a>: Hereda de <a href="http://java.sun.com/javase/6/docs/api/java/lang/LinkageError.html">LinkageError</a>. Se lanza la JVM no puede encontrar la definición de una clase que necesita. Sus causas pueden ser: un error al especificar la clase en la línea de comandos, un tema relacionado al classpath, o la falta del archivo .class.<br /></li></ul><br /><span style="font-weight: bold;">Restricciones de la excepciones</span><br /><br />Cuando sustituimos un método, sólo podemos generar aquellas excepciones que hayan sido especificadas en la versión del método correspondiente a la clase base. Esta restricción implica que el código que funcione con la clase base funcionará también automáticamente con cualquier objeto derivado de la clase base.<br />En cambio los constructores pueden generar todas aquellas excepciones que deseen, independientemente de lo que genere el constructor de la clase base. Sin embargo, puesto que siempre hay que invocar algún constructor de la clase base, el constructor de la clase derivada deberá declarar todas las excepciones del constructor de la clase base en su propia especificación de excepciones.<br />En resumen, la interfaz de especificación de excepciones de un método concreto puede estrecharse durante la herencia y cuando se realizan sustituciones, pero nunca ensancharse (solo puede ensancharse con excepciones derivadas a la declarada en el método de la clase base ver ejemplo). En cambio en un constructor de una clase derivada, la interfaz de especificación de excepciones puede ensancharse pero no estrecharse.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/12/codigo/Main04.java">Ver ejemplo: codigo/Main04.java</a><br /><br /></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com2tag:blogger.com,1999:blog-8326642706473191555.post-16093582497732795622009-08-11T08:03:00.000-07:002009-08-11T11:44:02.649-07:00Almacenamiento de objetos (Contenedores)<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">Resumen del capítulo 11 (Almacenamiento de objetos) del "<a style="font-style: italic;" href="http://scjp-preparacion.googlecode.com/files/TJAVA.pdf">Libro Thinking in Java (4ta Edición)</a>".<br /><br /><span style="font-weight: bold;">Introducción</span><br /><br />La biblioteca <a href="http://java.sun.com/javase/6/docs/api/java/util/package-frame.html">java.util</a> posee un conjunto bastante completo de clases contenedoras. Existen cuatro tipo básicos: <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html">List</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html">Set</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/Queue.html">Queue</a> y <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html">Map</a> (lista, conjunto, cola y mapa). Los contenedores proporcionan formas más sofisticadas (que las matrices) de almacenar objetos.<br />La biblioteca de contenedores Java toma la idea de “almacenamiento de los objetos” y la divide en dos conceptos distintos, expresados mediante las interfaces básicas de la biblioteca:<br /><ul><li><a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html">Collection</a>: una secuencia de elementos individuales a los que se aplica una o más reglas.<br />- <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html">List</a>: almacena los elementos en la forma en la que fueron insertados.<br />- <a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html">Set</a>: no puede tener elementos duplicados.<br />- <a href="http://java.sun.com/javase/6/docs/api/java/util/Queue.html">Queue</a>: produce los elementos en el orden determinado por una disciplina de cola.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html">Map</a>: un grupo de parejas de objetos clave-valor, que permite efectuar búsquedas de valores utilizando una clase. Un mapa permite buscar un objeto utilizando otro objeto. También se lo denomina matriz asociativa o diccionario.<br /></li></ul>Estas interfaces utilizan tipos genéricos, es decir, se debe especificar el tipo de objeto/s que almacenará el contenedor. Esto se realiza a través de corchetes angulares que rodean los parámetros de tipo.<br />De ser posible, se debe intentar escribir la mayor parte del código para que se comunique con estas interfaces. El único lugar donde se debería especificar el tipo concreto del contenedor es en la creación del mismo.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/11/codigo/Main01.java">Ver ejemplo: Main01.java</a><br /><br />Existen métodos de utilidad en las clases <a href="http://java.sun.com/javase/6/docs/api/java/util/Arrays.html">Arrays</a> y <a href="http://java.sun.com/javase/6/docs/api/java/util/Collections.html">Collections</a> de <a href="http://java.sun.com/javase/6/docs/api/java/util/package-frame.html">java.util</a> que añaden grupos de elementos a una colección:<br /><ul><li><a href="http://java.sun.com/javase/6/docs/api/java/util/Collections.html#addAll%28java.util.Collection,%20T...%29">Collections.addAll</a> (Collection c, T… elements): toma un objeto de tipo <a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html">Collection</a> como primer argumento y una lista de valores separados por coma. Añade los elementos a la colección.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29">Arrays.asList</a> (T… a): toma una lista de valores separados por coma y lo transforma en un objeto List.<br /></li></ul><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/11/codigo/Main02.java">Ver ejemplo: Main02.java</a><br /><br /><span style="font-weight: bold;">List</span><br /><br />Las listas garantizan que los elementos se mantengan en una secuencia concreta. La interface <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html">List</a> añade varios métodos a <a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html">Collection</a> que permiten la inserción y la eliminación de elementos en mitad de una lista.<br />Existen dos tipos de objetos <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html">List</a>:<br /><ul><li><a href="http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html">ArrayList</a>: Es el que mejor permite acceder a los elementos de forma aleatoria, pero que resulta más lento a la hora de insertar y eliminar elementos en mitad de una lista.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html">LinkedList</a>: Proporciona un acceso secuencial óptimo, siendo las inserciones y borrados en mitad de una lista enormemente rápidos. Resulta relativamente lento para los accesos aleatorios, pero tiene muchas más funcionalidades que <a href="http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html">ArrayList</a>.<br /></li></ul>Métodos de la interface:<br /><ul><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#contains%28java.lang.Object%29">contains(Object o)</a>: Permite averiguar si un objeto se encuentra dentro de la lista.</li><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#remove%28java.lang.Object%29">remove(Object o)</a>: Permite eliminar un objeto, pasando la referencia al mismo.</li><li>int <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#indexOf%28java.lang.Object%29">indexOf(Object o)</a>: Pasando como parámetro una referencia a un objeto, devuelve el número de índice en el que ese objeto está almacenado.<br /></li></ul>Estos últimos tres métodos utilizan el método equals() para realizar sus operaciones. Es decir, sobrescribiendo este método (perteneciente a la clase Object) se puede alterar el funcionamiento de estas operaciones.<br /><ul><li style="text-align: justify;">List<e> <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#subList%28int,%20int%29">subList(int fromIndex,int toIndex)</a>: Permite crear una sublista (respaldada) a partir de otra lista de mayor tamaño. Los cambios efectuados en la lista devuelta se verán reflejados en la lista original, y viceversa.</e></li><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#containsAll%28java.util.Collection%29">containsAll(Collection c)</a>: Verifica si los elementos pertenecen a la lista.</li><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#retainAll%28java.util.Collection%29">retainAll(Collection c)</a>: Es una operación de intersección de conjuntos, el comportamiento resultante depende de la implementación del método equals().</li><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#removeAll%28java.util.Collection%29">removeAll(Collection c)</a>: Elimina de la lista todos los objetos que estén en el argumento de tipo <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html">List</a>. También opera de manera distinta dependiendo del método equals().</li><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#isEmpty%28%29">isEmpty()</a>: Devuelve true si la lista se encuentra vacía.</li><li>void <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#clear%28%29">clear()</a>: Elimina todos los elementos de la lista.</li><li>E <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html#set%28int,%20E%29">set(int index, E element)</a>: Se encarga de sustituir el elemento situado en el índice indicado (el primer argumento) con el segundo argumento.<br /></li></ul><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/11/codigo/Main03.java">Ver ejemplo: Main03.java</a><br /><br /><span style="font-weight: bold;">Set</span><br /><br />Los objetos de tipo <a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html">Set</a> (conjuntos) no permiten almacenar más de una instancia de cada objeto, impide la duplicación. Para insertar un nuevo elemento se debe verificar la no pertenencia, por este motivo la operación más importante de un conjunto suele ser el de la búsqueda. <a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html">Set</a> tiene la misma interfaz que <a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html">Collection</a>, por lo que no existe ninguna funcionalidad adicional.<br />Existen tres tipos de contenedores <a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html">Set</a>:<br /><ul><li><a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html">HashSet</a>: Utiliza el mecanismo de hash para acelerar las búsquedas de elementos.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html">TreeSet</a>: Mantiene los elementos ordenados en una estructura de datos de tipo árbol rojo-negro. Este objeto es útil para mantener los objetos ordenados.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/util/LinkedHashSet.html">LinkedHashSet</a>: Es un subtipo de <a href="http://java.sun.com/javase/6/docs/api/java/util/HashSet.html">HashSet</a>, por lo tanto también emplea una función hash para acelerar las búsquedas, pero mantiene los elementos en orden de inserción utilizando una lista enlazada.<br /></li></ul><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/11/codigo/Main04.java">Ver ejemplo: Main04.java</a><br /><br /><span style="font-weight: bold;">Queue</span><br /><br />Una cola es normalmente un contenedor de tipo FIFO (first-in, first-out). El orden en el que se introduzcan los elementos coincidirá con el orden en que estos serán extraídos. Las colas son especialmente importantes en la programación concurrente.<br />Existen dos tipos de contenedores <a href="http://java.sun.com/javase/6/docs/api/java/util/Queue.html">Queue</a>:<br /><ul><li><a href="http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html">LinkedList</a>: Dispone de métodos para soportar el comportamiento de una cola e implementa la interface <a href="http://java.sun.com/javase/6/docs/api/java/util/Queue.html">Queue</a>, por lo que un objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html">LinkedList</a> puede utilizarse como implementación de <a href="http://java.sun.com/javase/6/docs/api/java/util/Queue.html">Queue</a>.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/util/PriorityQueue.html">PriorityQueue</a>: Es una implementación automática de una cola con prioridad. Este tipo de contenedor implica que el elemento que va a continuación será aquel que tenga una necesidad mayor (la prioridad más alta). El mecanismo de ordenación predeterminado utiliza el orden natural de los objetos de la cola, pero se puede modificar dicho elemento proporcionando otro objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/Comparator.html">Comparator</a>.</li></ul> Arroja una excepción Retorna un valor especial<br />Inserta boolean add(E e) boolean offer(E e)<br />Elimina E remove() E poll()<br />Obtiene E element() E peek()<br /><br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/11/codigo/Main05.java">Ver ejemplo: Main05.java</a><br /><br /><span style="font-weight: bold;">Map</span><br /><br />Los mapas permiten asociar objetos con otros objetos. Es decir, almacenan parejas de clave-valor. En los contenedores no se pueden almacenar primitivas, por eso la característica autoboxing convierte las primitivas en sus correspondientes objetos envoltorios. Este tipo de contenedores puede expandirse fácilmente para que sean multidimensionales, basta con definir un objeto <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html">Map</a> cuyos valores sean también mapas.<br />Existen tres tipos de contenedores <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html">Map</a>:<br /><ul><li><a href="http://java.sun.com/javase/6/docs/api/java/util/HashMap.html">HashMap</a>: Están diseñados para un acceso rápido.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/util/TreeMap.html">TreeMap</a>: Mantiene sus claves ordenadas y no es tan rápido como el anterior.</li><li><a href="http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html">LinkedHashMap</a>: Mantiene sus elementos en orden de inserción, pero proporciona un acceso rápido con mecanismos de hash.<br /></li></ul>Métodos de la interface:<br /><ul><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html#containsKey%28java.lang.Object%29">containsKey(Object key)</a>: Permite evaluar si existe una determinada clave en el mapa.</li><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html#containsValue%28java.lang.Object%29">containsValue(Object value)</a>: Permite evaluar si existe un determinado valor en el mapa.</li><li>V <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html#get%28java.lang.Object%29">get(Object key)</a>: Dado un objeto clave, devuelve el valor asociado a dicha clave.</li><li>V <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html#put%28K,%20V%29">put(K key, V value)</a>: Agrega un nuevo elemento al mapa.</li><li>void <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html#putAll%28java.util.Map%29">putAll(Map m)</a>: Agrega todos los elementos de un mapa a otro.</li><li>Set<k> <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html#keySet%28%29">keySet()</a>: Devuelve un conjunto <a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html">Set</a> con todas las claves. (Las claves no pueden estar repetidas).</k></li><li>Collection<v> <a href="http://java.sun.com/javase/6/docs/api/java/util/Map.html#values%28%29">values()</a>: Devuelve una colección con todos los valores del mapa.<br /></v></li></ul><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/11/codigo/Main06.java">Ver ejemplo: Main06.java</a><br /><br /><span style="font-weight: bold;">Iteradores</span><br /><br /><a href="http://java.sun.com/javase/6/docs/api/java/util/Iterator.html"><span style="font-style: italic;">Iterator</span></a><br />Es una interface que permite desplazarse a través de una secuencia y seleccionar cada uno de los objetos que la componen.<br /><ul><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/Iterator.html#hasNext%28%29">hasNext()</a>: Permite ver si hay más objetos en la secuencia.</li><li>E <a href="http://java.sun.com/javase/6/docs/api/java/util/Iterator.html#next%28%29">next()</a>: Obtiene el siguiente objeto de la secuencia.</li><li>void <a href="http://java.sun.com/javase/6/docs/api/java/util/Iterator.html#remove%28%29">remove()</a>: Elimina el último elemento devuelto por el iterador.<br /></li></ul><a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html"><span style="font-style: italic;">ListIterator</span></a><br />Es un subtipo más potente de <a href="http://java.sun.com/javase/6/docs/api/java/util/Iterator.html">Iterator</a> que solo se genera mediante las clases <a href="http://java.sun.com/javase/6/docs/api/java/util/List.html">List</a>. <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html">ListIterator</a> es bidireccional, puede generar los índices de los elementos siguiente y anterior, en relación al lugar de la lista hacia el que el iterador está apuntando y también posee otras funcionalidades. Los métodos que adiciona esta interface son:<br /><ul><li>boolean <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html#hasPrevious%28%29">hasPrevious()</a>: Realiza la misma acción que <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html#hasNext%28%29">hasNext()</a> pero en sentido contrario.</li><li>E <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html#previous%28%29">previous()</a>: Idem <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html#next%28%29">next()</a> pero en sentido contrario.</li><li>int <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html#nextIndex%28%29">nextIndex()</a>: Obtiene el número de índice del elemento siguiente.</li><li>int <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html#previousIndex%28%29">previousIndex()</a>: Obtiene el número de índice del elemento anterior.</li><li>void <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html#set%28E%29">set(E e)</a>: Permite sustituir el elemento al que apunta por el iterador.</li><li>void <a href="http://java.sun.com/javase/6/docs/api/java/util/ListIterator.html#add%28E%29">add(E e)</a>: Inserta un elemento en la lista.<br /></li></ul><span style="font-weight: bold;">NOTA</span>: NO HAY NECESIDAD DE UTILIZAR LAS CLASES ANTIGUAS <a href="http://java.sun.com/javase/6/docs/api/java/util/Vector.html">Vector</a>, <a href="http://java.sun.com/javase/6/docs/api/java/util/Hashtable.html">Hashtable</a> y <a href="http://java.sun.com/javase/6/docs/api/java/util/Stack.html">Stack</a>.<br /></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-64884646921993025872009-08-10T16:25:00.000-07:002009-08-10T16:57:29.585-07:00Clases Internas<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">Resumen del capítulo 10 (Clases Internas) del "<a style="font-style: italic;" href="http://scjp-preparacion.googlecode.com/files/TJAVA.pdf">Libro Thinking in Java (4ta Edición)</a>".<br /><br /><span style="font-weight: bold;">Introducción</span><br /><br />Las clases internas nos permiten agrupar clases relacionadas y controlar la visibilidad mutua de esas clases. Un objeto de una clase interna conoce todos los detalles de la instancia de su clase contenedora y puede comunicarse con ella. Esto se logra debido a que la instancia de la clase interna dispone de un enlace al objeto contenedor que la ha creado (de este modo se puede acceder a todos los miembros del objeto contenedor). Solo se puede instanciar una clase interna a través de una referencia al objeto de la clase contenedora.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/10/codigo/Main01.java">Ver ejemplo: Main01.java</a><br /><br />Desde una instancia de una clase interna se puede referenciar al objeto contenedor de la siguiente manera: <span style="font-style: italic;">NombreClaseContenedra.this</span><br />Como se puede ver en el ejemplo <a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/10/codigo/Main01.java">Main01.java</a>, no es posible crear un objeto de la clase interna a menos que ya se disponga de un objeto de la clase externa (o contenedora). Esto se debe a que el objeto de la clase interna se conecta de manera transparente al de la clase externa que lo haya creado. (Esto resuelve también las cuestiones relativas a los ámbitos de los nombres en la clase interna)<br />Las clases normales (no internas) no pueden ser privadas o protegidas (solo pueden tener acceso público o de paquete). Las clases internas pueden tener cualquiera de los cuatro tipos de acceso. Esto permite ocultar las implementaciones de las clases internas y evitar las dependencias de la codificación de tipos. <a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/10/codigo/Main02.java">Main02.java</a>: Por defecto los métodos de una interface son públicos, a través de la implementación (de dicha interface) de una clase interna privada (o protegida) los mismos pueden ser no visibles y no estar disponibles.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/10/codigo/Main02.java">Ver ejemplo: Main02.java</a><br /><br /><span style="font-weight: bold;">Clases internas locales</span><br /><br />Las clases internas pueden crearse dentro de un método o incluso dentro de un ámbito arbitrario. Estas clases (definidas dentro de métodos) se denominan clases internas locales. <a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/10/codigo/Main03.java">Main03.java</a>: Las clases definidas dentro de bloques if – else, se compilan con todo el resto del código. Sin embargo estas clases no están disponibles fuera del ámbito en el que se definen, por lo demás se asemejan a clases normales.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/10/codigo/Main03.java">Ver ejemplo: Main03.java</a><br /><br /><span style="font-weight: bold;">Clases internas anónimas</span><br /><br />Una clase interna anónima, es una clase que no tiene nombre. Generalmente se utilizan para implementar una interface (o extender de otra clase) y devolverse a través de un método. Es decir, se crean solo con el objetivo de darle una implementación a una interface. Este tipo de clases están en cierta forma limitadas si se comparan con el mecanismo normal de herencia, porque pueden extender una clase o implementar solo una interface, pero no pueden hacer ambas cosas al mismo tiempo.<br />Luego de definir una clase interna anónima se cierra la expresión con un punto y coma. Si se está definiendo una clase interna anónima y se quiere usar un objeto que este definido fuera de la clase interna anónima, el compilador requiere que la referencia al argumento sea FINAL. Si esto no se hace el compilador generará un mensaje de error.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/10/codigo/Main04.java">Ver ejemplo: Main04.java</a><br /><br /><span style="font-weight: bold;">Clases anidadas (Clases internas estáticas)</span><br /><br />Una clase anidada es una clase interna estática. Este tipo de clases internas son útiles cuando no es necesario disponer de una conexión entre el objeto de la clase interna y el objeto de la clase externa. No se puede acceder a un objeto no estático de la clase externa desde un objeto de una clase anidada (debido a que no existe una conexión con la clase externa).<br />A diferencia de las clases internas normales que no pueden tener miembros estáticos o clases anidadas, las clases anidadas si pueden contener estos elementos.<br /><a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/TIJ4/resumenes/10/codigo/Main05.java">Ver ejemplo: Main05.java</a><br /><br /></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com1tag:blogger.com,1999:blog-8326642706473191555.post-38537551518401995302009-08-03T07:07:00.000-07:002009-08-03T07:17:49.730-07:00Ejemplos de código - Operadores<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo unos ejemplos de código con explicaciones. Estos ejemplos surgieron a partir de la realización de los ejercicios del capítulo 4 (Operators) del libro "<i><a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a></i>".<br />Para ver el post con el resumen de dicho capítulo haz click <a href="http://scjp-sun.blogspot.com/2009/07/operadores.html">aquí</a>.<br />Cada ejemplo tiene un link para visualizar el código original desde el proyecto (SVN) google.<br /></div><br /><span style="font-weight: bold;">EJEMPLO 1</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/04/02/Feline.java?spec=svn13&r=13">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Feline</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc11">Long</span><span class="sc0"> </span><span class="sc11">x</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc4">42L</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc11">Long</span><span class="sc0"> </span><span class="sc11">y</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc4">44L</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">" "</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc4">7</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc4">2</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc6">" "</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc11">foo</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc11">x</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc4">5</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc6">" "</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc11">x</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc11">y</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc11">foo</span><span class="sc10">());</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc11">String</span><span class="sc0"> </span><span class="sc11">foo</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc5">return</span><span class="sc0"> </span><span class="sc6">"foo"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />SALIDA:<br />72 foo425 86foo<br />*/</span></div><br /><div style="text-align: justify;">Las concatenaciones se ejecutan de izquierda a derecha. Se pueden realizar concatenaciones entre diferentes tipos de operandos, es decir, se pueden concatenar tipos primitivos con objetos o viceversa (una concatenación de un objeto se traduce en el llamado al método toString(), para ver una explicación más detallada de la concatenación de objetos ver el <a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/04/02/ConcatenacionObejtos.java?spec=svn13&r=13">ejemplo ConcatenacionObejtos.java</a>).<br />En resumen, si el primer operando de una concatenación es un String se tomarán todos los siguientes como cadenas (línea 5 y 6). En caso contrario, se realizarán todas las operaciones de adición hasta que aparezca la primer cadena de caracteres, la cuál provocará que se tome todos los demás valores como cadenas (línea 7).<br /><br /><span style="font-weight: bold;">EJEMPLO 2</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/04/03/SpecialOps.java?spec=svn13&r=13">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">SpecialOps</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc11">String</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc6">""</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc11">Boolean</span><span class="sc0"> </span><span class="sc11">b1</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc5">true</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc11">Boolean</span><span class="sc0"> </span><span class="sc11">b2</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc5">false</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc5">if</span><span class="sc10">((</span><span class="sc11">b2</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc5">false</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">|</span><span class="sc0"> </span><span class="sc10">(</span><span class="sc4">21</span><span class="sc10">%</span><span class="sc4">5</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">></span><span class="sc0"> </span><span class="sc4">2</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"x"</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc5">if</span><span class="sc10">(</span><span class="sc11">b1</span><span class="sc0"> </span><span class="sc10">||</span><span class="sc0"> </span><span class="sc10">(</span><span class="sc11">b2</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc5">true</span><span class="sc10">))</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"y"</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc5">if</span><span class="sc10">(</span><span class="sc11">b2</span><span class="sc0"> </span><span class="sc10">==</span><span class="sc0"> </span><span class="sc5">true</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"z"</span><span class="sc10">;</span><span class="sc0"> <br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">11.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />SALIDA:<br />y<br />*/</span></div><br /><div style="text-align: justify;">En la línea 6 la primera expresión es una asignación (b2 = false). El resultado de cualquier expresión de asignación es el valor de la variable después de la asignación. La sustitución del operador == por = funciona solo con las variables booleanas (debido a que el bloque if solo puede comprobar expresiones booleanas).<br /><br />En el caso de una variable de tipo int, por ejemplo:<br />int x = 0;<br />if (x = 2) {}<br />El código anterior daría un error de compilación, ya que el resultado de la asignación sería el valor 2. Un valor entero no puede ser utilizado donde se necesita un valor booleano.<br /><br /></div></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-48104256426551715462009-07-31T12:53:00.000-07:002009-07-31T13:10:26.398-07:00Grupo OSUM - UTN MDP<div style="margin-left: 20px; margin-right: 20px;"><br /><div style="text-align: justify;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://osum.sun.com/group/utn_mdp"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 110px; height: 110px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh58_mhaXrEinhC5LeZmqz3RCaycAwWkDdTRQqwU5-X9SEZCzHg_Ayg6dcOnQKPC0DYovOwlV5Cm8cFSfzHj69_GC_qnW74wvxv52VIsx7G2CZRFune9pbEtZZ1Tkp7ER9NdDApQcWEYO8/s320/grupoUTNmdp.jpg" alt="" id="BLOGGER_PHOTO_ID_5364718376318646978" border="0" /></a>Hace unos días cree un grupo en la red social de sun <a href="http://osum.sun.com/">OSUM</a> (Open Source University Meetup). Este sitio es una comunidad de estudiantes, desarolladores, etc. Los miembros de la comunidad tienen acceso a cursos gratuitos, eventos, y muchos otros recursos para perfeccionar sus habilidades.<br />Existen diferentes grupos de universidades de todo el mundo. Y como mi universidad (la <a href="http://www.mdp.utn.edu.ar/">UTN Centro de estudios Mar del Plata</a>) no tenía un grupo, me decidí a <a href="http://osum.sun.com/group/utn_mdp">crear uno</a>.<br />La idea de este grupo es compartir investigaciones, inquietudes y todo tipo de información de utilidad sobre JAVA y cualquier otra tecnología open source. Los invito a participar y unirse al grupo, así creamos un lugar que permita compartir las experiencias tanto de los egresados como de los que hoy en día siguen estudiando en la UTN mdp.<br />De más esta decir que cualquier persona (ajena a la UTN) que se quiera unir esta invitado a compartir todo tipo de tecnologías y experiencias. Les dejo el link a continuación:<br /><a href="http://osum.sun.com/group/utn_mdp">http://osum.sun.com/group/utn_mdp</a><br /><br /></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-16073181574856227722009-07-31T07:26:00.000-07:002009-07-31T07:32:26.743-07:00Operadores<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del cuarto capítulo (Operators) del libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>".<br /><br /><span style="font-weight: bold;">Operadores relacionales (Objetivo 7.6):</span><br /></div><ul style="text-align: justify;"><li>Los operadores relacionales siempre retornan un valor boolean (true o false).</li><li>Existen seis operadores relacionales: <, <=, >, >=, == y !=. Los últimos dos también se pueden llamar operadores de igualdad.</li><li>Cuando se comparan caracteres, se utilizan los valores Unicode como valores numéricos.</li><li>Operadores de igualdad:<br />- Existen dos operadores de igualdad == y !=.<br />- Cuatro tipos de cosas pueden ser comparadas: números, caracteres, valores booleanos y variables de referencia.</li><li>Cuando se comparan variables de referencia, el operador == devuelve true solo si ambas referencias apuntan al mismo objeto.</li></ul><div style="text-align: justify;"><span style="font-weight: bold;">El operador instanceof (Objetivo 7.6):</span><br /></div><ul style="text-align: justify;"><li>Instanceof se utiliza solo para variables de referencia, y verifica si un objeto es de un tipo particular (es decir, si cumple con la relación ES-UN).</li><li>El operador instanceof solo puede ser utilizado para comprobar objetos (o null) contra tipos de clases que estén en la misma jerarquía de clases.</li><li>Para las interfaces, un objeto pasa la prueba instanceof si su clase o alguna de sus superclases implementa la interface.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Operadores aritméticos (Objetivo 7.6):</span><br /></div><ul style="text-align: justify;"><li>Existen cuatro operadores matemáticos primarios: adición, sustracción, multiplicación y división.</li><li>El operador de resto (%), retorna el resto de la división entera.</li><li>Las expresiones son evaluadas de izquierda a derecha, a menos que se utilicen paréntesis, o a menos que algunos operadores en la expresión tengan mayor precedencia que otros.</li><li>Los operadores *, / y % tienen mayor precedencia que + y -.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Operador de concatenación de Strings (Objetivo 7.6):</span><br /></div><ul style="text-align: justify;"><li>Si ambos operandos son Strings, el operador + los concatena.</li><li>Si ambos operandos son numéricos, el operador + suma sus valores.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Operadores de incremento y reducción (Objetivo 7.6):</span><br /></div><ul style="text-align: justify;"><li>Los operadores prefijo (++ y --) se ejecutan antes de que el valor sea utilizado en la expresión.</li><li>Los operadores sufijo (++ y --) se ejecutan después de que el valor sea utilizado en la expresión.</li><li>En cualquier expresión, ambos operandos son evaluados completamente antes de que el operador sea aplicado.</li><li>Las variables final no pueden ser incrementadas o reducidas.<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Operador condicional ternario (Objetivo 7.6):</span><br /></div><ul style="text-align: justify;"><li>Devuelve un valor basado en si una expresión booleana es true o false. (expresion) ? (valor_true) : (valor_false);<br />- El valor luego del ? se devuelve si la expresión es verdadera (o true).<br />- El valor luego del : se devuelve si la expresión es falsa (o false).<br /></li></ul><div style="text-align: justify;"><span style="font-weight: bold;">Operadores lógicos (Objetivo 7.6):</span><br /></div><ul style="text-align: justify;"><li>El examen subre seis operadores lógicos: &, |, ^, !, && y ||.</li><li>Los operadores lógicos trabajan con dos expresiones (excepto el operador !) que deben resolver a expresiones booleanas.</li><li>Los operadores && y & devuelven true solo si ambos operandos son true.</li><li>Los operadores || y | devuelven true si algunos de los dos operandos es true.</li><li>Los operadores && y || son conocidos como operadores de corto-circuitos.</li><li>El operador && no evalúa el operando derecho si el izquierdo es false.</li><li>El operador || no evalúa el operando derecho si el izquierdo es true.</li><li>Los operadores & y | siempre evalúan ambos operandos.</li><li>El operador ^ (denominado “XOR lógico”), devuelve true solo si los valores de los operandos son distintos entre sí (si son iguales devuelve false).</li><li>El operador ! (denominado operador de “inversión”), devuelve el valor opuesto del operando que precede.</li></ul></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-19181748956905960102009-07-28T15:36:00.000-07:002009-07-28T16:04:04.418-07:00Ejemplos de código - Asignaciones<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo unos ejemplos de código con explicaciones. Estos ejemplos surgieron a partir de la realización de los ejercicios del capítulo 3 (Assignments) del libro "<i><a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a></i>".<br />Para ver el post con el resumen de dicho capítulo haz click <a href="http://scjp-sun.blogspot.com/2009/07/asignaciones.html">aquí</a>.<br />Cada ejemplo tiene un link para visualizar el código original desde el proyecto (SVN) google.<br /></div><br /><span style="font-weight: bold;">EJEMPLO 1</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/03/04/Defender.java?spec=svn12&r=12">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Alien</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc11">String</span><span class="sc0"> </span><span class="sc11">invade</span><span class="sc10">(</span><span class="sc16">short</span><span class="sc0"> </span><span class="sc11">ships</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc5">return</span><span class="sc0"> </span><span class="sc6">"a few"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc11">String</span><span class="sc0"> </span><span class="sc11">invade</span><span class="sc10">(</span><span class="sc16">short</span><span class="sc10">...</span><span class="sc0"> </span><span class="sc11">ships</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc5">return</span><span class="sc0"> </span><span class="sc6">"many"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Defender</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Alien</span><span class="sc10">().</span><span class="sc11">invade</span><span class="sc10">(</span><span class="sc4">7</span><span class="sc10">));</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />Defender.java:7: cannot find symbol<br />symbol : method invade(int)<br />location: class Alien<br /> System.out.println(new Alien().invade(7));<br /> ^<br />1 error<br />*/</span></div><br /><div style="text-align: justify;">Al compilar el código anterior se produce un error en la línea 7. Esto sucede debido a que se pasa como argumento el valor 7. El literal 7 (a secas) es de tipo int. Como no existe ninguna versión del método invade() que tome un valor int, se genera el error "cannot find symbol".<br />Para que este ejemplo funcione correctamente es necesario realizar un casteo del literal 7 hacia el tipo short, como lo muestra la línea siguiente:<br />System.out.println(new Alien().invade((short) 7));<br />De este modo el programa se ejecutaría correctamente, y su salida sería:<br />a few<br /><br /><span style="font-weight: bold;">EJEMPLO 2</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/03/05/Dims.java?spec=svn12&r=12">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="numerolinea"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Dims</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc10">[][]</span><span class="sc0"> </span><span class="sc11">a</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc10">{{</span><span class="sc4">1</span><span class="sc10">,</span><span class="sc0"> </span><span class="sc4">2</span><span class="sc10">,</span><span class="sc0"> </span><span class="sc10">},</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc4">3</span><span class="sc10">,</span><span class="sc0"> </span><span class="sc4">4</span><span class="sc10">}};</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">b</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc10">(</span><span class="sc16">int</span><span class="sc10">[])</span><span class="sc0"> </span><span class="sc11">a</span><span class="sc10">[</span><span class="sc4">1</span><span class="sc10">];</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc11">Object</span><span class="sc0"> </span><span class="sc11">o1</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc11">a</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc10">[][]</span><span class="sc0"> </span><span class="sc11">a2</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc10">(</span><span class="sc16">int</span><span class="sc10">[][])</span><span class="sc0"> </span><span class="sc11">o1</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">b2</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc10">(</span><span class="sc16">int</span><span class="sc10">[])</span><span class="sc0"> </span><span class="sc11">o1</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc11">b</span><span class="sc10">[</span><span class="sc4">1</span><span class="sc10">]);</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />Exception in thread "main" java.lang.ClassCastException: [[I cannot be cast to [<br />I<br /> at Dims.main(Dims.java:7)<br />*/</span></div><br /><div style="text-align: justify;">Cuando se intenta compilar el código anterior la misma falla, debido a que (en la línea 7) se realiza una conversión erronea (ClassCastException). Esto se debe a que la variable o1 almacena una referencia a un arreglo de tipo int[][] y se intenta castear el mismo a uno de tipo int[].<br />Para visualizar la salida de este programa se podría comentar la línea 7, o reemplazarla con el código siguiente:<br />int[] b2 = (int[]) ((int[][]) o1)[0];<br />De esta manera lo que se hace es:<br /></div><ol style="text-align: justify;"><li>Castear el objeto o1 hacia un arreglo de tipo int[][].</li><li>Tomar el primer arreglo simple dentro del arreglo multidimensional (o1).</li><li>Realizar una conversión explícita del arreglo al tipo int[] (la cuál es redudante, ya que se haría implicitamente).</li><li>Finalmente se asigna a la variable de referencia b2 el valor de referencia del arreglo simple.</li></ol><br /><span style="font-weight: bold;">EJEMPLO 3</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/03/06/Bridge.java?spec=svn12&r=12">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Bridge</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">enum</span><span class="sc0"> </span><span class="sc11">Suits</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc11">CLUBS</span><span class="sc10">(</span><span class="sc4">20</span><span class="sc10">),</span><span class="sc0"> </span><span class="sc11">DIAMONDS</span><span class="sc10">(</span><span class="sc4">20</span><span class="sc10">),</span><span class="sc0"> </span><span class="sc11">HEARTS</span><span class="sc10">(</span><span class="sc4">30</span><span class="sc10">),</span><span class="sc0"> </span><span class="sc11">SPADES</span><span class="sc10">(</span><span class="sc4">30</span><span class="sc10">),</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc11">NOTRUMP</span><span class="sc10">(</span><span class="sc4">40</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">getValue</span><span class="sc10">(</span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">bid</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc5">return</span><span class="sc0"> </span><span class="sc10">((</span><span class="sc11">bid</span><span class="sc10">-</span><span class="sc4">1</span><span class="sc10">)*</span><span class="sc4">30</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc4">40</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc10">};</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc11">Suits</span><span class="sc10">(</span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">points</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc5">this</span><span class="sc10">.</span><span class="sc11">points</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc11">points</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">11.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">12.</span><span class="sc0"> </span><span class="sc16">private</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">points</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">13.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">getValue</span><span class="sc10">(</span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">bid</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">14.</span><span class="sc0"> </span><span class="sc5">return</span><span class="sc0"> </span><span class="sc11">points</span><span class="sc0"> </span><span class="sc10">*</span><span class="sc0"> </span><span class="sc11">bid</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">15.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">16.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">17.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">18.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc11">Suits</span><span class="sc10">.</span><span class="sc11">NOTRUMP</span><span class="sc10">.</span><span class="sc11">getValue</span><span class="sc10">(</span><span class="sc4">3</span><span class="sc10">));</span><span class="sc0"><br /></span><span class="numerolinea">19.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc11">Suits</span><span class="sc10">.</span><span class="sc11">SPADES</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc6">" "</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc11">Suits</span><span class="sc10">.</span><span class="sc11">SPADES</span><span class="sc10">.</span><span class="sc11">points</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">20.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc11">Suits</span><span class="sc10">.</span><span class="sc11">values</span><span class="sc10">());</span><span class="sc0"><br /></span><span class="numerolinea">21.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">22.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />SALIDA:<br />100<br />SPADES 30<br />[LBridge$Suits;@addbf1<br />*/</span></div><br /><div style="text-align: justify;">El ejemplo de código anterior tiene tres líneas de salida:<br /></div><ol style="text-align: justify;"><li>El valor NOTRUMP del enum Suits tiene sobreescrito el método getValue(int bird). Es por este motivo que cuando se invoca el método getValue() no se invoca la versión orginal.</li><li>La línea Suits.SPADES devuelve el valor de la constante como un String.</li><li>El método values() sobre el enum Suits devuelve una referencia a un arreglo, es por esto que se muestra el valor de referencia en vez de mostrar los valores del enum.</li></ol><br /><span style="font-weight: bold;">EJEMPLO 4</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/03/07/Ouch.java?spec=svn12&r=12">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Ouch</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">ouch</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc4">7</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Ouch</span><span class="sc10">().</span><span class="sc11">go</span><span class="sc10">(</span><span class="sc11">ouch</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">" "</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc11">ouch</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">go</span><span class="sc10">(</span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">ouch</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc11">ouch</span><span class="sc10">++;</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc5">for</span><span class="sc10">(</span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">ouch</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc4">3</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc11">ouch</span><span class="sc0"> </span><span class="sc10"><</span><span class="sc0"> </span><span class="sc4">6</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc11">ouch</span><span class="sc10">++)</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">11.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">" "</span><span class="sc0"> </span><span class="sc10">+</span><span class="sc0"> </span><span class="sc11">ouch</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">12.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">13.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />Ouch.java:9: ouch is already defined in go(int)<br /> for(int ouch = 3; ouch < 6; ouch++)<br /> ^<br />1 error<br />*/</span></div><br /><div style="text-align: justify;">Este error se genera debido a que se esta definiendo una variable con un nombre que ya existe para ese ámbito. Es decir, el nombre de la variable del parámetro del método go() es ouch, el error se genera al utilizar este mismo nombre dentro del bloque for (dentro del mismo método o mismo ámbito).<br /><br /><span style="font-weight: bold;">EJEMPLO 5</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/03/08/Bertha.java?spec=svn12&r=12">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Bertha</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc11">String</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc6">""</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc16">int</span><span class="sc0"> </span><span class="sc11">x</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc4">4</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc11">Boolean</span><span class="sc0"> </span><span class="sc11">y</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc5">true</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc16">short</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">sa</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc4">1</span><span class="sc10">,</span><span class="sc0"> </span><span class="sc4">2</span><span class="sc10">,</span><span class="sc0"> </span><span class="sc4">3</span><span class="sc10">};</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc11">doStuff</span><span class="sc10">(</span><span class="sc11">x</span><span class="sc10">,</span><span class="sc0"> </span><span class="sc11">y</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc11">doStuff</span><span class="sc10">(</span><span class="sc11">x</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc11">doStuff</span><span class="sc10">(</span><span class="sc11">sa</span><span class="sc10">,</span><span class="sc0"> </span><span class="sc11">sa</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">11.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">12.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">doStuff</span><span class="sc10">(</span><span class="sc11">Object</span><span class="sc0"> </span><span class="sc11">o</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"1"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">13.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">doStuff</span><span class="sc10">(</span><span class="sc11">Object</span><span class="sc10">...</span><span class="sc0"> </span><span class="sc11">o</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"2"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">14.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">doStuff</span><span class="sc10">(</span><span class="sc11">Integer</span><span class="sc10">...</span><span class="sc0"> </span><span class="sc11">i</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"3"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">15.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">doStuff</span><span class="sc10">(</span><span class="sc11">Long</span><span class="sc0"> </span><span class="sc11">l</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"4"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">16.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />SALIDA:<br />212<br />*/</span></div><br /><div style="text-align: justify;">La salida del código de ejemplo anterior se genera a partir de tres invocaciones al método doStuff() con distintos parámetros:<br /><br />'2': Resultado de la invocación de la línea 7. El método se invoca con un valor de tipo int y uno Boolean.<br /><span style="font-weight: bold;">doStuff(Object... o)</span>: Para el argumento de tipo int se hace un autoboxing hacia el tipo Integer. Como Integer y Boolean cumplen la relación ES-UN con el tipo Object, esta es la versión que se ejecuta.<br /><span style="font-weight: bold;">doStuff(Integer... i)</span>: Este método no se invoca debido a que el tipo Boolean NO ES-UN Integer.<br /><br />'1': Resultado de la invocación de la línea 8. El método se invoca con un valor de tipo int.<br /><span style="font-weight: bold;">doStuff(Object o)</span>: Para el argumento de tipo int se hace un autoboxing hacia el tipo Integer. Como Integer cumple la relación ES-UN con el tipo Object, esta es la versión que se ejecuta.<br /><span style="font-weight: bold;">doStuff(Long l)</span>: Este método no se invoca debido a que el tipo Integer no cumple la relación ES-UN con el tipo Long.<br /><br />'2': Resultado de la invocación de la línea 9. El método se invoca con dos argumentos de tipo short[].<br /><span style="font-weight: bold;">doStuff(Object... o)</span>: Ambos argumentos son arreglos (es decir, objetos), los mismos se generalizan al tipo Object.<br /><span style="font-weight: bold;">doStuff(Integer... i)</span>: Este método no se invoca debido a que el tipo short[] no cumple la relación ES-UN con el tipo Integer.<br /><br /></div></div></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-5133512343384432612009-07-27T15:18:00.000-07:002009-07-27T17:47:56.343-07:00Asignaciones<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del tercer capítulo (Assignments) del libro "<a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a>".</div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Stack y Heap:</b></div><div><ul><li style="text-align: justify;">Las variables locales (variables declaradas dentro de los métodos) se almacenan en el stack.</li><li style="text-align: justify;">Los objetos y sus variables de instancia se almacenan en el heap.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Literales y conversión (casting) de tipos primitivos (Objetivo 1.3):</b></div><div><ul><li style="text-align: justify;">Los literales enteros pueden ser decimales, octales o hexadecimales.</li><li style="text-align: justify;">Los literales octales comienzan siempre con un cero.</li><li style="text-align: justify;">Los literales hexadecimales comienzan siempre con 0x ó 0X.<br /></li><li style="text-align: justify;">Los literales para los tipos long debe terminar con la letra L o l.</li><li style="text-align: justify;">Los literales float deben terminar en F o f, los double con el dígito D, d o sin ningún sufijo (ya que son double por defecto).</li><li style="text-align: justify;">Los literales boolean son true y false.</li><li style="text-align: justify;">Los literales para el tipo char son un simple carácter dentro de comillas 'q' o el valor Unicode de una letra '\u004E' (la letra 'N').</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Ámbito (Objetivos 1.3 y 7.6):</b></div><div><ul><li style="text-align: justify;">El ámbito se refiere al tiempo de vida de una variable.</li><li><div style="text-align: justify;">Existen cuatro tipos básicos de ámbito:</div><div style="text-align: justify;">- Variables estáticas viven durante el tiempo que sus clases se encuentran cargadas en la JVM.</div><div style="text-align: justify;">- Variables de instancia viven durante el tiempo que viven sus objetos.</div><div style="text-align: justify;">- Variables locales viven durante el tiempo en que su método es ejecutado, si su método invoca otro método, estas variables son temporalmente inaccesibles.</div><div style="text-align: justify;">- Variables de bloque (for, if, while) viven hasta que el bloque de código se completa.</div></li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Asignaciones básicas (Objetivos 1.3 y 7.6):</b></div><div><ul><li style="text-align: justify;">Los literales de números enteros son implícitamente del tipo int.</li><li style="text-align: justify;">Las expresiones y operaciones con valores enteros (de cualquier tipo entero) siempre retornan un valor de tipo int.</li><li style="text-align: justify;">Los números de punto flotante son implícitamente del tipo double (64 bits).</li><li style="text-align: justify;">La reducción de un tipo primitivo implica el truncamiento de los bits de orden más altos (bits de más a la izquierda).</li><li style="text-align: justify;">Las asignaciones compuestas (+= ó -=), realizan una conversión automática.</li><li style="text-align: justify;">Una variable de referencia almacena los bits que son utilizados para apuntar a un objeto.</li><li style="text-align: justify;">Las variables de referencia pueden apuntar a subclases del tipo declarado, pero no a una superclase.</li><li><div style="text-align: justify;">Cuando se crea un objeto nuevo, (Button b = new Button();) suceden tres cosas:</div><div style="text-align: justify;">- Se crea el nombre de una variable de referencia (b) de un tipo (Button).</div><div style="text-align: justify;">- Se crea una nueva instancia de una clase (de tipo Button).</div><div style="text-align: justify;">- Se asigna el objeto instanciado (de tipo Button) a una variable de referencia (b).</div></li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Utilización de variables o elementos (de un arreglo) que no están inicializados y tampoco asignados (Objetivos 1.3 y 7.6):</b></div><div><ul><li style="text-align: justify;">Cuando un arreglo de objetos esta inicializado, los objetos que lo componen no se instancian automáticamente, pero todas las referencias poseen el valor por defecto null.</li><li style="text-align: justify;">Cuando un arreglo de tipos primitivos se inicializa, se asignan a sus elementos los correspondientes valores por defecto.</li><li style="text-align: justify;">Las variables de instancia siempre se inicializan con su valor por defecto.</li><li style="text-align: justify;">Las variables locales (también denominadas automáticas o de métodos) nunca se inicializan por defecto. Si se intentan utilizar antes de ser inicializadas, se obtendrá un error de compilación.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Pasando variables hacia métodos (Objetivo 7.3):</b></div><div><ul><li style="text-align: justify;">Los métodos pueden tomar primitivas y/o referencias a objetos como argumentos.</li><li style="text-align: justify;">Los argumentos de un método siempre son copias.</li><li style="text-align: justify;">Los argumentos de un método nunca son objetos, si no referencias a estos.</li><li style="text-align: justify;">Un argumento de tipo primitivo es una copia (desenlazada de la variable original) del valor de otra.</li><li style="text-align: justify;">Un argumento de referencia es una copia del valor de referencia de otra variable.</li><li style="text-align: justify;">El ocultamiento (o shadowing) ocurre cuando dos variables con diferente ámbito comparten el mismo nombre.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Declaración de arreglos, construcción e inicialización (Objetivo 1.3):</b></div><div><ul><li style="text-align: justify;">Los arreglos pueden contener primitivas u objetos, pero el arreglo en sí mismo es siempre un objeto.</li><li style="text-align: justify;">Cuando se declara un arreglo, los corchetes pueden ir a la izquierda o derecha del nombre.</li><li style="text-align: justify;">No se puede incluir el tamaño del arreglo, en la declaración del mismo.</li><li style="text-align: justify;">Siempre se debe incluir el tamaño de un arreglo cuando se instancia (utilizando la palabra clave new), salvo que se esté creando un arreglo anónimo.</li><li style="text-align: justify;">Los elementos de un arreglo de objetos no son instanciados automáticamente (contiene todas sus referencias en null), aunque un arreglo de tipo primitivo si proporciona los valores por defecto a sus elementos.</li><li style="text-align: justify;">La excepción NullPointerException es lanzada si se intenta utilizar un elemento del arreglo que aún no haya sido asignado.</li><li style="text-align: justify;">Los arreglos son indexados comenzando desde el valor cero.</li><li style="text-align: justify;">La excepción ArrayIndexOutOfBoundsException es lanzada si se utiliza un valor de índice incorrecto.</li><li style="text-align: justify;">Los arreglos poseen la variable length la cuál contiene el número de elementos del mismo.</li><li style="text-align: justify;">El último índice al que se puede acceder es siempre uno menos que la cantidad de elementos del arreglo.</li><li style="text-align: justify;">Los arreglos multidimensionales son arreglos de arreglos.</li><li style="text-align: justify;">Las dimensiones en un arreglo multidimensional pueden tener diferentes tamaños.</li><li style="text-align: justify;">Un arreglo de tipo primitivo puede aceptar cualquier valor que pueda ser promovido implícitamente al tipo del arreglo. (Por ejemplo un valor de tipo byte puede almacenarse en un arreglo de tipo int).</li><li style="text-align: justify;">Un arreglo de objetos puede contener cualquier objeto que cumpla la relación ES-UN (o instanceof) con el tipo del arreglo. (Por ejemplo si Horse extiende de Animal, un arreglo de tipo Animal puede almacenar un objeto Horse).</li><li style="text-align: justify;">Si se asigna un arreglo a una referencia ya declarada, el nuevo arreglo debe ser de la misma dimensión de la referencia del arreglo anterior.</li><li style="text-align: justify;">Se puede asignar un arreglo de un tipo, a una referencia ya declarada de un arreglo de un supertipo. (Por ejemplo, si Honda extiende de Car, un arreglo de objetos Honda puede ser asignado a un arreglo declarado de tipo Car).</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Bloques de inicialización (Objetivo 1.3 y 7.6):</b></div><div><ul><li style="text-align: justify;">Los bloques de inicialización estática se ejecutan solo una vez, cuando la declaración de la clase es cargada.</li><li style="text-align: justify;">Los bloques de inicialización de instancia se ejecutan cada vez que se crea un nuevo objeto. Se ejecutan luego de los constructores de las clases padres y antes del constructor de la clase actual.</li><li style="text-align: justify;">Si en una clase existen múltiples bloques de inicialización, estos se ejecutan en el orden en el que aparecen en el código fuente.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Utilizando envoltorios (Wrappers) (Objetivo 3.1):</b></div><div><ul><li style="text-align: justify;">Las clases envoltorio (wrapper) están correlacionadas con los tipos primitivos.</li><li><div style="text-align: justify;">Los wrappers tienen dos funciones principales:</div><div style="text-align: justify;">- Envolver a los tipos primitivos, para que puedan ser manejados como objetos.</div><div style="text-align: justify;">- Para proveer métodos de utilidad para los tipos primitivos (generalmente conversiones).</div></li><li><div style="text-align: justify;">Las tres familias de métodos más importantes son:</div><div style="text-align: justify;">- xxxValues(): No toma argumentos, devuelve el primitivo.</div><div style="text-align: justify;">- parseXxx(): Toma un String, retorna el primitivo, y puede lanzar la excepción NumberFormatException.</div><div style="text-align: justify;">- valueOf(): Toma un String, retorna el objeto envoltorio, y puede lanzar la excepción NumberFormatException.</div></li><li style="text-align: justify;">Los constructores de las clases envoltorio pueden tomar como argumento un tipo String o un primitivo, salvo Character, el cual solo puede tomar el tipo primitivo char.</li><li style="text-align: justify;">El parámetro opcional Radix se refiere a las bases de los números (por defecto es decimal = 10), pueden ser octal = 8, hexadecimal = 16, etc.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Boxing (Objetivo 3.1):</b></div><div><ul><li style="text-align: justify;">El mecanismo boxing permite convertir tipos primitivos a envoltorios y envoltorios a primitivos automáticamente.</li><li style="text-align: justify;">Para los tipos de envoltorio Boolean, Byte, Character, Short e Integer el operador == sirve para comparar sus valores. Esto se debe a que se realizan las conversiones automaticamente a los tipos primitivos para realizar las comparaciones.<br /></li><li style="text-align: justify;">Para los demás tipos de envoltorios (Long, Float y Double) el operador == se utiliza para comparar las referencias a objetos. Para comparar sus valores, se debe utilizar el método equals().</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Sobrecarga avanzada (Objetivos 1.5 y 5.4):</b></div><div><ul><li style="text-align: justify;">"Widening conversion" es el mecanismo de almacenar un dato pequeño en un contenedor más grande.<br /></li><li style="text-align: justify;">Para métodos sobrecargados utilizar el mecanismo widening sobre primitivos se traduce en invocar el método con argumento “más chico”.</li><li style="text-align: justify;">Utilizados individualmente, tanto el mecanismo boxing como el var-arg son compatibles con la sobrecarga.</li><li style="text-align: justify;">No se puede utilizar el mecanismo widening de un tipo wrapper a otro (estos son objetos y no se cumple con la relación ES-UN).</li><li style="text-align: justify;">No se puede utilizar el mecanismo widening y luego el boxing. (Un valor de tipo int no se puede convertir en un Long).</li><li style="text-align: justify;">Se puede utilizar el mecanismo boxing y luego el widening. (Un valor de tipo int se puede convertir en un Object, a través del tipo Integer).</li><li style="text-align: justify;">Se puede combinar el mecanismo var-arg tanto con widening como con boxing.</li><li style="text-align: justify;">Cuando se invocan métodos sobrecargados ciertos mecanismos se sobreponen ante otros:<br />- Widening (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/03/03/MecanismosEnMetodosSobrecargados01.java">Ver ejemplo</a>)<br />- Boxing (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/03/03/MecanismosEnMetodosSobrecargados02.java">Ver ejemplo</a>)<br />- Var-arg (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/03/03/MecanismosEnMetodosSobrecargados03.java">Ver ejemplo</a>)<br /></li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Garbage Collection (Objetivo 7.4):</b></div><div><ul><li style="text-align: justify;">Provee una administración automática de la memoria.</li><li style="text-align: justify;">El propósito del GC es eliminar los objetos que no pueden ser alcanzados (que ninguna variable de referencia los apunta).</li><li style="text-align: justify;">La JVM es la que decide cuando se ejecutará el GC, el programador solo puede sugerirlo.</li><li style="text-align: justify;">No se puede conocer el algoritmo del GC.</li><li style="text-align: justify;">Los objetos deben ser considerados ilegibles antes de que el GC pueda eliminarlos.</li><li style="text-align: justify;">Un objeto es ilegible cuando ningún hilo vivo puede alcanzarlo.</li><li style="text-align: justify;">Para alcanzar un objeto, debe existir un hilo vivo que contenga una referencia al objeto.</li><li style="text-align: justify;">Si existen objetos ilegibles pero con referencias cruzadas entre ellos, estos pueden ser eliminados por el GC. (Island of objects).</li><li style="text-align: justify;">La clase Object tiene un método finalize().</li><li style="text-align: justify;">El método finalize() se ejecuta solo una vez, y esto se da antes de que el GC elimine el objeto.</li><li style="text-align: justify;">El mecanismo GC no garantiza que el método finalize() se ejecutará.</li></ul></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-79306749941973857212009-07-27T07:18:00.000-07:002009-07-27T07:58:00.702-07:00Ejemplos de código - Orientación a Objetos<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo unos ejemplos de código con explicaciones. Estos ejemplos surgieron a partir de la realización de los ejercicios del capítulo 2 (Object Orientation) del libro "<i><a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a></i>".<br />Para ver el post con el resumen de dicho capítulo haz click <a href="http://scjp-sun.blogspot.com/2009/07/orientacion-objetos.html">aquí</a>.<br />Cada ejemplo tiene un link para visualizar el código original desde el proyecto (SVN) google.<br /><br /><span style="font-weight: bold;">EJEMPLO 1</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/02/01/DogShow.java">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Dog</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">bark</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">"woof "</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Hound</span><span class="sc0"> </span><span class="sc5">extends</span><span class="sc0"> </span><span class="sc11">Dog</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">sniff</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">"sniff "</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">11.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">bark</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">12.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">"how1 "</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">13.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">14.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">15.</span><span class="sc0"><br /></span><span class="numerolinea">16.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">DogShow</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">17.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">18.</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">DogShow</span><span class="sc10">().</span><span class="sc11">go</span><span class="sc10">();</span><span class="sc0"><br /></span><span class="numerolinea">19.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">20.</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">go</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">21.</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Hound</span><span class="sc10">().</span><span class="sc11">bark</span><span class="sc10">();</span><span class="sc0"><br /></span><span class="numerolinea">22.</span><span class="sc0"> </span><span class="sc10">((</span><span class="sc11">Dog</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Hound</span><span class="sc10">()).</span><span class="sc11">bark</span><span class="sc10">();</span><span class="sc0"><br /></span><span class="numerolinea">23.</span><span class="sc0"> </span><span class="sc10">((</span><span class="sc11">Dog</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Hound</span><span class="sc10">()).</span><span class="sc11">sniff</span><span class="sc10">();</span><span class="sc0"><br /></span><span class="numerolinea">24.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">25.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />DogShow.java:24: cannot find symbol<br />symbol : method sniff()<br />location: class Dog<br /> ((Dog) new Hound()).sniff();<br /> ^<br />1 error<br />*/</span><span class="sc0"><br /></span></div><br />El casteo explícito (línea 23) provoca que el compilador tome la expresión ((Dog) new Hound()) como de tipo Dog. Como la clase Dog no contiene un método sniff(), se genera el error de compilación "cannot find symbol".<br />Si no se haría la generalización al tipo Dog, o se agregará una especialización al tipo Hound como la siguiente: ((Hound) ((Dog) new Hound())).sniff(); el programa compilaría y se ejecutaría correctamente.<br />Por otro lado, al comentar la línea 23 de este ejemplo, la salida sería la siguiente: how1 how1. Esto demuestra que más allá de que se realice la generalización de la línea 22, se invoca la versión del método bark() de la clase Hound. Esto se debe a que la selección de las versiones de los distintos métodos sobreescritos, se hace en tiempo de ejecución, y depende del tipo de objeto instanciado.<br />En conclusión llegamos a que el código original de este ejemplo, en tiempo de ejecución funcionaría correctamente (porque se invocaría al método sniff() de un objeto Hound). Pero como el compilador no encuentra la declaración del método sniff() en la clase padre,<br />genera un error de compilación. (Para comprobar lo dicho anteriormente se podría declarar un método sniff() con cualquier cuerpo en la clase Dog, el cuál en tiempo de ejcución nunca sería invocado por este ejemplo.)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Dog</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">bark</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">"woof "</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">sniff</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">"sniff Dog"</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc10">}</span></div><br /><br /><br /><span style="font-weight: bold;">EJEMPLO 2</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/02/02/Redwood.java">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Redwood</span><span class="sc0"> </span><span class="sc5">extends</span><span class="sc0"> </span><span class="sc11">Tree</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Redwood</span><span class="sc10">().</span><span class="sc11">go</span><span class="sc10">();</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">go</span><span class="sc10">()</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc11">go2</span><span class="sc10">(</span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Tree</span><span class="sc10">(),</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Redwood</span><span class="sc10">());</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc11">go2</span><span class="sc10">((</span><span class="sc11">Redwood</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Tree</span><span class="sc10">(),</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">Redwood</span><span class="sc10">());</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">go2</span><span class="sc10">(</span><span class="sc11">Tree</span><span class="sc0"> </span><span class="sc11">t1</span><span class="sc10">,</span><span class="sc0"> </span><span class="sc11">Redwood</span><span class="sc0"> </span><span class="sc11">r1</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc11">Redwood</span><span class="sc0"> </span><span class="sc11">r2</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc10">(</span><span class="sc11">Redwood</span><span class="sc10">)</span><span class="sc11">t1</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">11.</span><span class="sc0"> </span><span class="sc11">Tree</span><span class="sc0"> </span><span class="sc11">t2</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc10">(</span><span class="sc11">Tree</span><span class="sc10">)</span><span class="sc11">r1</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">12.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">13.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">14.</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">Tree</span><span class="sc0"> </span><span class="sc10">{}</span><span class="sc0"><br /></span><span class="sc1">/*<br />SALIDA:<br />Exception in thread "main" java.lang.ClassCastException: Tree cannot be cast to<br />Redwood<br /> at Redwood.go2(Redwood.java:10)<br /> at Redwood.go(Redwood.java:6)<br /> at Redwood.main(Redwood.java:3)<br />*/</span></div><br />Si comentáramos la línea 10 (la cuál provoca la excepción ClassCastException en tiempo de ejecución) y luego ejecutaríamos el programa, obtendríamos la siguiente SALIDA:<br /><span style="font-style: italic;">Exception in thread "main" java.lang.ClassCastException: Tree cannot be cast to</span><br /><span style="font-style: italic;">Redwood</span><br /><span style="font-style: italic;"> at Redwood.go(Redwood.java:7)</span><br /><span style="font-style: italic;"> at Redwood.main(Redwood.java:3)</span><br /><br />Esto demuestra que el casteo (o especialización) de un objeto Tree hacia Redwood generá una excepción en tiempo de ejecución.<br />Entonces, se puede concluir que NO se puede realizar una especialización de un tipo base a un subtipo. Es decir, si tenemos una variable de referencia a un subtipo e intentamos asignarle un supertipo obtendremos un error (en este caso de compilación "incompatible types").<br />Lo mismo sucedería (como lo demuestra este ejemplo) al castear un supertipo hacia un subtipo (pero en este caso es un error un tiempo de ejecución).<br /><br /><span style="font-weight: bold;">EJEMPLO 3</span> (<a href="http://code.google.com/p/scjp-preparacion/source/browse/trunk/libros/SCJP-JAVA-6/pruebas/02/03/ComingThru.java">Ver código original</a>)<br /><br /><div class="source-code"><span class="numerolinea">01.</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">A</span><span class="sc0"> </span><span class="sc10">{}</span><span class="sc0"><br /></span><span class="numerolinea">02.</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">B</span><span class="sc0"> </span><span class="sc5">extends</span><span class="sc0"> </span><span class="sc11">A</span><span class="sc0"> </span><span class="sc10">{}</span><span class="sc0"><br /></span><span class="numerolinea">03.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">class</span><span class="sc0"> </span><span class="sc11">ComingThru</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">04.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc11">String</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc6">"-"</span><span class="sc10">;</span><span class="sc0"><br /></span><span class="numerolinea">05.</span><span class="sc0"> </span><span class="sc16">public</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">main</span><span class="sc10">(</span><span class="sc11">String</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">args</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"><br /></span><span class="numerolinea">06.</span><span class="sc0"> </span><span class="sc11">A</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">aa</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">A</span><span class="sc10">[</span><span class="sc4">2</span><span class="sc10">];</span><span class="sc0"><br /></span><span class="numerolinea">07.</span><span class="sc0"> </span><span class="sc11">B</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">ba</span><span class="sc0"> </span><span class="sc10">=</span><span class="sc0"> </span><span class="sc5">new</span><span class="sc0"> </span><span class="sc11">B</span><span class="sc10">[</span><span class="sc4">2</span><span class="sc10">];</span><span class="sc0"><br /></span><span class="numerolinea">08.</span><span class="sc0"> </span><span class="sc11">sifter</span><span class="sc10">(</span><span class="sc11">aa</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">09.</span><span class="sc0"> </span><span class="sc11">sifter</span><span class="sc10">(</span><span class="sc11">ba</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">10.</span><span class="sc0"> </span><span class="sc11">sifter</span><span class="sc10">(</span><span class="sc4">7</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">11.</span><span class="sc0"> </span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">);</span><span class="sc0"><br /></span><span class="numerolinea">12.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">13.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">sifter</span><span class="sc10">(</span><span class="sc11">A</span><span class="sc10">[]...</span><span class="sc0"> </span><span class="sc11">a2</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"1"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">14.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">sifter</span><span class="sc10">(</span><span class="sc11">B</span><span class="sc10">[]...</span><span class="sc0"> </span><span class="sc11">b1</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"2"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">15.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">sifter</span><span class="sc10">(</span><span class="sc11">B</span><span class="sc10">[]</span><span class="sc0"> </span><span class="sc11">b1</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"3"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">16.</span><span class="sc0"> </span><span class="sc16">static</span><span class="sc0"> </span><span class="sc16">void</span><span class="sc0"> </span><span class="sc11">sifter</span><span class="sc10">(</span><span class="sc11">Object</span><span class="sc0"> </span><span class="sc11">o</span><span class="sc10">)</span><span class="sc0"> </span><span class="sc10">{</span><span class="sc0"> </span><span class="sc11">s</span><span class="sc0"> </span><span class="sc10">+=</span><span class="sc0"> </span><span class="sc6">"4"</span><span class="sc10">;</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="numerolinea">17.</span><span class="sc0"> </span><span class="sc10">}</span><span class="sc0"><br /></span><span class="sc1">/*<br />SALIDA:<br />-434<br />*/</span></div><br />En general, los métodos sobrecargados con argumentos var-arg son elegidos últimos (para ser ejecutados). Cabe destacar que los arrays son objetos, por este motivo la invocación de la línea 8 ejecuta la versión del método con el parámetro Object.<br />Entonces se podría decir que ciertos métodos tienen mayores posibilidades de ser ejecutados:<br /></div><ol style="text-align: justify;"><li>Parámetros con el tipo idéntico (como el caso de la invocación de la línea 9).</li><li>Parámetros con el supertipo u Object (como el caso de las invocaciones de las líneas 8 y 10).</li><li>Por último si los argumentos no concuerdan con ningún otro método, se ejecutan los métodos con parámetros var-arg.<br /></li></ol></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com0tag:blogger.com,1999:blog-8326642706473191555.post-40462745499388620322009-07-23T13:06:00.000-07:002009-07-27T15:32:12.924-07:00Orientación a Objetos<div style="margin-left: 20px; margin-right: 20px;"><div style="text-align: justify;">A continuación dejo el resumen del segundo capítulo (Object Orientation) del libro "<i><a href="http://scjp-preparacion.googlecode.com/files/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206.pdf">Sun Certified Programmer for Java 6 Study Guide</a></i>".</div><div style="text-align: justify;"><b><br /></b></div><div style="text-align: justify;"><b>Encapsulación, ES-UN, TIENE-UN (Objetivo 5.1):</b></div><div style="text-align: justify;"><ul><li>La encapsulación ayuda a ocultar la implementación detrás de una interfaz (API).</li><li>El código encapsulado tiene dos características:<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Las variables de instancia son protegidas (generalmente con el modificador de acceso private).<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Los métodos getter y setter proveen acceso a las variables de instancia.</li><li>ES-UN se relaciona con la herencia o implementación.</li><li>ES-UN se expresa mediante la palabra clave extends.</li><li>ES-UN, “hereda de”, y “es un subtipo de” son expresiones equivalentes.</li><li>TIENE-UN significa que una clase “tiene una” instancia de otra clase o una de su mismo tipo.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Herencia (Objetivo 5.5):</b></div><div style="text-align: justify;"><ul><li>La herencia permite a una clase ser una subclase de una superclase, y por eso se heredan las variables y métodos (public y protected) de la superclase.</li><li>La herencia es el concepto clave en el que se basan los conceptos ES-UN, polimorfismo, sobreescritura, sobrecarga, y conversión de tipos (casting).</li><li>Todas las clases son subclases del tipo Object, y también heredan sus métodos.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Polimorfismo (Objetivo 5.2):</b></div><div style="text-align: justify;"><ul><li>Polimorfismo significa “muchas formas”.</li><li>Una variable de referencia es siempre (e inalterable) de un solo tipo, pero puede referirse a un subtipo de objeto.</li><li>Un objeto puede ser referenciado por una variable de diferentes tipos (su mismo tipo, su subtipo, o de los tipos de interfaces que implemente).</li><li>El tipo de la variable de referencia (no el tipo del objeto), determina cuales pueden ser los métodos invocados.</li><li>Las invocaciones a métodos polimórficos se realizan solo a los métodos de instancia sobreescritos.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Sobreescritura y sobrecarga (Objetivo 1.5 y 5.4):</b></div><div style="text-align: justify;"><ul><li>Los métodos pueden ser sobreescritos o sobrecargados; los constructores pueden ser sobrecargados pero no sobreescritos.</li><li>Los métodos abstractos deben ser sobreescritos por la primera subclase concreta (no abstracta).</li><li>Con respecto al método que sobreescribe, el método sobreescrito:<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Debe poseer la misma lista de argumentos.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Debe poseer el mismo tipo de retorno, excepto a partir de Java 5, en donde el tipo de retorno puede ser una subclase (a esto se lo denomina como retorno covariante).<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>No debe poseer un modificador de acceso más restrictivo.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Puede poseer un modificador de acceso menos restrictivo.<br />- No debe lanzar nuevas o mayores (en relación al árbol de herencia) excepciones comprobadas.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Puede lanzar menos o menores (en relación al árbol de herencia) excepciones comprobadas, o cualquier excepción no comprobada.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Los métodos finales no pueden ser sobreescritos.</li><li>Solo los métodos heredados pueden ser sobreescritos, y se debe recordar que los métodos privados no son heredados.</li><li>Las subclases deben usar el operador super.nombreDeMetodo(), para invocar las versiones de la superclase del método sobreescrito.</li><li>Sobrecarga significa reutilizar el nombre de un método, pero con diferentes argumentos.</li><li>Los métodos sobrecargados:<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Deben poseer listas de argumentos diferentes.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Pueden poseer diferentes tipos de retorno, si las listas de argumentos son diferentes.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Pueden poseer diferentes modificadores de acceso.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Pueden lanzar diferentes excepciones.</li><li>Los métodos de una superclase pueden ser sobrecargados en una subclase.</li><li>El polimorfismo se encuentra en la sobreescritura, no en la sobrecarga.</li><li>El tipo de un objeto (no el tipo de la variable de referencia), determina que método sobreescrito es utilizado en tiempo de ejecución.</li><li>El tipo de la referencia determina que método sobrecargado se utilizará en tiempo de complicación.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Conversión de variables de referencia (Objetivo 5.2):</b></div><div style="text-align: justify;"><ul><li>Existen dos tipos de conversión de variables de referencia: especificación (downcasting) y generalización (upcasting).</li><li>Downcasting: Con una referencia a un supertipo de objeto, se puede realizar una conversión explícita a un subtipo, para acceder a los miembros de ese subtipo.</li><li>Upcasting: Con una referencia a un subtipo de objeto, se puede acceder explícita o implícitamente a los miembros de la clase base.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Implementando una interface (Objetivo 1.2):</b></div><div style="text-align: justify;"><ul><li>Cuando se implementa una interface, se está cumpliendo con su contrato.</li><li>Cuando se implementa una interface, lo que se hace es sobreescribir todos los métodos definidos en la misma.</li><li>Una clase puede implementar muchas interfaces.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Tipos de retorno (Objetivo 1.5):</b></div><div style="text-align: justify;"><ul><li>Los métodos sobrecargados pueden cambiar su tipo de retorno; los métodos sobreescritos no, excepto en el caso de que sean tipos de retornos covariantes.</li><li>Los tipos de retorno de referencias a objetos pueden devolver el valor null.</li><li>Un arreglo es un tipo de retorno válida, siempre y cuando se declare y se retorne.</li><li>Los métodos con tipos primitivos de retorno, pueden realizar conversiones implícitas para devolver sus valores.</li><li>Los métodos con retorno void, no pueden devolver nada. Es decir, se puede utilizar la palabra clave return para finalizar la ejecución del método, pero no se puede devolver ningún tipo de valor, salvo void.</li><li>Los métodos con referencias a objetos como tipo de retorno, pueden devolver subtipos.</li><li>Los métodos con una interface como tipo de retorno, pueden devolver cualquier instancia de una clase que la implemente.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Constructores e instanciación (Objetivo 1.6 y 5.4):</b></div><div style="text-align: justify;"><ul><li>Un constructor es invocado siempre que un objeto es creado.</li><li>Para instanciar un objeto, cada superclase en el árbol de herencia posee un constructor que es invocado.</li><li>Cada clase, incluso las clases abstractas, poseen al menos un constructor.</li><li>Los constructores deben poseer el mismo nombre que la clase.</li><li>Los constructores no poseen un tipo de retorno. Si posee un tipo de retorno no es un constructor, sino un simple método con el mismo nombre que la clase.</li><li>La ejecución típica de los constructores se realiza de la siguiente manera:<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>El constructor invoca al constructor de su superclase, el cuál invoca al constructor de su superclase, y sigue así a través de todo el árbol de herencia hasta alcanzar el constructor de la clase Object.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Se ejecuta el constructor de la clase Object y luego se continúa con la ejecucióncorrespondiente al constructor de la primera subclase (de Object). Se sigue el mismo proceso “hacia abajo” hasta finalizar la ejecución del constructor que desencadeno las distintas creaciones.</li><li>Los constructores pueden utilizar cualquier modificador de acceso.</li><li>El compilador crea un constructor por default, si no se crea ningún constructor explícito en la clase.</li><li>El constructor por default no posee argumentos, y posee una llamada al constructor sin argumentos de su clase padre super().</li><li>La primera línea de todos los constructores debe ser this() (si es un constructor sobrecargado) o super().</li><li>El compilador agregará una llamada a super() (implícita) a menos que se especifique una llamada a this() o super().</li><li>Los miembros de instancia son accesibles solo después de la ejecución del constructor del supertipo.</li><li>Las clases abstractas poseen constructores, los cuales son invocados cuando una subclase concreta se instancia.</li><li>Las interfaces no poseen constructores.</li><li>Si una superclase no posee un constructor sin argumentos, es aconsejable crear un constructor sin argumentos el cuál invoque a alguno de los constructores existentes pasando parámetros por defecto.</li><li>Los constructores nunca son heredados, y por lo tanto no pueden ser sobreescritos.</li><li>Un constructor solo puede ser invocado directamente por otro constructor, a través de las palabras clave this() o super().</li><li>Características de la llamada this():<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>Puede estar solo en la primera línea de un constructor.<span class="Apple-style-span" style="white-space: pre;"><br /></span><span class="Apple-style-span" style="white-space: pre;">- </span>La lista de argumentos determina que constructor sobrecargado es invocado.</li><li>Los constructores pueden invocar otros constructores, y así sucesivamente. Pero tarde o temprano se deberá invocar a super(), ya que si no se arrojará una excepción relacionada a la pila.</li><li>Las invocaciones a this() y super() no pueden estar en un mismo constructor. Se puede tener uno u otro, pero nunca ambos.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Estáticos (Objetivo 1.3):</b></div><div style="text-align: justify;"><ul><li>Los métodos estáticos son utilizados para implementar comportamientos que no están afectados por el estado de ninguna instancia.</li><li>Las variables estáticas se utilizan para almacenar información que es específica de la clase. Existe solo una copia de las variables estáticas.</li><li>Todos los miembros estáticos pertenecen a la clase, no a una instancia.</li><li>Un método estático no puede acceder a una variable de instancia directamente.</li><li>Para acceder a los miembros estáticos se utiliza el operador punto (.). Se debe recordar que la utilización de una instancia para acceder a un miembro estático es solo un truco, ya que el compilador sustituye la variable de referencia por el nombre de la clase.</li><li>Los métodos estáticos no pueden ser sobreescritos, pero si pueden ser redefinidos.</li></ul></div><div style="text-align: justify;"><br /></div><div style="text-align: justify;"><b>Acoplamiento y cohesión (Objetivo 5.1):</b></div><div style="text-align: justify;"><ul><li>El acoplamiento se refiere al grado en que una clase conoce o usa los miembros de otra clase.</li><li>Bajo acoplamiento es el estado deseado para tener clases que estén bien encapsuladas, minimizadas las referencias entre ellas, y se limitan al uso de las API’s.</li><li>Alto acoplamiento es el estado indeseado de tener clases que no respetan las reglas de bajo acoplamiento.</li><li>La cohesión se refiere al grado en que una clase, cumple un rol bien definido o tiene una responsabilidad específica.</li><li>Alta cohesión es el estado deseado de una clase que posee un rol bien definido.</li><li>Baja cohesión es el estado indeseado de una clase que posee muchos roles y demasiadas responsabilidades.</li></ul></div></div>Matías Emiliano Alvarez Duránhttp://www.blogger.com/profile/14142095839415896610noreply@blogger.com2