{"id":1538,"date":"2014-03-05T15:33:27","date_gmt":"2014-03-05T20:33:27","guid":{"rendered":"http:\/\/alejandroayala.solmedia.ec\/?p=1538"},"modified":"2014-03-05T18:44:20","modified_gmt":"2014-03-05T23:44:20","slug":"errores-comunes-en-java","status":"publish","type":"post","link":"https:\/\/alejandroayala.solmedia.ec\/?p=1538","title":{"rendered":"Errores comunes en Java"},"content":{"rendered":"<p>Java es un lenguaje minimalista, deliberadamente con menos caracter\u00edsticas que otros lenguajes, nunca estas limitaciones tienen casos extremos con efectos extra\u00f1os, algunos casos con efectos sorprendentes hace tropezar a los incautos. Si has le\u00eddo otros lenguajes, puedes f\u00e1cilmente leer Java de la manera incorrecta llev\u00e1ndote a la confusi\u00f3n.<\/p>\n<p><!--more--><\/p>\n<h2>Las variables solo son referencias o primitivas<\/h2>\n<p>Es correcto, <strong>las variables no son objetos<\/strong>. Esto significa que cuando ves lo siguiente:<\/p>\n<p>[java]<br \/>\nString s = &quot;Hello&quot;;<br \/>\n[\/java]<\/p>\n<p><strong>s<\/strong> no es un objeto, no es un String, <strong>es una referencia a un String<\/strong>.<\/p>\n<p>Esto responde a muchas \u00e1reas de confusi\u00f3n como:<\/p>\n<ul>\n<li><strong>Pregunta:<\/strong> Si un String es inmutable como puedo modificarlo. Ejm: <strong><em>s += \u00ab!\u00bb<\/em><\/strong><\/li>\n<li><strong>Respuesta:<\/strong> Lo que cambia es la referencia al String.<\/li>\n<\/ul>\n<h2>== compara sus referencias, no su contenido<\/h2>\n<p>Para hacer mas grande la confusi\u00f3n, a<strong>l usar == a veces funciona<\/strong>. Si se tiene dos valores inmutables que tienen el mismo contenido, la JVM puede intentar hacer la misma referencia. Ejm:<\/p>\n<p>[java]<br \/>\nString s1 = &quot;Hi&quot;, s2 = &quot;Hi&quot;;<br \/>\nInteger a = 12, b = 12;<br \/>\n[\/java]<\/p>\n<p>En ambos casos, un pool de objetos es usado como referencia que al final termina apuntando al mismo lugar. <em>s1 == s2 y a == b<\/em> <strong>ambos objetos devuelven <em>true<\/em> porque la <em>JVM<\/em> ha hecho referencia al mismo objeto<\/strong>. Ahora, al variar un poco el c\u00f3digo el pool de objetos no es el mismo y<strong> ==<\/strong> devolver\u00e1 <em><strong>false<\/strong> <\/em>quiz\u00e1s de forma inesperada. <strong>En este caso se necesita usar equals()<\/strong>.<\/p>\n<p>[java]<br \/>\nString s3 = new String(s1);<br \/>\nInteger c = -222, d = -222;<br \/>\n[\/java]<br \/>\n[java]<br \/>\ns1 == s2\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ is true<br \/>\ns1 == s3\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ is false<br \/>\ns1.equals(s3) \/\/ is true<br \/>\na == b\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ is true<br \/>\nc == d\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ is false (diferentes objetos fueron creados)<br \/>\nc.equals(d)\u00a0\u00a0 \/\/ is true<br \/>\n[\/java]<\/p>\n<p>Para los Integer, el pool de objetos empieza en <strong>-128 hasta al menos 127<\/strong>(posiblemente mas)<\/p>\n<h2>Java pasa referencias por valor<\/h2>\n<p>Todas las variables son pasadas por valor, <strong>incluso las referencias<\/strong>. Esto significa que cuando se tiene una variable el cual es una referencia a un objeto, esta referencia es copiada, pero no el objeto. Ejm:<\/p>\n<p>[java]<br \/>\npublic static void addAWord(StringBuilder sb) {<br \/>\n   sb.append(&quot; word&quot;);<br \/>\n   sb = null;<br \/>\n}<br \/>\n[\/java]<br \/>\n[java]<br \/>\nStringBuilder sb = new StringBuilder(&quot;first &quot;);<br \/>\naddWord(sb);<br \/>\naddWord(sb);<br \/>\nSystem.out.println(sb); \/\/ imprime &quot;first word word&quot;<br \/>\n[\/java]<\/p>\n<p>El objeto de referencia puede ser cambiado, <strong>pero los cambios a la referencia no tienen efecto en el objeto que lo llama.<\/strong><\/p>\n<h2>En la mayor\u00eda de las <em>JVM&#8217;s<\/em>, el <em>Object.hashCode()<\/em> no tiene nada que ver con la posici\u00f3n en memoria.<\/h2>\n<p>Un <em>hashCode()<\/em> <strong>tiene que permanecer constante<\/strong>. Sin esto de facto, los <em>hash<\/em> de las colecciones como <em>HashSet<\/em> o <em>ConcurrentHashMap<\/em> no funcionar\u00edan. Sin embargo el objeto puede estar en cualquier lugar de la memoria y puede cambiar de lugar sin que el programa sepa que esto ha sucedido. Usar la posici\u00f3n para el <em>hashcode()<\/em> no funcionar\u00eda (a menos que se tenga una JVM donde los objetos no se muevan).<\/p>\n<p>Para el <em>OpenJDK<\/em> y el <em>HotSpot JVM<\/em> el <em>hascode()<\/em> es g<strong>enerado bajo demanda y almacenado en la cabecera del objeto<\/strong>.<\/p>\n<h2>El Object.toString() hace algo sorprendentemente mas que \u00fatil.<\/h2>\n<p>El comportamiento por <em>default<\/em> de <em>toString()<\/em> es imprimir el nombre interno de la clase y un <em>hashCode()<\/em>.<br \/>\nComo se ha mencionado, el <em>hashCode()<\/em> <strong>no es la ubicaci\u00f3n en memoria a pesar que se ha impreso un hexadecimal<\/strong>. Tambi\u00e9n para el nombre de la clase, especialmente con arrays es confuso. Por ejemplo un <em>String[]<\/em> se imprimir\u00e1 como <em><strong>[Ljava.lang.String;<\/strong><\/em> El <strong>[<\/strong> siginifica que es un array, la <strong>L<\/strong> significa que es un clase creada por un \u00ablenguaje\u00bb, no una primitiva como un byte el cual por cierto tiene un c\u00f3digo de <strong>B<\/strong>; y el <strong>;<\/strong> significa el final de la clase. Ejm:<\/p>\n<p>[java]<br \/>\nString[] words = { \u201cHello\u201d, \u201cWorld\u201d };<br \/>\nSystem.out.println(words);<br \/>\n[\/java]<\/p>\n<p>La salida es algo como esto:<\/p>\n<p>[java]<br \/>\n[Ljava.lang.String;@45ee12a7<br \/>\n[\/java]<\/p>\n<p>Desafortunadamente se tiene que saber que la <strong>clase es un array de objetos<\/strong>, ejm. si se tiene un objeto <strong><em>words<\/em><\/strong>, se tiene un problema y se tiene que saber llamar a <em>Arrays.toString(<strong>words<\/strong>)<\/em> en su lugar. Esta encapsulaci\u00f3n rota es una mala idea y una fuente com\u00fan de confusi\u00f3n en <em>StackOverflow.<\/em><\/p>\n<p>Traducido de: <a href=\"http:\/\/www.javacodegeeks.com\/2014\/03\/common-gotchas-in-java.html\" target=\"_blank\">http:\/\/www.javacodegeeks.com\/2014\/03\/common-gotchas-in-java.html<\/a><\/p>\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=a1ejo_ayala\" class=\"twitter-share-button\" data-size=\"large\">Twittear<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Java es un lenguaje minimalista, deliberadamente con menos caracter\u00edsticas que otros lenguajes, nunca estas limitaciones tienen casos extremos con efectos extra\u00f1os, algunos casos con efectos sorprendentes hace tropezar a los incautos. Si has le\u00eddo otros lenguajes, puedes f\u00e1cilmente leer Java de la manera incorrecta llev\u00e1ndote a la confusi\u00f3n.<\/p>\n","protected":false},"author":1,"featured_media":690,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[4],"tags":[328,435,436,438,506,437,439],"_links":{"self":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1538"}],"collection":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1538"}],"version-history":[{"count":16,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1538\/revisions"}],"predecessor-version":[{"id":1555,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/posts\/1538\/revisions\/1555"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=\/wp\/v2\/media\/690"}],"wp:attachment":[{"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alejandroayala.solmedia.ec\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}