<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>{ :lazy =&#62; loading } &#187; Java</title>
	<atom:link href="http://mgaravaglia.com.ar/blog/index.php/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://mgaravaglia.com.ar/blog</link>
	<description>So far the universe is wining.</description>
	<lastBuildDate>Tue, 31 May 2011 17:25:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ServiceConstructionException: Could not find definition for service</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2010/06/15/serviceconstructionexception-could-not-find-definition-for-service/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2010/06/15/serviceconstructionexception-could-not-find-definition-for-service/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 18:32:29 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[cxf]]></category>
		<category><![CDATA[ws]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=105</guid>
		<description><![CDATA[Ok&#8230; just for the record, Al implementar un client ws con cxf tener cuidado de no estar usando un frontend proxy factory en lugar de un jaxws proxy factory como, en general, queremos.

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass(MyService.class);
factory.setAddress("http://localhost/ws");
MyService client = (MyService) factory.create();

]]></description>
			<content:encoded><![CDATA[<p>Ok&#8230; just for the record, Al implementar un client ws con cxf tener cuidado de no estar usando un frontend proxy factory en lugar de un jaxws proxy factory como, en general, queremos.</p>
<pre name="code" class="java">
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass(MyService.class);
factory.setAddress("http://localhost/ws");
MyService client = (MyService) factory.create();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2010/06/15/serviceconstructionexception-could-not-find-definition-for-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EasyMock: Mocks&#8230; eh&#8230; fácil.</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/10/23/easymock-mocks-eh-facil/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/10/23/easymock-mocks-eh-facil/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 00:02:26 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=88</guid>
		<description><![CDATA[El TDD es muy lindo hasta que nos toca hacer un test unitario a un componente que tiene muchas dependencias, que en estos tiempos de arquitecturas multitier suelen ser la mayoria.
Estas dependencias suelen remplazarse por objetos que simulan ser los reales compartiendo la misma interfaz. Claro que es solo una fachada, su implementación dista mucho [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> es muy lindo hasta que nos toca hacer un test unitario a un componente que tiene muchas dependencias, que en estos tiempos de arquitecturas multitier suelen ser la mayoria.</p>
<p style="text-align: justify;">Estas dependencias suelen remplazarse por objetos que simulan ser los reales compartiendo la misma interfaz. Claro que es solo una fachada, su implementación dista mucho de ser la real, pero nos proporcionan un comportamiento determinista y controlado contra el que probar nuestros componentes. <a href="http://easymock.org/" target="_blank">EasyMocks </a>es un framework que permite crear estos objetos de forma muy sencilla indicando cual es la interfaz que deben cumplir y cual es el comportamiento que esperamos.</p>
<h2>Creando el Mock</h2>
<p style="text-align: justify;">Lo primero que necesitamos es decirle al framework cual va a ser la interfaz que queremos implementar en nuestro &#8220;mock&#8221;. Supongamos que necesitamos testear una clase <em>Cliente </em>que necesita los favores de una clase que implemente <em>Servicio</em>. Lo que vamos a hacer es un &#8220;mock&#8221; que simule ser una implementacion real de <em>Servicio </em>pero solo la vamos a usar para llevar a cabo el test.</p>
<p style="text-align: justify;">El metodo estatico createMock de la clase EasyMock toma una Interface como parametro (tambien puede ser una clase) y nos devuelve un objeto que la implementa.</p>
<pre name="code" class="java">Servicio servicioMock = EasyMock.createMock(Servicio.class)</pre>
<h2>Its Alive!!</h2>
<p style="text-align: justify;">Genial, ¿Ya podemos pasarle la referencia servicioMock al Cliente y testear a gusto?&#8230; bueno&#8230; no tan easy.</p>
<p style="text-align: justify;">A continuacion vamos a hacer que ese servicioMock implemente la operacion sumarDiez que, a partir de un parametro int numero devuelve ese numero incrementado en 10. No va a ser la implementacion real, solo a &#8217;simular&#8217; que esta haciendo algo realmente mediante el metodo EasyMock.expect.</p>
<pre name="code"  class="java">EasyMock.expect(servicioMock.sumarDiez(5)).andReturn(15);</pre>
<p style="text-align: justify;">Acabamos de decirle a nuestro servicioMock que cuando alguien invoque al metodo sumarDiez con el numero 5 como parametro el debe devolver 15. No hay implementacion real, solo se pretende estar realizando la operacion. Ademas nuestro mock no sabe que hacer si alguien le pasa el numero 6 como parametro, y nos lo hara saber con una hermosa excepción.</p>
<pre name="code"  class="java">Easymock.replay(servicioMock);</pre>
<p style="text-align: justify;">Esto pone al mock en &#8216;test mode&#8217; indicando que ya podemos usarlo para nuestro <a href="http://www.junit.org/">test</a>.</p>
<h2>Still alive&#8230; and well?</h2>
<p style="text-align:justift;">Ahora sí podemos meter el servicioMock en nuestro test y admirar a EasyMock en toda su gloria</p>
<p>Ojo que lo que estamos testeando es el comportamiento de <em>Cliente </em>y no de <em>Servicio</em>! es decir que <em>invocarAlMetodoSumarDiezDeServicio() </em>este delegando correctamente e invocando a <em>Servicio</em>.</p>
<pre name="code"  class="java">Cliente cliente = new Cliente();
cliente.setServicio(servicioMock);
int esultado = cliente.invocarAlMetodoSumarDiezDeServicio(10);
assertEquals(15,resultado);</pre>
<p style="text-align: justify;">Las posibilidades que tiene Easymock son ilimitadas y podemos simular comportamientos extremadamente complejos. Pueden encontrar mas informacion sobre todo el potencial de EasyMock en su <a href="http://easymock.org/EasyMock2_5_2_Documentation.html">página oficial</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/10/23/easymock-mocks-eh-facil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scripting en Java</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2009/02/08/scripting-en-java/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2009/02/08/scripting-en-java/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 21:00:33 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=64</guid>
		<description><![CDATA[En Java es posible interpretar virtualmente cualquier lenguaje de scripting utilizando una API bastante simple introducida  a partir de la versión 1.6  por obra de la JSR223. Estos lenguajes se incorporan en nuestros proyectos como simples Jars que luego son descubiertos por un ScriptEngineManager que los regentea.
JSE6 incorpora out-of-the-box el engine Rhino asi que tenemos [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En Java es posible interpretar virtualmente cualquier lenguaje de scripting utilizando una API bastante simple introducida  a partir de la versión 1.6  por obra de la <a href="http://jcp.org/en/jsr/detail?id=223" target="_blank">JSR223</a>. Estos lenguajes se incorporan en nuestros proyectos como simples Jars que luego son descubiertos por un <a href="http://java.sun.com/javase/6/docs/api/javax/script/ScriptEngineManager.html" target="_blank">ScriptEngineManager</a> que los regentea.</p>
<p style="text-align: justify;">JSE6 incorpora out-of-the-box el engine <a href="http://www.mozilla.org/rhino/" target="_blank">Rhino</a> asi que tenemos la posibilidad de ejecutar código JavaScript en nuestras aplicaciónes haciendo poco y nada.</p>
<pre name="code" class="java">
 ScriptEngineManager scm = new ScriptEngineManager();
ScriptEngine jsEngine = scm.getEngineByName("JavaScript");</pre>
<p style="text-align: justify;">Uhm&#8230; listo! estamos listos para interpretar javascript. Por un proceso de discovering (siguiendo la linea de los *Manager de Java) el ScriptEngineManager sabe que hacer cuando le pedimos un Engine de &#8220;JavaScript&#8221; y nos devuelve una instancia de ScriptEngine.</p>
<pre name="code" class="java">String script = "var sum = 0; var obj = new Array(1,1,2,3,5,13);"
+ "for each (var item in obj) { sum += item; }"
+ "print(sum);";
jsEngine.eval(script); // 25</pre>
<p style="text-align: justify;">el metodo <a href="http://java.sun.com/javase/6/docs/api/javax/script/ScriptEngine.html#eval(java.lang.String)" target="_blank">eval</a> del ScriptEngine interpreta el String que le pasamos como parametro y en la consola terminariamos con un &#8220;25&#8243;. However, el scripting en Java es mucho más inteligente, el metodo eval devuelve un Object que contiene el valor del ultimo statement del script. El mapeo del valor que &#8216;retorna&#8217; el script contra los tipos de datos de Java es especifico del Engine por lo que nos vamos a encontrar con comportamientos diferentes segun el lenguaje (y el engine) que interpretemos.</p>
<pre name="code" class="java"> String script = "var sum = 0; var obj = new Array(1,1,2,3,5,13);"
+ "for each (var item in obj) { sum += item; }"
+ "sum;";
Double d = (Double) jsEngine.eval(script);
 System.out.println( d +1 ); //26!!!</pre>
<p style="text-align: justify;">Con esta feature de JSE6 es inevitable pensar en dar un paso más en la parametrización de nuestros sistemas  ya no solo parametrizando valores y constantes sino también la logica de determinados procesos a traves de scripts simples en JS, Phyton, Ruby, Groovy, Jaskell o lo que sea. Otra ventaja en el uso de de esta API esta en incorporar lenguajes que nos eliminan el ciclo de code-compile-deploy-test pero sin alejarnos de la plataforma Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2009/02/08/scripting-en-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Serialización con XML</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/07/21/serializacion-y-xml/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/07/21/serializacion-y-xml/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 18:54:47 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[serializacion]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=56</guid>
		<description><![CDATA[En ciertas situaciones una forma más prolija de serializar un objeto  consiste en convertir su estado en una definicion XML y guardarlo o enviarlo donde haga falta. Esto nos permite poder ver el estado del objeto sobre el stream persistido incluso modificarlo con un editor de texto, cosa impensable sobre la salida de una [...]]]></description>
			<content:encoded><![CDATA[<p>En ciertas situaciones una forma más prolija de serializar un objeto  consiste en convertir su estado en una definicion XML y guardarlo o enviarlo donde haga falta. Esto nos permite poder ver el estado del objeto sobre el stream persistido incluso modificarlo con un editor de texto, cosa impensable sobre la salida de una serializacion estandar. Para tal fin podriamos complicarnos usando XStream o alguno de los tantos OXM (Object XML Mapper) que hay dando vueltas por la red. Calma! Antes de bajar los 20MB de librerias que nos pide el Apache Digester podemos echarle un vistazo a dos clases incluidas en J2SE: XMLEncoder y XMLDecoder.</p>
<p>Estas clases sirven exactamente para nuestros propositos: Transformar objetos en definiciones XML, y definiciones XML en objetos, sin perder nada en el medio. Sin configuraciones ni descriptores extraños estas dos clase son tan faciles de usar como un ObjectInputStream y  objectOutputStream.</p>
<p><strong>Objeto -&gt; XML</strong></p>
<pre name="code" class="java">
 Perro p = new Perro();
      FileOutputStream f = new FileOutputStream("perro.xml");
  XMLEncoder xe = new XMLEncoder(f);
      xe.writeObject(p);
      xe.close();
</pre>
<p><strong> XML -&gt; Objeto </strong></p>
<pre name="code" class="java">
  FileInputStream f = new FileInputStream("perro.xml");
  XMLDecoder xd = new XMLDecoder(f);
      Perro p = (Perro)xd.readObject();
</pre>
<p>Esta demas decir que el XML contiene todo el grafo del objeto (el perro con sus pulgas, collar, dueño y cualquier otra dependencia) haciendose cargo de forma impecable de las referencias circulares.</p>
<p>Los drawbacks de este metodo si lo comparamos con la serializacion tradicional es el mismo que se le atribuye a RMI vs Webservices: El XML es mas lento y pesado que su par binario. A favor de este método podemos decir que el objeto serializado es un xml que puede editarse en cualquier lado y que se elimina el problema del cambio de version de las clases. Ya no hay que preocuparse por conflictos de versionado con el serialVersionUID porque la unica informacion que se guarda en el xml sobre la clase de las instancias es el nombre.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/07/21/serializacion-y-xml/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La inmutabilidad de los Objetos</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/06/04/la-inmutabilidad-de-los-objetos/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/06/04/la-inmutabilidad-de-los-objetos/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 00:58:53 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=49</guid>
		<description><![CDATA[En el mundo de la OOP existe un tipo de Objeto denominado &#8220;Inmutable&#8221; que consiste en un objeto en el que su estado, una vez definido, no cambia durante todo su tiempo de vida.
Java incorpora unos cuantas clases cuyas instancias tienen la propiedad de ser inmutables. Las clases que envuelven los tipos primitivos (Byte, Short, [...]]]></description>
			<content:encoded><![CDATA[<p>En el mundo de la OOP existe un tipo de Objeto denominado &#8220;Inmutable&#8221; que consiste en un objeto en el que su estado, una vez definido, no cambia durante todo su tiempo de vida.</p>
<p>Java incorpora unos cuantas clases cuyas instancias tienen la propiedad de ser inmutables. Las clases que envuelven los tipos primitivos (Byte, Short, Character, Integer, Long, Float, Double) son inmutables. La clase String es inmutable. ¿Por qué son inmutables?¿Para complicarnos la existencia? No realmente&#8230;</p>
<p>Asi como en el experimento del <a href="http://es.wikipedia.org/wiki/Gato_de_Schr%C3%B6dinger" target='_blank'>Gato de Schrödinger</a> creamos una clase Gato con un atributo estado de tipo String. El estado del gato nos dice si el gato esta &#8220;VIVO&#8221; ó &#8220;MUERTO&#8221;</p>
<pre name="code" class="java">
public class Gato {
    private String estado;
    public void setEstado(String e) {
    this.estado = e;
    }
    public String getEstado() {
    return estado;
    }
}
</pre>
<p> vamos a suponer que la clase String tuviera un metodo setValue() que me permita cambiar la cadena de texto almacenada en una instancia particular de String. Es decir, supongamos que los objetos String no son inmutables y podemos cambiar el texto que contiene.</p>
<pre name="code" class="java">

public class TestSchrödinger {
public static void main(String[] args) {
Gato gato = new Gato();
String e = "vivo";
gato.setEstado(e);
//El gato esta vivo <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
e.setValue("muerto");
//A nuestro String mutable le cambiamos el texto que encapsula.
System.out.println(e);
//Si esto es cierto entonces deberia salir impreso en la pantalla "muerto"
System.out.println(gato.getEstado());
//¿El gato esta vivo o esta muerto?
</pre>
<p> El problema de la mutabilidad consiste en que los parametros en Java siempre son pasados por valor, inclusos las referencias a objeto pero no el objeto al que apunta. Si un String, por ejemplo, podria cambiar el valor que contiene entonces aparecerian inconsistencia en el estado de los objetos que en algun momento incorporaron ese String a su estado.</p>
<p>Si no les quedo muy claro tal vez este video ayude un poco <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><center><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/JC9A_E5kg7Y&#038;hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/JC9A_E5kg7Y&#038;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="344"></embed></object></center></p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/06/04/la-inmutabilidad-de-los-objetos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Referencias en Java II: referencias débiles</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/04/14/referencias-en-java-ii-referencias-debiles/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/04/14/referencias-en-java-ii-referencias-debiles/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 07:13:52 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java.lang.ref referencias]]></category>
		<category><![CDATA[java.ref]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=37</guid>
		<description><![CDATA[En un post anterior escribí sobre los distintos tipos de referencias a objetos que se pueden usar en Java. Hoy propongo echar mano a un poco de código y ver como se utilizan las referencias débiles, ó weak references.
El secreto de todo esto de las referencias se encuentra en el package java.lang.ref que consta de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">En un post <a title="Referencias en Java I" href="http://mgaravaglia.com.ar/blog/?p=31">anterior</a> escribí sobre los distintos tipos de referencias a objetos que se pueden usar en Java. Hoy propongo echar mano a un poco de código y ver como se utilizan las referencias débiles, ó weak references.</p>
<p>El secreto de todo esto de las referencias se encuentra en el package java.lang.ref que consta de un par de clases:</p>
<pre>+ Reference
      +WeakReference
      +PhantomReference
      +SoftReference
+ ReferenceQueue</pre>
<p>WeakReference es la clase que nos ocupa hoy y sirve para instrumentar a las famosas referencias débiles que mencione tiempo atras. Mirando todo mas pragmaticamente la diferencia entre estas weakreferences y las referencias fuertes radica en el momento de la creacion y el posterior acceso al objeto al que esta apunta. El siguiente codigo muestra el caso tipico entre dos objetos que se referencian mutuamente. La vista representa una pantalla de programa y Modelo algun objeto de dominio de negocio. Ambos objetos necesitan referencias al otro para implementar el patron observer que permita la comunicación correcta de estos dos componentes.</p>
<pre name="code" class="java">class Vista {
Modelo modelo;
public void imprimirModelo() {
System.out.println(modelo.value);
}
public void setModelo(Modelo m) {
modelo = m;
}
}
class Modelo {
int value;
WeakReference&lt;Vista&gt; vista; //referencia debil a la vista
public boolean existsVista() {
return this.vista.get()!=null;
}
public void actualizarVista() {
Vista miVista = this.vista.get(); //miVista es referencia fuerte a vista
//le avisa a la vista q cambio el modelo y debe actualizarse
//miVista.update();
}
public WeakReference&lt;Vista&gt; getVista() {
return vista;
}
public void setVista(Vista v) { //setter con weakreferences
vista = new WeakReference&lt;Vista&gt;(v);
}
}</pre>
<p style="text-align: justify;">La clase vista no tiene ningun comportamiento extraño, no podemos decir lo mismo de la clase Modelo. En ella vemos que la declaracion de una referencia debil se hace mediante la clase WeakReference indicando con generics la clase a la que va a apuntar esta referencia, en nuestro caso Vista.</p>
<p style="text-align: justify;">Los accesors a este atributo son un tanto particulares, el setter recibe una referencia fuerte a Vista y que es envuelta con el constructor de WeakReference y finalmente asignada al atributo. El getter, sin embargo, devuelve un objeto de clase WeakReference. Con este objeto podemos obtener una referencia fuerte al objeto vista utilizando el metodo get().</p>
<p style="text-align: justify;">El metodo existsVista() simplemente devuelve verdadero o falso indicandonos si existe el objeto al que apunta la referencia vista o si ya fue eliminado por el gc.</p>
<p>Un caso tipico de uso de estas clases, a saber:</p>
<pre name="code" class="java">public class Main {
public static void main(String[] args) {
Modelo m = new Modelo(); //creamos el modelo
Vista v = new Vista(); //creamos la vista
v.setModelo(m); //se aparean la vista y el modelo
m.setVista(v); //hay que recordar que setVista envuelve
//el parametro con una WeakReference
m.value = 77;
v.imprimirModelo();
//Imprime 77... como podria esperarse
v = null; //no queremos usar más la vista.
System.gc(); //pasa el basurero
System.out.println(m.existsVista());
}
}</pre>
<p style="text-align: justify;">Imprime false porque la referencia fuerte que apuntaba a la vista ya no lo hace. La unica referencia a ese objeto que queda es el atributo del modelo, que por ser una referencia debil el gc la ignora.</p>
<p style="text-align: justify;">Recomiendo pasar estos pedazos de códigos por el amigo debugger e ir siguiendo el movimiento de las referencias y como desaparecen los objetos por arte de magia. En otro momento seguimos con las referencias fantasmas y blandas.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/04/14/referencias-en-java-ii-referencias-debiles/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Puzzle!</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/04/06/puzzle/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/04/06/puzzle/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 19:43:20 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[puzzle]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/blog/?p=38</guid>
		<description><![CDATA[¿Qué imprime este programa y por qué?
public class Puzzle {
public static void main(String args[]) {
int x = 0x3;
// AYUDITA: public class declara// una nueva clase. main es el metodo
// principal o entry point //del programa y String[] almacena un array
// de String que son // cadenas de caracteres que se guardan usando
// unicode que es [...]]]></description>
			<content:encoded><![CDATA[<p>¿Qué imprime este programa y por qué?</p>
<pre name="code" class="java">public class Puzzle {
public static void main(String args[]) {
int x = 0x3;
// AYUDITA: public class declara// una nueva clase. main es el metodo
// principal o entry point //del programa y String[] almacena un array
// de String que son // cadenas de caracteres que se guardan usando
// unicode que es un conjunto //de caracteres donde la letra a se escribe
// con \u0061 la letra b // con \u0062 y linefeed se representa con
// \u000A x++; // se usa  para postincrementar una variable x//
// ++x;// se utiliza para preincrementar una variable x x+=2 incrementa
// en 2 a x; // los literales que empiezan con 0x se tratan como
// hexadecimales en java.
System.out.println(x+1-1);
}
}</pre>
<p>La mejor respuesta se lleva un premio <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p><span style="color: #000080;">Bueno despues de mucho deliberar (?) decreto que el justo ganador del puzzle es Sherekan! quien se hace acreedora  del siguiente premio:</span></p>
<p><span style="color: #000080;">2 (dos) libros &#8220;El Lenguaje de Programación Java SL-275&#8243; compuesto por una Guía de Estudiante y Guía Práctica. Publicados por Sun Microsystems. Fuerte el aplauso!</span></p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/04/06/puzzle/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Referencias en Java I</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/03/30/referencias-en-java-i/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/03/30/referencias-en-java-i/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 06:01:02 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java.ref]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/port8080/?p=31</guid>
		<description><![CDATA[En Java existe más de una forma de &#8220;apuntar&#8221; a un objeto usando una referencia. Hay de hecho cuatro tipos distintos de referencias. Esto se debe a lo extraño que resulta a veces la forma en que trabaja el Garbage Collector. A pesar de contar con variedad de formas de referenciar a un objeto, normalmente [...]]]></description>
			<content:encoded><![CDATA[<p>En Java existe más de una forma de &#8220;apuntar&#8221; a un objeto usando una referencia. Hay de hecho cuatro tipos distintos de referencias. Esto se debe a lo extraño que resulta a veces la forma en que trabaja el Garbage Collector. A pesar de contar con variedad de formas de referenciar a un objeto, normalmente se utiliza una sola.</p>
<p>Nota: Este tema es bastante largo y tedioso incluso. Está dividido en varias entregas con el fin de salvaguardar la integridad mental de los posibles lectores ante una indigestión por lectura violenta.</p>
<p><strong>Motivación.</strong></p>
<p><strong></strong>El Garbage Collector es un ser extraño.  Repasemos por un segundo como funciona este particular habitante de la JVM. Cuando se inicia un programa en Java y se comienzan a crear objetos aparece un conjunto de referencias denominado <em>root set </em>donde se encuentran las referencias declaradas dentro del metodo main(), o run() si estamos trabajando con varios threads. Luego durante la ejecución del programa aparecerán otras referencias pero como atributos de algún objeto cuya referencia este en el <em>root set</em>. En la imagén, que tomé del excelente <a href="http://books.google.com.ar/books?id=xkyfc5RrDWEC&amp;dq=hardcore+java+robert+simmons&amp;pg=PP1&amp;ots=BXOTNHdTm6&amp;sig=6F-wpkKJVdCTV6T3Mm5BKtGjHFo&amp;hl=es&amp;prev=http://www.google.com.ar/search?q=hardcore+java+robert+simmons&amp;ie=utf-8&amp;oe=utf-8&amp;rls=com.google:es-ES:official&amp;client=firefox-a&amp;sa=X&amp;oi=print&amp;ct=title&amp;cad=one-book-with-thumbnail" target="_blank">Hardcore Java</a> de <span class="v1">Robert Simmons Jr, se ve como en un metodo main() se crean tres referencias A, C y H a objetos a partir de las cuales se forma el grafo (fig.1).</span></p>
<p align="center"><img src="http://img405.imageshack.us/img405/1891/ref1yp1.jpg" alt="" width="294" height="216" align="middle" /></p>
<p align="center">Si cambiaramos en A la referencia que posee a B haciendola apuntar a <em>null </em>(fig.2) el Garbage Collector no eliminaria el objeto B puesto que aún existe un camino a traves de C-&gt;F-&gt;X-&gt;D-&gt;J-&gt;E-&gt;B. De esa forma funciona el Garbage Collector, <strong>elimina los objetos que no pueden ser accedidos a traves de un camino que se inicie en el <em>root set.</em></strong> Esto es particularmente util para evitar las &#8220;islands of isolations&#8221; cuando hay un grupo de objetos con referencias entre si pero que no pueden ser accedidos por el thread principal.</p>
<p align="center"><img src="http://img72.imageshack.us/img72/6015/ref2ga9.jpg" alt="" /></p>
<p>Este comportamiento, en un principio benigno, es la principal causa de memory leaks en las aplicaciones cuando tenemos referencias circulares  entre dos objetos o más objetos. Supongamos que el grafo representa una aplicación con interfaz gráfica donde A es la GUI y C el objeto a partir del cual se arma la lógica de negocios. El objeto A posee muchas referencias a otros objetos (panels, botones, textfields) y C a todas las clases del negocio. Ademas, como en todas las aplicaciones con GUI, se unen ambos mundos (Vista y Modelo) con algun mecanismo de Listeners que implemente el patrón <a href="http://mgaravaglia.com.ar/port8080/?p=32">observer</a>.  ¿Que pasa sí, como en el ejemplo anterior, el objeto B es una ventana a la que dejamos de referenciar desde A porque no queremos utilizarla más? Evidentemente aún queda un camino a traves del cual se puede acceder a este objeto, como vimos más arriba, por lo que la ventanita no es elegible para ser eliminada por el garbage collector. Tenemos una ventana en memoria (con todos sus componentes) que no queremos usar más pero sigue apuntada por un listener. Tenemos un Memory Leak.</p>
<p><strong>Los cuatro tipos de referencias.</strong></p>
<p><strong></strong>Java nos provee cuatro tipos de referencias distintos para ayudarnos a evitar problemas como el visto aguas arriba sin ensuciar el codigo con aventuradas técnicas de manejo de Listeners. Estos cuatro tipos de referencia son: Fuerte, Débil, Blanda y Fantasma.</p>
<ul>
<li><strong>Referencia Fuerte </strong>Las referencias a objetos que se utilizan en java comunmente son referencias fuertes (ó strong references). Su comportamiento es por demas conocido por todos. Apuntan a un objeto y lo mantienen en memoria mientras esta referencia se mantenga. Cuandro creamos un <span style="color: #008000;">String texto = &#8220;algo&#8221;</span> estamos creando una referencia fuerte apuntando a un objeto de tipo String.</li>
</ul>
<ul>
<li><strong>Referencia Débil </strong>Una referencia debil (weak reference) es una referencia común y corriente pero con una salvedad: Si un objeto es apuntado solo por referencias debiles, sera elegible por el garbage colector para ser eliminado. Es decir, en el momento de elegir que objetos seran eliminados el GC ignora las referencias debiles haciendo como si no existieran.En el grafo original se reemplazan las referencias fuertes circulares, potencialmente peligrosas, por referencias debiles (indicadas en la figura con una flecha doble).</li>
</ul>
<p align="center"><img src="http://img266.imageshack.us/img266/6571/ref3uj4.jpg" alt="" width="289" height="203" align="middle" /><br />
¿Qué sucede si ahora dejamos de apuntar a B desde A? ¡Sorpresa! B es elegible para ser eliminado.</p>
<ul>
<li><strong>Referencia Blanda </strong>Las referencias blandas (soft reference) se comportan como las referencias debiles pero el garbage collector va a eliminar los objetos unicamente si tiene poco espacio en el Heap. Digamos que si un objeto esta siendo apuntado unicamente por referencias blandas el garbage collector puede elegirlo para eliminación si tiene poca memoria en el heap, sino no necesariamente va a eliminarlo. Este comportamiento sin embargo, como pasa con todo lo relacionado al garbage collector, es dependiente de la implementación y en la práctica las referencias blandas son tratadas como referencias debiles por la Java Virtual Machine.</li>
<li><strong>Referencia Fantasma </strong>El tipo más enigmático de todos  y su uso es, por lo menos, tan bizarro como su nombre. La referencia fantasma (phantom reference) apunta a un objeto cuando este ya ha sido eliminado por el GC. Si, una vez que el objeto pasa por el GC la referencia fantasma apunta a él. Sin embargo no puede usarse para acceder a ningún miembro de este objeto, sino solo para saber que estuvo ahí en algun momento. ¿Extraño verdad? Su uso más común es contar cuantos objetos han sido eliminados y en técnicas de profilling.</li>
</ul>
<p>Con estos cuatro tipos de referencias podemos lograr que nuestros programas hagan un uso más racional de la memoria pero como aplicarlos queda para mas adelante. Antes de terminar esta primera entrega es menester recordar que estos no son structurals patterns o algo parecido sino que java nos ofrece una API estandar para implementarlos programaticamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/03/30/referencias-en-java-i/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Errores y Excepciones</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/02/16/errores-y-excepciones/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/02/16/errores-y-excepciones/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 20:36:00 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[scjp]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/port8080/?p=24</guid>
		<description><![CDATA[You are not required to catch Error objects or Error subtypes. You can also throw an Error yourself (although other than AssertionError you probably won&#8217;t ever want to), and you can  catch one, but again, you probably won&#8217;t. What, for example, would you actually  do if you got an outOfMemoryError? It&#8217;s not like [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>You are not required to catch <span class="fixed">Error</span> objects or <span class="fixed">Error</span> subtypes. You can also throw an <span class="fixed">Error</span> yourself (although other than <span class="fixed">AssertionError</span> you probably won&#8217;t ever want to), and you can  catch one, but again, you probably won&#8217;t. What, for example, would you actually  do if you got an <span class="fixed">outOfMemoryError?</span> It&#8217;s not like you  can tell the garbage collector to run; you can bet the JVM fought desperately to  save itself (and reclaimed all the memory it could) by the time you got the  error. In other words, don&#8217;t expect the JVM at that point to say, &#8220;<span style="font-weight: bold">Run the  garbage collector? Oh, thanks so much for telling me. That just never occurred  to me. Sure, I&#8217;ll get right on it.</span>&#8221; Even better, what would you do if a <span class="fixed">VirtualMachineError</span> arose? Your program is toast by the time  you&#8217;d catch the Error, so there&#8217;s really no point in trying to catch one of  these babies. Just remember, though, that you can!</p></blockquote>
<p>Katty Sierra es lo más&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/02/16/errores-y-excepciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Identificadores Unicode en Java</title>
		<link>http://mgaravaglia.com.ar/blog/index.php/2008/01/09/identificadores-unicode-en-java/</link>
		<comments>http://mgaravaglia.com.ar/blog/index.php/2008/01/09/identificadores-unicode-en-java/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 21:54:00 +0000</pubDate>
		<dc:creator>mauricio</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://mgaravaglia.com.ar/port8080/?p=21</guid>
		<description><![CDATA[Hablando de Unicode recorde algo que a veces pasa inadvertido pero puede ser beneficioso.Como los colegas rusos saben ДОМ o Привет son identificadores válidos en cualquier compilador Java. Java admite cualquier letra unicode como identificador. Ojo que dije letra y no caracter, para ver que diablos es una letra y que no lo es dentro [...]]]></description>
			<content:encoded><![CDATA[<p>Hablando de Unicode recorde algo que a veces pasa inadvertido pero puede ser beneficioso.<br />Como los colegas rusos saben ДОМ o Привет son identificadores válidos en cualquier compilador Java. <span style="font-weight: bold;">Java admite cualquier letra unicode como identificador. </span>Ojo que dije letra y no caracter, para ver que diablos es una letra y que no lo es dentro de la interminable tabla Unicode tenemos dos metodos más que utiles:<span style="color: rgb(0, 0, 102);"> </span>
<pre style="color: rgb(0, 0, 102);">boolean Character.isJavaIdentifierStart(char c) </pre>
<p>y
<pre style="color: rgb(0, 0, 102);">boolean Character.isJavaIdentifierPart(char c)</pre>
<p> Ambos devuelven true si el caracter que se le paso como parametro puede utilizarse al comienzo de un identificador o como parte de este respectivamente.<br />Por lo tanto podriamos declarar tranquilamente una
<pre style="color: rgb(0, 0, 102);"> public class Murciélago</pre>
<p>Lo cual puede llegar a ser medio molesto para andar tipeando los acentos pero esta caracteristica, a veces olvidada, llega como un regalo del cielo cuando hay que hacer una
<pre style="color: rgb(0, 0, 102);"> public class Ñandu</pre>
<p>Ahora no hay más excusas para el horrendo
<pre style="color: rgb(0, 0, 102);"> private int anio;</pre>
<p> en lugar de año <img src='http://mgaravaglia.com.ar/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://mgaravaglia.com.ar/blog/index.php/2008/01/09/identificadores-unicode-en-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

