<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>JFelipe.translate("pt_BR");</title>
	<atom:link href="http://felipecourypt.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://felipecourypt.wordpress.com</link>
	<description>Tradução dos meus artigos sobre Java para português</description>
	<lastBuildDate>Tue, 10 Apr 2007 12:32:08 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='felipecourypt.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>JFelipe.translate("pt_BR");</title>
		<link>http://felipecourypt.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://felipecourypt.wordpress.com/osd.xml" title="JFelipe.translate(&#34;pt_BR&#34;);" />
	<atom:link rel='hub' href='http://felipecourypt.wordpress.com/?pushpress=hub'/>
		<item>
		<title>O Java está ficando mais charmoso</title>
		<link>http://felipecourypt.wordpress.com/2007/04/09/java-closures/</link>
		<comments>http://felipecourypt.wordpress.com/2007/04/09/java-closures/#comments</comments>
		<pubDate>Mon, 09 Apr 2007 20:11:54 +0000</pubDate>
		<dc:creator>Felipe Coury</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Click here to read this article in English. Já tem um bom tempo que eu desisti de acompanhar todas as novidades e tendências no mundo das linguagens de programação. Eu ainda lembro quando comecei a programar, usando Clipper! Para obter novidades, ou você comprava um livro ou uma revista&#8230; Hoje em dia quando visito websites [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipecourypt.wordpress.com&amp;blog=968673&amp;post=1&amp;subd=felipecourypt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://felipecoury.wordpress.com/2007/04/09/java-closures/"><em>Click here to read this article in English.</em></a></p>
<p>Já tem um bom tempo que eu desisti de acompanhar todas as novidades e tendências no mundo das linguagens de programação. Eu ainda lembro quando comecei a programar, usando Clipper! Para obter novidades, ou você comprava um livro ou uma revista&#8230;</p>
<p>Hoje em dia quando visito websites como Reddit ou Digg, sempre me deparo com umas 3 APIs AJAX, todas revolucionárias, alguns artigos dizendo que a linguagem XXX é uma droga porque não tem a feature ABC, enquanto outros arigos dizem que ela é a melhor coisa que já aconteceu para os programadores. Nesse mundo dinâmico de hoje, você tem que filtrar aquelas novidades que você quer &#8220;digerir&#8221;. Se não o fizer a gente acaba conhecendo muito pouco de muita coisa. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Então, há algum tempo comecei a ver artigos sobre <em>Closures</em> em Java. Clicava em alguns, dava uma lida por cima, mas nunca me chamou a atenção. Isso foi antes de eu descobrir os <a href="http://video.google.com/videosearch?q=user%3A%22Google+engEDU%22&amp;num=10&amp;so=0&amp;hl=en&amp;start=0">Google Tech Talks</a>, e especificamente a série <a href="http://video.google.com/videosearch?q=advanced+topics+in+programming+languages&amp;aq=t">Advanced Topics on Programming Languages</a>. Neste fim de semana passado acabei assistindo uma palestra de 2 horas sobre Java Closures.</p>
<p>O princípio das Closures não é novo. A proposta é usar variáveis com blocos de código (funções). Eu me lembro que no bom e velho Clipper já haviam os <a href="http://discuss.joelonsoftware.com/default.asp?joel.3.371913.10">code</a> <a href="http://www.ghservices.com/gregh/clipper/cbevo.htm">blocks</a> que eram extremamente úteis. Em javascript também é possível utilizar os <a href="http://www.permadi.com/tutorial/jsFunc/">Function Objects</a>. E por aí vai&#8230;</p>
<p>Tento agora explicar de maneira sucinta o que eu entendi das Closures de Java:</p>
<p>Se você já teve que fazer profiling de código, já se deparou com problemas do tipo:</p>
<pre>
public void metodoProfile1() {
	long t0 = System.currentTimeMillis();
	fazAlgumaCoisa();
	Logger.log(
		"fazAlgumaCoisa(): " +
		(System.currentTimeMillis() - t0) +
		" ms."
	);
}
</pre>
<p>ou em JDBC:</p>
<pre>
public List getCustomers() {
	List result = new ArrayList();
	Connection conn;
	Statement s;
	ResultSet rs;

	try {
		conn = ConnectionPool.getConnection();
		s = c.createStatement();
		rs = s.executeQuery("SELECT * FROM CUSTOMER");

		while (rs.next()) {
			// ...
		}
	} catch (SQLException e) {
		System.out.println("Error...");
		e.printStackTrace();
	} finally {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
			}
		}
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
			}
		}
		if (c != null) {
			try {
				c.close();
			} catch (SQLException e) {
			}
		}
	}
}
</pre>
<p>Pegue este último exemplo: você tem 37 linhas de código enquanto a lógica está em menos de 10 linhas. Quando um amigo meu diz que java é uma linguagem burocrática, eu tenho que concordar com ele&#8230; Imagine tendo que implementar profiling em 50 métodos do seu projeto e fazer classes de acesso à dados da forma do segundo método? Além de um trabalho extremamente braçal e chato, você acaba com replicação de código. Imagine por exemplo que você queira mudar a forma com que você trata exceções para usar uma API nova de logs&#8230; São 50 mudanças e por aí vai&#8230;</p>
<p>Aí é que a graça das Closures entram! O que você acha se pudesse escrever algo do tipo:</p>
<pre>
public void metodoProfile1() {
	withMeasure ("metodoProfile1", { =&gt;
		fazAlgumaCoisa();
	});
}
</pre>
<p>Ou para o caso de JDBC:</p>
<pre>
public List getCustomers() {
	Connection conn;
	Statement s;
	ResultSet rs;

	with(conn, s, rs, { =&gt;
		conn = ConnectionPool.getConnection();
		s = c.createStatement();
		rs = s.executeQuery("SELECT * FROM CUSTOMER");

		if (rs.next()) {
			// ...
		}
	});
}
</pre>
<p>Esse bloco de código &#8220;{ =&gt; &#8230; }&#8221; é uma nova proposta de sintaxe para o Java que reflete variáveis de função. A sintaxe é simples, alguns exemplos:</p>
<pre>
{int =&gt; int} // protótipo de função que recebe um int e retorna um int

{int, int =&gt; int} // protótipo de função que recebe dois int's e retorna um int

{String =&gt; int throws NumberFormatException} // recebe uma String e retorna int,
						// podendo lançar uma NumberFormatException

{ =&gt; void } // função sem parâmetros que não retorna nada

{T =&gt; U} // função do tipo T que retorna tipo U (generics).
</pre>
<p>Alguns exemplos de declarações:</p>
<pre>
{int x =&gt; x+1}

{int x, int y =&gt; x+y}

{String x =&gt; Integer.parseInt(x)}

{=&gt; System.out.println("Hello world");}

{int, int =&gt; int} sum = {int x, int y =&gt; x+y}; // soma x e y
</pre>
<p>Toda Closure se transforma &#8220;por baixo dos panos&#8221; em uma interface que tem um método invoke com a mesma assinatura dos parâmetros da Closure em si. Por exemplo, a variável <code>sum</code> poderia ser executada usando:</p>
<pre>
(...)
	System.out.println(sum.invoke(5, 2)); // imprime "7"
(...)
</pre>
<p>&#8230; e por aí vai.</p>
<p>O melhor, porém é a sintaxe alternativa, que permite chamadas mais &#8220;naturais&#8221;. É a chamada &#8220;Control Abstract Syntax&#8221;, que permite que você escreva o segundo exemplo assim:</p>
<pre>
public List getCustomers() {
	Connection conn;
	Statement s;
	ResultSet rs;

	with (conn, s, rs) {
		conn = ConnectionPool.getConnection();
		s = c.createStatement();
		rs = s.executeQuery("SELECT * FROM CUSTOMER");

		if (rs.next()) {
			// ...
		}
	}
}
</pre>
<p>Lindo, não? Pois é&#8230; Veja como a parte de &#8220;lógica de negócio&#8221; agora está bem mais aparente, você não se &#8220;destrai&#8221; lendo o método&#8230; Se você está pensando como fica o método <code>with</code> aqui, dá uma olhada:</p>
<pre>
public void with(Connection c, Statement s, ResultSet rs, { =&gt; void } block) {
	try {
		block.invoke();
	} catch (SQLException e) {
		System.out.println("Error...");
		e.printStackTrace();
	} finally {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
			}
		}
		if (s != null) {
			try {
				s.close();
			} catch (SQLException e) {
			}
		}
		if (c != null) {
			try {
				c.close();
			} catch (SQLException e) {
			}
		}
	}
}
</pre>
<p> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Este artigo é apenas uma introdução aos Closures em Java. Existem alguns outros apelos para a criação dessa construção. Para maiores informações eu recomendo a apresentação de Neal Gafter, um dos pais da proposta da <a href="http://www.javac.info/closures-v05.html">closures specification</a>. <a href="http://video.google.com/url?docid=4051253555018153503&amp;esrc=sr2&amp;ev=v&amp;q=advanced+topics+in+programming+languages&amp;vidurl=http://video.google.com/videoplay%3Fdocid%3D4051253555018153503%26q%3Dadvanced%2Btopics%2Bin%2Bprogramming%2Blanguages&amp;usg=AL29H23B0twspU8rvkyl0TqfpyTHth-8lg">Esse é o link para o vídeo.</a></p>
<p>Alguns links relacionados:</p>
<li><a href="http://www.javac.info">Website de Neal Gafter</a> sobre Closures</li>
<li><a href="http://gafter.blogspot.com/">Neal Gafter blog</a></li>
<li><a href="http://blogs.sun.com/ahe/">Peter Ahé&#8217;s Weblog</a> (co-autor da especificação)</li>
<li><a href="http://blogs.sun.com/jag/entry/the_black_hole_theory_of">James Gosling, sobre closures</a></li>
<li>Article: <a href="http://blogs.sun.com/gbracha/entry/achieving_closure">Achieving Closures</a></li>
<li><a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">Wikipedia Article sobre Closures</a></li>
<li><a href="http://www.infoq.com/interviews/joshua-bloch">Joshua Bloch on Closures, Resource Management, Google</a> tem boas considerações sobre Closures</li>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/felipecourypt.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/felipecourypt.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/felipecourypt.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/felipecourypt.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/felipecourypt.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/felipecourypt.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/felipecourypt.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/felipecourypt.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/felipecourypt.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/felipecourypt.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/felipecourypt.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/felipecourypt.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/felipecourypt.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/felipecourypt.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/felipecourypt.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/felipecourypt.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=felipecourypt.wordpress.com&amp;blog=968673&amp;post=1&amp;subd=felipecourypt&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy"></div>]]></content:encoded>
			<wfw:commentRss>http://felipecourypt.wordpress.com/2007/04/09/java-closures/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c4ceadae4f61dac8ff3ababc3faa6c42?s=96&#38;d=identicon" medium="image">
			<media:title type="html">Felipe Coury</media:title>
		</media:content>
	</item>
	</channel>
</rss>
