<?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>Objectzilla &#187; Java</title>
	<atom:link href="http://www.objectzilla.com.br/category/sem-categoria/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.objectzilla.com.br</link>
	<description>por Leonardo Veríssimo</description>
	<lastBuildDate>Sat, 05 Jun 2010 18:58:50 +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>Já usou Memcached?</title>
		<link>http://www.objectzilla.com.br/2009/05/02/ja-usou-memcached/</link>
		<comments>http://www.objectzilla.com.br/2009/05/02/ja-usou-memcached/#comments</comments>
		<pubDate>Sat, 02 May 2009 20:02:17 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java cache memcached]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=207</guid>
		<description><![CDATA[Cache não é algo que os programadores desconhem. Quem esteve numa universidade, e teve uma aula séria de Arquitetura de Computadores, sabe que a memória é disposta numa hierarquia de caches. E quem já programou em Java, já ouviu falar de inicialização tardia, muito usado em singletons (apesar de não ser só para isso):

public class [...]]]></description>
			<content:encoded><![CDATA[<p>Cache não é algo que os programadores desconhem. Quem esteve numa universidade, e teve uma aula séria de Arquitetura de Computadores, sabe que a memória é disposta numa hierarquia de caches. E quem já programou em Java, já ouviu falar de inicialização tardia, muito usado em <em>singletons</em> (apesar de não ser só para isso):<span id="more-207"></span></p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MinhaClasse <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> MinhaClasse instance<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> MinhaClasse getInstance<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    	<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>instance == <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    		instance = <span style="color: #000000; font-weight: bold;">new</span> MinhaClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> instance<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// outras coisas</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esse é um jeito de fazer cache. Apenas deve-se tomar cuidado para que o objeto a ser retornado não seja mutável. Afinal, todos os interessados estão com a mesma instância, e se um dos clientes puderem mudar uma propriedade desse único objeto, todos terão o efeito indesejável de ter um objeto com comportamento diferente sem saber. Detalhe: a implementação de <em>singleton</em> dessa maneira é ingênua, evite-a.</p>
<p>Um outro jeito, comumente usado, de fazer cache é usar <em>session</em>. Pra quem tem uma aplicação web, parece mágico: joga-se uma entidade da persistência na sessão passando uma chave. Ao precisar do mesmo objeto de novo, ao invés de acessar o banco, pega-se o objeto da sessão com a mesma chave usada na escrita. Esse é a estratégia mais comum que eu já vi por aí. Mas existem vários problemas : já vi aplicações com mais código pra cache em sessão do que pro próprio negócio! Além do mais, <em>sessions</em> são únicas para cada usuário no <em>browser</em>, enquanto que a entidade a ser cacheada é, não raro, visível a vários usuários. Significa duas coisas: 1) Não vai ter uma cacheamento efetivo, se 20 usuários se logarem e todos acessarem a mesma entidade duas vezes, haverá vinte cópias do objeto, que será escrita e lida uma vez cada; 2) Ninguém sabe o que um outro usuário pode fazer, se um alterar a entidade, todos os dezenove usuários restantes não terão como saber disso e manterão cópias desatualizadas. <em>Session</em> não foi feita pra cache, e existe até um problema de design: apesar do mapa de sessão pertencer à camada de apresentação, o cache lida com problemas de objetos que surgem na camada de persistência. Dizer que um pode ser usado para implementação do outro resulta em confusões de conceitos.</p>
<p>Uma solução melhor é usar bibliotecas de cache. No Java, um bastante comum é o EHCache &#8212; usado principalmente para o cache de segundo nível de Hibernate &#8212; que fica na mesma JVM da sua aplicação. Não que seja ruim (tem até uns javeiros roxos que acham que esta é a melhor solução do mundo), mas quando se quer usar um cluster de aplicações web, por exemplo, passa-se a ter vários caches para cada instância de servidor, que é não o desejável. Uma das opções de cache, que fica fora da JVM de sua aplicação, é o Memcached.</p>
<p>A seguir, apresentarei as vantagens do Memcached, seu mecanismo básico junto com uma API do Java, e no final, o uso integrado com o Hibernate.</p>
<h2>Características do Memcached</h2>
<p>Memcached permite a chamada <strong>escalabilidade horizontal</strong>, ou seja, é possível usar várias instâncias de memcached em paralelo como se fosse uma única unidade, onde cada processo possui somente parte dos registros. Parece idiota, mas não é. Não é toda infraestrutura que lhe permite isso; bancos de dados tradicionais, sistemas operacionais e máquinas virtuais possuem uma dificuldade tremenda de configurações para que isso seja possível.</p>
<p>Porém, ser fácil de se escalar horizontalmente trouxe certos custos na sua implementação. Exemplo: Não existe replicação de dados automática, se quiser duas instâncias com dados iguais, terá que fazer seu script. Não existe transação e nem lock, pois isso gera contenção. Não existem busca por todos os registros ou por wildcards, pois pode causar demora nos resultados. E não há garantia de durabilidade de objetos armazenados em casos de <em>crash</em>.</p>
<p>E ainda duas características peculiares, uma é que o <strong>tempo de expiração no cache</strong> não é zerado com consultas (como é tradicional nas sessions de containeres web), ou seja, se você definir como tempo de expiração dois minutos, esse será o tempo que ficará armazenado, independente se houve consulta do registro nesse meio-tempo ou não. Portanto, sempre coloque no memcached objetos que já estejam persistidos em outro lugar. A segunda característica é que o tempo de expiração é definido por segundos que devem ser armazenados, ou seja, uma hora é 3600. Mas apenas se o tempo de permanência for menor que trinta dias, se for maior, o Memcached assume que é o tempo UNIX absoluto, ou seja, 1240699927 significa que o registro deve permanecer em cache até em 25 de abril de 2009 às 22h52min07 em UTC.</p>
<h2>Como usar</h2>
<p>Se você estiver usando alguma distribuição Linux, com certeza o Memcached pode ser baixado diretamente de seu repositório. Caso você seja um usuário Windows, existem portes do cache para esse Sistema Operacional <a href="http://www.splinedancer.com/memcached-win32/">aqui</a> e <a href="http://code.jellycan.com/memcached/">aqui</a>. Como só tenho o Fedora, não testei pra ver se funciona, então o <a href="http://www.google.com.br/">Google</a> será melhor pra resolver problemas de instalação no Windows do que eu.</p>
<p>Além disso, é necessário um cliente Memcached, que existem para várias linguagens. No Java, a melhor biblioteca que encontrei é a <a href="http://code.google.com/p/spymemcached/">Spy Memcached</a>, disponível na <a href="http://spymemcached.googlecode.com/files/memcached-2.3.1.jar">versão 2.3.1</a>. Baixe o arquivo e coloque no classpath de sua aplicação.</p>
<p>Incialize o Memcached no seu shell dessa maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">memcached <span style="color: #660033;">-p</span> <span style="color: #000000;">18000</span> <span style="color: #660033;">-vv</span></pre></div></div>

<p>A opção -p indica a porta da conexão TCP por onde será &#8220;ouvida&#8221; (não é necessário, se não informar será assumido o padrão 11211), e o -vv é a opção <em>verbose</em>.</p>
<p>Na sua aplicação Java, você abre um cliente Memcached dessa maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">MemcachedClient mem = <span style="color: #000000; font-weight: bold;">new</span> MemcachedClient<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InetSocketAddress</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, <span style="color: #cc66cc;">18000</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ou seja, passando um endereço de rede ao construtor do MemcachedClient. Caso você queira um cluster de aplicações Memcached, é possível também passar uma lista de endereços de redes, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">MemcachedClient mem = <span style="color: #000000; font-weight: bold;">new</span> MemcachedClient<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InetSocketAddress</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InetSocketAddress</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, <span style="color: #cc66cc;">18000</span><span style="color: #009900;">&#41;</span>,
				<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399; font-weight: bold;">InetSocketAddress</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, <span style="color: #cc66cc;">18001</span><span style="color: #009900;">&#41;</span>,
			<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Obviamente, é necessário duas instâncias de Memcached disponíveis nesses endereços.</p>
<p>As operações que o Memcached suporta são simples, exemplos:</p>
<h3>set</h3>
<p><img src="/wp-content/pic/memcached/opcao_set.png" alt="Memcached - exemplo do comando SET" /></p>
<p>A operação <strong>set</strong> insere um valor para uma dada chave, independente se esta já possuía um valor anterior ou não:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #003399; font-weight: bold;">String</span> marca = <span style="color: #0000ff;">&quot;Ford&quot;</span><span style="color: #339933;">;</span>
     <span style="color: #006600; font-weight: bold;">int</span> expira = <span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> + <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span> / <span style="color: #cc66cc;">1000</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// uma hora pra expirar</span>
&nbsp;
     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido = mem.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;marca&quot;</span>, expira, marca<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Lembre-se também do comportamento dos trinta dias, as duas formas abaixo setam o mesmo período de expiração:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido = mem.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;marca&quot;</span>, <span style="color: #cc66cc;">24</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, marca<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// um dia para expirar</span>
     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido = mem.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;marca&quot;</span>, <span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> + <span style="color: #cc66cc;">24</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span> / <span style="color: #cc66cc;">1000</span>, marca<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// também um dia</span></pre></div></div>

<p>É possível <em>setar</em> qualquer coisa, inclusive objetos Java que sejam seriálizáveis. Porém, qualquer coisa diferente de um tipo simples não é identificável para programas em outras linguagens que se conectarem a esse mesmo Memcached.</p>
<h3>add</h3>
<p><img src="/wp-content/pic/memcached/opcao_add.png" alt="Memcached - exemplo do comando ADD" /></p>
<p>A operação <strong>add</strong>, apesar do nome, insere um valor para uma dada chave, deste que esta não esteja com um elemento previamente armazenado:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     Pessoa pessoa1 = <span style="color: #000000; font-weight: bold;">new</span> Pessoa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     pessoa1.<span style="color: #006633;">setId</span><span style="color: #009900;">&#40;</span>28L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     pessoa1.<span style="color: #006633;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Leonardo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido1 = mem.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pessoa&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, pessoa1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// valido1 é true</span>
&nbsp;
     Pessoa pessoa2 = <span style="color: #000000; font-weight: bold;">new</span> Pessoa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     pessoa2.<span style="color: #006633;">setId</span><span style="color: #009900;">&#40;</span>41L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     pessoa2.<span style="color: #006633;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Vinicius&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido2 = mem.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pessoa&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, pessoa2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// valido2 é false</span></pre></div></div>

<h3>replace</h3>
<p><img src="/wp-content/pic/memcached/opcao_replace.png" alt="Memcached - exemplo do comando REPLACE" /></p>
<p>A operação <strong>replace</strong>, ao contrário do <em>add</em>, insere um valor para uma dada chave apenas se esta já estiver anteriormente armazenado:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #006600; font-weight: bold;">int</span> anoLancamento = <span style="color: #cc66cc;">2010</span><span style="color: #339933;">;</span>
     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido1 = mem.<span style="color: #006633;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, anoLancamento<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// valido1 é false</span>
&nbsp;
     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> ok = mem.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, anoLancamento<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// set armazena de qualquer jeito</span>
     ok.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// bloqueia até a conclusão</span>
&nbsp;
     <span style="color: #006600; font-weight: bold;">int</span> novoAnoLancamento = <span style="color: #cc66cc;">2011</span><span style="color: #339933;">;</span>
     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido2 = mem.<span style="color: #006633;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span>, <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span>, novoAnoLancamento<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// valido2 é true</span></pre></div></div>

<h3>get</h3>
<p><img src="/wp-content/pic/memcached/opcao_get.png" alt="Memcached - exemplo do comando GET" /></p>
<p>A operação <strong>get</strong> busca um registro armazenado anteriormete, dada uma chave:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #003399; font-weight: bold;">String</span> marca = <span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">String</span><span style="color: #009900;">&#41;</span> mem.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;marca&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// &quot;Ford&quot;, ou null se demorou demais ou expirou</span></pre></div></div>

<h3>delete</h3>
<p><img src="/wp-content/pic/memcached/opcao_delete.png" alt="Memcached - exemplo do comando DELETE" /></p>
<p>A operação <strong>delete</strong> apaga um valor no Memcached dada a chave. O valor armazenado não é retornado:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido1 = mem.<span style="color: #006633;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// true</span>
&nbsp;
     Future<span style="color: #339933;">&lt;</span>Boolean<span style="color: #339933;">&gt;</span> valido2 = mem.<span style="color: #006633;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;anoLancamento&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// false</span></pre></div></div>

<h3>incr</h3>
<p>A operação <strong>incr</strong> incrementa um valor previamente armazenado. Válido somente para números:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #006600; font-weight: bold;">long</span> valor1 = mem.<span style="color: #006633;">incr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contador&quot;</span>, <span style="color: #cc66cc;">9</span>, <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* o segundo parâmetro é valor a ser incrementado */</span>
                                               <span style="color: #666666; font-style: italic;">/* o terceiro parâmetro (opcional) é o valor inicial caso não haja nenhum par armazenado */</span>
                                               <span style="color: #666666; font-style: italic;">/* valor1 = 5 */</span>
&nbsp;
     <span style="color: #006600; font-weight: bold;">long</span> valor2 = mem.<span style="color: #006633;">incr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contador&quot;</span>, <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* se não informasse o valor inicial e esta fosse a primeira chamada, o retorno seria -1 */</span>
                                            <span style="color: #666666; font-style: italic;">/* valor2 = 12 */</span></pre></div></div>

<h3>decr</h3>
<p>A operação <strong>decr</strong> decrementa um valor previamente armazenado. Válido somente para números:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">     <span style="color: #006600; font-weight: bold;">long</span> valor1 = mem.<span style="color: #006633;">decr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contador&quot;</span>, <span style="color: #cc66cc;">12</span>, <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">/* valor1 = 20 */</span>
     <span style="color: #006600; font-weight: bold;">long</span> valor2 = mem.<span style="color: #006633;">decr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;contador&quot;</span>, <span style="color: #cc66cc;">9</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      <span style="color: #666666; font-style: italic;">/* valor2 = 11 */</span></pre></div></div>

<p>Lembre-se: os números são só positivos. Se o valor armazenado é 4 e você decrementar 6, o valor final é 0 (zero).</p>
<h2>Exemplo de cache para banco de dados</h2>
<p>Vamos a uma situação prática. Imagine um banco de consulta de preços de um supermercado. Alguns preços são consultados com bastante frequência e seus preços são raramente alterados. Idealmente, seria interessante cachear esses valores retornados para aliviar a carga do banco. Meu objeto de domínio é um só:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProductDescription <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399; font-weight: bold;">Serializable</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> description<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">BigDecimal</span> price<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> type<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// getters e setters omitidos</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Meu acesso aos dados obedece a essa interface:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.testeDaoMemcached</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> ProductDescriptionRepository <span style="color: #009900;">&#123;</span>
&nbsp;
	ProductDescription getByBarCode<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">void</span> refreshProductInformation<span style="color: #009900;">&#40;</span>ProductDescription product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ou seja, existe um método para retornar um pedido por código de barras (<em>getByBarCode()</em>) e outro que atualiza ou insere um produto (<em>refreshProductInformation()</em>).Também tenho uma classe, implementando essa interface, que executa comandos SQL no banco via JDBC (ProductDescriptionDAO, não mostrado).</p>
<p>O pulo do gato é uma classe, que fica como um Decorator, que realiza o cache, veja:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.testeDaoMemcached</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">net.spy.memcached.MemcachedClient</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProductDescriptionCacheDecorator <span style="color: #000000; font-weight: bold;">implements</span> ProductDescriptionRepository <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> MemcachedClient memcachedClient<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">int</span> expiration<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> ProductDescriptionRepository other<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> ProductDescription getByBarCode<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		ProductDescription product = <span style="color: #009900;">&#40;</span>ProductDescription<span style="color: #009900;">&#41;</span> memcachedClient.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;product_descr/&quot;</span> + barCode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000;  font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>product == <span style="color: #006600; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			product = other.<span style="color: #006633;">getByBarCode</span><span style="color: #009900;">&#40;</span>barCode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			memcachedClient.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;product_descr/&quot;</span> + barCode, expiration, product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> product<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> refreshProductInformation<span style="color: #009900;">&#40;</span>ProductDescription product<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		other.<span style="color: #006633;">refreshProductInformation</span><span style="color: #009900;">&#40;</span>product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		memcachedClient.<span style="color: #006633;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;product_descr/&quot;</span> + product.<span style="color: #006633;">getBarCode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setMemcachedClient<span style="color: #009900;">&#40;</span>MemcachedClient memcachedClient<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">memcachedClient</span> = memcachedClient<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setExpiration<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">int</span> expiration<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">expiration</span> = expiration<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setOther<span style="color: #009900;">&#40;</span>ProductDescriptionRepository other<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">other</span> = other<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Primeiro, a variável other refere-se a uma outra classe que implementa também ProductDescriptionRepository, como a classe acima é um decorator, natural que essa referência seja de um objeto que realmente faz acesso ao banco. Tem-se também a instância de um MemcachedClient e a instância de um período de expiração, para ser usado para a manipulação de dados do Memcached.</p>
<p>Veja, primeiro, o método <strong>getByBarCode</strong>, a primeira coisa que se faz é buscar um registro no memcached usando uma chave formada do nome abreviado do objeto seguido do código de barras do produto (o id). Havendo esse registro, retorna-o, e aí a consulta ao banco não é realizada e fim de papo. Se esse registro não estiver no Memcached, aí este é buscado no banco (através de <em>other</em>) e, em sequência, realizada a inserção do objeto no cache, para que as próximas chamadas desse método não façam busca no banco de novo. Lembre-se que o cache expira, e não é apropriado assumir que o objeto está sempre no cache, portanto é sempre necessário ter essa verificação de registro vazio em todas as suas consultas.</p>
<p>Ao inserir ou alterar um registro, o dado no cache fica desatualizado. Por isso, existe uma chamada para remover o ítem após a inserção bem sucedida no método <strong>refreshProductInformation()</strong>. Poderia haver uma inserção no memcache nesse ponto, mas preferi não fazer, porque de qualquer forma, isso será feito no método de busca.</p>
<p>A aplicação que exercita esse cache está disponível nesse <a href="/wp-content/zip/testeDaoMemcached.zip">zip</a>, caso queiram estudá-lo com mais detalhes.</p>
<h2>Usando como cache de segundo nível do Hibernate</h2>
<p>O <a href="https://www.hibernate.org/">Hibernate</a> possui suporte a cache de segundo nível, e a implementação mais comum é o <a href="http://ehcache.sourceforge.net/">EHCache</a>, que vem junto com o framework de persistência. Por ter um cache quase automático (pois você precisa habilitá-lo para cada entidade mapeada), é meio desvantajoso fazer cacheamento manualmente como fiz anteriormente. Incrivelmente, na minha busca por Memcached no Google, me deparei com o plugin <a href="http://code.google.com/p/hibernate-memcached/">hibernate-memcached</a> que usa o Memcached como cache de segundo nível.</p>
<p>Se a opção for essa, as coisas facilitam bastante. Primeiro, anotaremos a entidade ProductDescription, assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@<span style="color: #003399; font-weight: bold;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name=<span style="color: #0000ff;">&quot;product_description&quot;</span><span style="color: #009900;">&#41;</span>
@Cache<span style="color: #009900;">&#40;</span>usage=CacheConcurrencyStrategy.<span style="color: #006633;">NONSTRICT_READ_WRITE</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProductDescription <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399; font-weight: bold;">Serializable</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	@Id
	@Column<span style="color: #009900;">&#40;</span>name=<span style="color: #0000ff;">&quot;bar_code&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> description<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">BigDecimal</span> price<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399; font-weight: bold;">String</span> type<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// getters e setters</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Existem as anotações triviais do JPA, como @Entity, @Table, @Id e @Column. Mas existe também a anotação específica do Hibernate, que é o @Cache. Na estratégia de concorrência, estou dizendo que é possível haver escrita e leitura, mas que a escrita não bloqueia leituras. Sem esta anotação, o cache não funciona pra essa entidade. (Por isso, se você um dia colocou o cache de segundo nível que você queria nas configurações, mas nunca colocou a anotação @Cache nas entidades, é a mesma coisa que não ter cache de segundo nível.)</p>
<p>O Dao faz acessos ao Hibernate normalmente (estou usando o template do Spring):</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.hibernateMemcached</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.hibernate.SessionFactory</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.orm.hibernate3.HibernateTemplate</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.springframework.transaction.annotation.Transactional</span><span style="color: #339933;">;</span>
&nbsp;
@Transactional
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProductDescriptionDAO <span style="color: #000000; font-weight: bold;">implements</span> ProductDescriptionRepository <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> HibernateTemplate hibernateTemplate<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> ProductDescription getByBarCode<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> barCode<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>ProductDescription<span style="color: #009900;">&#41;</span> hibernateTemplate.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>ProductDescription.<span style="color: #000000; font-weight: bold;">class</span>, barCode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> refreshProductInformation<span style="color: #009900;">&#40;</span>ProductDescription product<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		product = <span style="color: #009900;">&#40;</span>ProductDescription<span style="color: #009900;">&#41;</span> hibernateTemplate.<span style="color: #006633;">merge</span><span style="color: #009900;">&#40;</span>product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		hibernateTemplate.<span style="color: #006633;">saveOrUpdate</span><span style="color: #009900;">&#40;</span>product<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setSessionFactory<span style="color: #009900;">&#40;</span>SessionFactory sessionFactory<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		hibernateTemplate = <span style="color: #000000; font-weight: bold;">new</span> HibernateTemplate<span style="color: #009900;">&#40;</span>sessionFactory<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E pra configurar, basta adicionar essas propriedades no hibernate.cfg.xml:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;hibernate.cache.provider_class&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>com.googlecode.hibernate.memcached.MemcachedCacheProvider<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;hibernate.cache.use_query_cache&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;hibernate.memcached.servers&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>localhost:14001<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/property<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Onde eu indico o provedor do cache, a opção de se fazer cache de queries, e o servidor do Memcached. Não são as únicas opções, mas as outras possuem opção <em>default</em>, que você encontra <a href="http://code.google.com/p/hibernate-memcached/wiki/Configuration">aqui</a>.</p>
<p>É só isso, agora é só adiconar o hibernate-memcached e o spy-memcached no seu classpath e rodar a aplicação. Também disponibilizei um <a href="/wp-content/zip/hibernateMemcached.zip">zip</a> para esse exemplo, caso vocês queiram dar uma olhada.</p>
<h2>Conclusão</h2>
<p>Usar cache, seja o Memcached ou qualquer outro, é uma boa opção para evitar acesso a recursos custosos, como o banco de dados. Mas, numa aplicação dividida em camadas não é sempre necessário que a responsabilidade de cachear fique no lado cliente (camada de apresentação). Se deixar que o lado servidor (camada de persistência) tenha essa responsabilidade, você pode deixar que os clientes acessem a camada de persistência na hora e do jeito que bem entenderem e, ainda assim, de maneira transparente, estará sendo feito acesso eficiente de recursos.</p>
<p>Eu havia feito uma medição bem informal de quanto o Memcached economizaria o tempo de busca. Levei à conclusão de que por causa de warm-up e tudo mais, eu não sei fazer benchmarks. <img src='http://www.objectzilla.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  O mais importante do cache não costuma nem ser o tempo de acesso mais rápido, mas o fato de não deixar &#8220;engargalar&#8221; o banco com muitos acessos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/05/02/ja-usou-memcached/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aprenda Java EE 6, agora! (2)</title>
		<link>http://www.objectzilla.com.br/2009/02/24/aprenda-java-ee-6-agora-2/</link>
		<comments>http://www.objectzilla.com.br/2009/02/24/aprenda-java-ee-6-agora-2/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 20:49:34 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=182</guid>
		<description><![CDATA[Dessa vez, estarei utilizando a versão b37 do Glassfish v3. Por causa disso, você vai ter que fazer alterações à mão no plugin do Eclipse para o servidor Glassfish. Na versão b36 havia as pastas web e ejb dentro de module. Agora, todos os jars estão dentro de module, sem distinção de pastas.
Primeiro, feche o [...]]]></description>
			<content:encoded><![CDATA[<p>Dessa vez, estarei utilizando a versão b37 do Glassfish v3. Por causa disso, você vai ter que fazer alterações à mão no plugin do Eclipse para o servidor Glassfish. Na versão b36 havia as pastas web e ejb dentro de module. Agora, todos os jars estão dentro de module, sem distinção de pastas.</p>
<p>Primeiro, feche o Eclipse. Iremos copiar o plugin do Glassfish e descompactá-lo, para alterar o seu arquivo de configurações. No Linux eu fiz assim, supondo que ECLIPSE_HOME seja uma variável onde aponta para a pasta do Eclipse:<span id="more-182"></span></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> ~<span style="color: #000000; font-weight: bold;">/</span>plugin <span style="color: #666666; font-style: italic;"># cria pasta plugin dentro de seuhome</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$ECLIPSE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>plugins <span style="color: #666666; font-style: italic;">#entra na pasta plugins dentro de eclipse</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">cp</span> com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar ~<span style="color: #000000; font-weight: bold;">/</span>plugin<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># copia o plugin do Glassfish para sua pasta</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>plugin<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># vá para a sua pasta...</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">unzip</span> com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar <span style="color: #660033;">-d</span> plugin_glassfish <span style="color: #666666; font-style: italic;"># e extrai o conteúdo do jar dentro da subpasta plugin_glassfish</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> plugin_glassfish<span style="color: #000000; font-weight: bold;">/</span>serverdef<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;">#entre na pasta serverdef (do conteúdo recém extraído)</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">vim</span> glassfishv3preludeserverdef.xml <span style="color: #666666; font-style: italic;"># edite este arquivo (não precisa ser, necessariamente, o vim)</span></pre></div></div>

<p>Você vai encontrar isso na linha 184:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;archive</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;${sunappserver.rootdirectory}/modules/web/jsf-impl.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;archive</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;${sunappserver.rootdirectory}/modules/web/jstl-impl.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>Troque para:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;archive</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;${sunappserver.rootdirectory}/modules/jsf-impl.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;archive</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;${sunappserver.rootdirectory}/modules/jstl-impl.jar&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>Agora vamos reempacotar o jar e devolvê-lo pro Eclipse:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>plugin <span style="color: #666666; font-style: italic;"># volta onde está a cópia do plugin do Eclipse</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">mv</span> com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar__old <span style="color: #666666; font-style: italic;"># mude o nome</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> plugin_glassfish<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># entre na pasta com conteúdo &quot;dezipado&quot;</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">zip</span> <span style="color: #660033;">-r</span> ..<span style="color: #000000; font-weight: bold;">/</span>com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar .<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># e faça o zip de novo com o mesmo nome do jar</span>
&nbsp;
$ <span style="color: #7a0874; font-weight: bold;">cd</span> .. <span style="color: #666666; font-style: italic;"># volte um nível</span>
&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">cp</span> com.sun.enterprise.jst.server.sunappsrv_1.0.16.jar <span style="color: #007800;">$ECLIPSE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #666666; font-style: italic;"># e copie o novo jar para a pasta de plugins do Eclipse</span></pre></div></div>

<p>Ao abrir o Eclipse de novo, na versão b37, o projeto não sentirá mais falta de bibliotecas. Voltando&#8230;</p>
<p>No <a href="http://www.objectzilla.com.br/2009/02/15/aprenda-java-ee-6-agora/">post anterior</a>, fizemos uma aplicação já utilizando os recursos do EJB Lite. Porém, faltava alguma coisa para persistir os objetos.</p>
<p>No teste, instanciava-se ali mesmo os objetos necessários e jogava-os no método marcaConsulta(). Porém, num caso real, os objetos precisariam existir muito antes, armazenados num meio persistente (na maioria das vezes, em um banco de dados relacional). A prática corrente é encapsular essa obtenção de objetos do meio persistente através do DAO (Data Access Object, ou objeto de acesso aos dados). Nessa aplicação, seguiremos a prática de separar a interface da implementação, e chamarei a interface de <strong>.*Repository</strong> e a classe que a implementa de <strong>.*DAO</strong>. Usarei EJB Lite também para a implementação de persistência.</p>
<p>Aquele primeiro teste será modificado para buscar os objetos do repositório. Estaremos utilizando o JMock para simular o DAO, pois, além de não termos uma fonte de dados real (por enquanto), testes que dependem de recursos externos perdem a confiabilidade. Melhor fazer um stub e ter certeza que traz o resultado esperado</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Calendar</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jmock.Expectations</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jmock.Mockery</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.jmock.integration.junit4.JUnit4Mockery</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Assert</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoTeste <span style="color: #009900;">&#123;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> pacienteMarcaHoraComMedico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		Mockery context = <span style="color: #000000; font-weight: bold;">new</span> JUnit4Mockery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ajustando o repositório de paciente</span>
		<span style="color: #000000; font-weight: bold;">final</span> PacienteRepositorio pacienteRep =  context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>PacienteRepositorio.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>
			Paciente paciente = <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			paciente.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Maria&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			oneOf <span style="color: #009900;">&#40;</span>pacienteRep<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span>32L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> will<span style="color: #009900;">&#40;</span>returnValue<span style="color: #009900;">&#40;</span>paciente<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ajustando o repositório de médico</span>
		<span style="color: #000000; font-weight: bold;">final</span> MedicoRepositorio medicoRep = context.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>MedicoRepositorio.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		context.<span style="color: #006633;">checking</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Expectations<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span>
			Medico medico = <span style="color: #000000; font-weight: bold;">new</span> Medico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			medico.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dr. Gregory House&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			oneOf <span style="color: #009900;">&#40;</span>medicoRep<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>4L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> will<span style="color: #009900;">&#40;</span>returnValue<span style="color: #009900;">&#40;</span>medico<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// um paciente...</span>
		Paciente paciente = pacienteRep.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span>32L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// um médico...</span>
		Medico medico = medicoRep.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>4L<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ambos agendam um horário</span>
		Agendamento agendamento = <span style="color: #000000; font-weight: bold;">new</span> AgendamentoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">Calendar</span> horario = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2009</span>, <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MARCH</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">17</span>, 00, 00<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medico, paciente, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// agora, médico tem consulta com paciente marcada às 5</span>
		Paciente pacienteMarcado = medico.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>paciente.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, pacienteMarcado.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Tanto MedicoRepositorio quanto PacienteRepositorio são interfaces (mais tarde, criarei as implementações). Ao criá-las, o teste já é executado com sucesso.</p>
<p>Agora chegou a hora de refatorar. Repare que o teste, do jeito que está, é imbecil. Os mocks apenas complicaram a obtenção de objetos e, se deixasse como antes, seria a mesma coisa! Mas eu fiz essa alteração para um próximo passo: os repositórios não serão mais chamados pelo meu teste, mas pelo método marcaConsulta(), que receberia apenas os ids de médico e paciente. E como consequência, os mocks servirão para indicar que os métodos dos repositórios realmente são chamados. Veja como fica:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">		<span style="color: #666666; font-style: italic;">// ajustando o repositório de paciente (omitido, pois é como era antes)</span>
		<span style="color: #666666; font-style: italic;">// ajustando o repositório de médico (omitido, pois é como era antes)</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// id de paciente e médico</span>
		<span style="color: #006600; font-weight: bold;">long</span> pacienteId = 32L<span style="color: #339933;">;</span>
		<span style="color: #006600; font-weight: bold;">long</span> medicoId = 4L<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// cria um agendamento, passando os repositórios como parâmetro</span>
		Agendamento agendamento<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#123;</span>
			AgendamentoImpl impl = <span style="color: #000000; font-weight: bold;">new</span> AgendamentoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			impl.<span style="color: #006633;">setPacienteRepositorio</span><span style="color: #009900;">&#40;</span>pacienteRep<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			impl.<span style="color: #006633;">setMedicoRepositorio</span><span style="color: #009900;">&#40;</span>medicoRep<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			agendamento = impl<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// cria um horário para a consulta</span>
		<span style="color: #003399; font-weight: bold;">Calendar</span> horario = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2009</span>, <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MARCH</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">17</span>, 00, 00<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medicoId, pacienteId, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// verifica se os métodos definidos no mock foram realmente chamados</span>
		context.<span style="color: #006633;">assertIsSatisfied</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// agora, médico tem consulta com paciente marcada às 5</span>
		Paciente pacienteMarcado = medicoRetornado.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>pacienteRetornado.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, pacienteMarcado.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Tente executar até que fique com sucesso. Se quiser, dentro do método marcaConsulta(), ao invés de pegar os objetos dentro dos repositórios, crie novos objetos Medico e Paciente. Vai dar erro, porque foi adicionado no teste a instrução <em>context.assertIsSatisfied()</em>, que garante que os métodos definidos no mock sejam realmente chamados por apenas uma vez (e dê erro caso contrário).</p>
<p>Existe ainda mais uma oportunidade de teste: o que acontece quando eu uso um identificador para um objeto que não existe? Deveria lançar exceção, mas, atualmente, a assinatura do método dos repositórios não possui qualquer sinalização disso. Farei também um teste para o caso de não achar objetos. Mas nesse caso, não mostrarei aqui, estando apenas no <a href="http://github.com/leonardoverissimo/javaee-6-application/tree/master">meu GitHub</a>.</p>
<p>Chegou a hora da verdade, como fazer os façades existentes se tornarem Session Beans? Simples, com anotações! Primeiro, as interfaces de repositório:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> MedicoRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	Medico getMedico<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> MedicoNaoEncontradoException<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> PacienteRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	Paciente getPaciente<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> PacienteNaoEncontradoException<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A implementação do Session Bean Agendamento possui agora as dependências com os repositórios:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Stateless
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoImpl <span style="color: #000000; font-weight: bold;">implements</span> Agendamento <span style="color: #009900;">&#123;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> marcaConsulta<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> medicoId, <span style="color: #006600; font-weight: bold;">long</span> pacienteId, <span style="color: #003399; font-weight: bold;">Calendar</span> horario<span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">throws</span> PacienteNaoEncontradoException, MedicoNaoEncontradoException <span style="color: #009900;">&#123;</span>
		Paciente paciente = pacienteRepositorio.<span style="color: #006633;">getPaciente</span><span style="color: #009900;">&#40;</span>pacienteId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Medico medico = medicoRepositorio.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>medicoId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		medico.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>paciente, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		medicoRepositorio.<span style="color: #006633;">salvaConsultaMedico</span><span style="color: #009900;">&#40;</span>medico<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setPacienteRepositorio<span style="color: #009900;">&#40;</span>PacienteRepositorio pacienteRep<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		pacienteRepositorio = pacienteRep<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> setMedicoRepositorio<span style="color: #009900;">&#40;</span>MedicoRepositorio medicoRep<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		medicoRepositorio = medicoRep<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> PacienteRepositorio pacienteRepositorio<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> MedicoRepositorio medicoRepositorio<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Na implementação dos repositórios, ainda não colocarei a persistência com o banco de dados. Ao invés disso, deixarei os objetos em memória. Numa situação como essa, esse lugar da memória deveria ser o único em toda a aplicação, ou seja, <em>singleton</em>. Até agora, <em>singletons</em> deveriam ser feitos à mão; na próxima versão, será possível usar EJB, bastando uma anotação, veja:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Singleton
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MedicoDAO <span style="color: #000000; font-weight: bold;">implements</span> MedicoRepositorio <span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Isso é ainda uma demonstração, quando eu usar um banco de dados de verdade, voltarei a usar <strong>@Stateless</strong>. De fato, não é porque existe <strong>@Singleton</strong> que você sempre deve usá-lo porque, com essa anotação, as chamadas aos métodos serão serializadas (não ocorre execução em paralelo), reduzindo sensivelmente a escalabilidade. Portanto, use como último recurso. O código completo do DAO, você vê no <a href="http://github.com/leonardoverissimo/javaee-6-application/tree/master">meu GitHub</a>.</p>
<p>Acabou? Nããããããooo! Vamos imaginar como seria uma tela de agendamento:<br />
- Mostra-se uma lista de médicos, uma lista de pacientes e pede-se um horário de consulta.<br />
- O usuário marca a consulta.<br />
- Mostra-se a consulta marcada.</p>
<p>Três coisas que falta nos DAOs, uma busca por lista de médicos, outra para lista de pacientes, e um método que salva a consulta. Farei os três métodos:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> PacienteRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	Paciente getPaciente<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> PacienteNaoEncontradoException<span style="color: #339933;">;</span>
&nbsp;
	List<span style="color: #339933;">&lt;</span>Paciente<span style="color: #339933;">&gt;</span> todosPacientes<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> MedicoRepositorio <span style="color: #009900;">&#123;</span>
&nbsp;
	Medico getMedico<span style="color: #009900;">&#40;</span><span style="color: #006600; font-weight: bold;">long</span> id<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> MedicoNaoEncontradoException<span style="color: #339933;">;</span>
&nbsp;
	List<span style="color: #339933;">&lt;</span>Medico<span style="color: #339933;">&gt;</span> todosMedicos<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #006600; font-weight: bold;">void</span> salvaConsultaMedico<span style="color: #009900;">&#40;</span>Medico medico<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No teste, adicionarei também a exigência do método de <em>marcarConsulta()</em> salvar a consulta do médico. Mas, pra variar, não vou mostrar. (Se você estiver atento, faltou o conceito de Consulta, que está escondido como um atributo do médico. Numa próxima oportunidade, antes de adicionar qualquer outra funcionalidade, criarei esse tipo.)</p>
<p>Vamos às páginas web! Usarei Servlets e JSPs. A primeira página pega todos os pacientes e todos os médicos e exibe uma tela para digitar o horário da consulta. Seguindo o MVC, temos o Servlet agindo como Controller:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@WebServlet<span style="color: #009900;">&#40;</span>value=<span style="color: #0000ff;">&quot;/agendaForm&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendaFormServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #006600; font-weight: bold;">long</span> serialVersionUID = -7874706688461756994L<span style="color: #339933;">;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399; font-weight: bold;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// obtém médicos</span>
		List<span style="color: #339933;">&lt;</span>Medico<span style="color: #339933;">&gt;</span> medicos = medicoRepositorio.<span style="color: #006633;">todosMedicos</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		req.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;medicos&quot;</span>, medicos<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// obtém pacientes</span>
		List<span style="color: #339933;">&lt;</span>Paciente<span style="color: #339933;">&gt;</span> pacientes = pacienteRepositorio.<span style="color: #006633;">todosPacientes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		req.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pacientes&quot;</span>, pacientes<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// passa para uma página jsp</span>
		req.<span style="color: #006633;">getRequestDispatcher</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/WEB-INF/agendaForm.jsp&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">forward</span><span style="color: #009900;">&#40;</span>req, resp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> MedicoRepositorio medicoRepositorio<span style="color: #339933;">;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> PacienteRepositorio pacienteRepositorio<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Não se deveria haver duas chamadas ao model dentro de um controller. Mas nesse caso, não consigo imaginar uma situação melhor. Acho muito burocrático fazer um método que retorna um DTO contendo as listas de Medico e Paciente; além do nome do método resultante não ter uma boa abstração (ou você acha que <strong>listaMedicoEPaciente()</strong> é um nome bom?). E não consigo achar um jeito de usar apenas um objeto raiz, onde os outros seriam obtidos através deste; a relação entre Medico e Paciente ainda vai ser criada, ela não existe no momento de carregar o formulário. Portanto, deixarei assim mesmo.</p>
<p>A view não possui nada de novo em relação às versões anteriores:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">	<span style="color: #009900;">&lt;jsp:useBean <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;medicos&quot;</span> <span style="color: #000066;">scope</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;request&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;java.util.List&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
	<span style="color: #009900;">&lt;jsp:useBean <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;pacientes&quot;</span> <span style="color: #000066;">scope</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;request&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;java.util.List&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;POST&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;marcaConsulta&quot;</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Selecione o m<span style="color: #ddbb00;">&amp;eacute;</span>dico:
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;medicoId&quot;</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0&quot;</span>&gt;</span>M<span style="color: #ddbb00;">&amp;eacute;</span>dicos<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
			<span style="color: #009900;">&lt;c:forEach items<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${medicos}&quot;</span> var<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;medico&quot;</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${medico.id}&quot;</span>&gt;</span>${medico.nome}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>c:forEach&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">select</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Selecione o paciente:
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">select</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;pacienteId&quot;</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;0&quot;</span>&gt;</span>Pacientes<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
			<span style="color: #009900;">&lt;c:forEach items<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${pacientes}&quot;</span> var<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;paciente&quot;</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">option</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${paciente.id}&quot;</span>&gt;</span>${paciente.nome}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">option</span>&gt;</span>
			<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>c:forEach&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">select</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
		Dia: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dia&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span><span style="color: #66cc66;">/</span>&gt;</span>
		Hora: <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hora&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10&quot;</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">br</span><span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Marcar Consulta&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<p>O conteúdo será enviado à ação marcaConsulta, que será feita através da alteração do antigo Servlet AgendamentoServlet:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.PrintWriter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.text.DateFormat</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Calendar</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Date</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.ejb.EJB</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.ServletException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.annotation.WebServlet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServlet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServletRequest</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServletResponse</span><span style="color: #339933;">;</span>
&nbsp;
@WebServlet<span style="color: #009900;">&#40;</span>value <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/marcaConsulta&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>1218896541620785877L<span style="color: #339933;">;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> Agendamento agendamento<span style="color: #339933;">;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doPost<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">long</span> medicoId <span style="color: #339933;">=</span> <span style="color: #003399;">Long</span>.<span style="color: #006633;">parseLong</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;medicoId&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">long</span> pacienteId <span style="color: #339933;">=</span> <span style="color: #003399;">Long</span>.<span style="color: #006633;">parseLong</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pacienteId&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">DateFormat</span> dateFormat <span style="color: #339933;">=</span> <span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">getDateTimeInstance</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">SHORT</span>,
					<span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">SHORT</span>, req.<span style="color: #006633;">getLocale</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">String</span> horario <span style="color: #339933;">=</span> req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;dia&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; &quot;</span> <span style="color: #339933;">+</span> req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hora&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">Date</span> date <span style="color: #339933;">=</span> dateFormat.<span style="color: #006633;">parse</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">Calendar</span> cal <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getLocale</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			cal.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>date<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// chamando método de agendamento</span>
			agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medicoId, pacienteId, cal<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			resp.<span style="color: #006633;">sendRedirect</span><span style="color: #009900;">&#40;</span>resp.<span style="color: #006633;">encodeRedirectURL</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;consulta?medicoId=&quot;</span> <span style="color: #339933;">+</span> medicoId
					<span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;&amp;horario=&quot;</span> <span style="color: #339933;">+</span> horario<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">PrintWriter</span> out <span style="color: #339933;">=</span> resp.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			out.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Você fez alguma coisa de errado!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Dessa vez, apaguei o <strong>doGet()</strong> e coloquei a ação de salvar a consulta em um <strong>doPost()</strong>. Realizei um redirect em um outro Servlet que faz a consulta de horários.</p>
<p>Servlet:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.PrintWriter</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.text.DateFormat</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Calendar</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Date</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.ejb.EJB</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.ServletException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.annotation.WebServlet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServlet</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServletRequest</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.servlet.http.HttpServletResponse</span><span style="color: #339933;">;</span>
&nbsp;
@WebServlet<span style="color: #009900;">&#40;</span>value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;/consulta&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConsultaServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 8084899967543431263L<span style="color: #339933;">;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">long</span> medicoId <span style="color: #339933;">=</span> <span style="color: #003399;">Long</span>.<span style="color: #006633;">parseLong</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;medicoId&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			Medico medico <span style="color: #339933;">=</span> medicoRep.<span style="color: #006633;">getMedico</span><span style="color: #009900;">&#40;</span>medicoId<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">DateFormat</span> df <span style="color: #339933;">=</span> <span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">getDateTimeInstance</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">SHORT</span>, <span style="color: #003399;">DateFormat</span>.<span style="color: #006633;">SHORT</span>, req.<span style="color: #006633;">getLocale</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #003399;">Date</span> d <span style="color: #339933;">=</span> df.<span style="color: #006633;">parse</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;horario&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #003399;">Calendar</span> horario <span style="color: #339933;">=</span> <span style="color: #003399;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getLocale</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			horario.<span style="color: #006633;">setTime</span><span style="color: #009900;">&#40;</span>d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			req.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;horario&quot;</span>, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			Paciente paciente <span style="color: #339933;">=</span> medico.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>paciente <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				paciente <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				paciente.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;(ninguém)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			req.<span style="color: #006633;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;paciente&quot;</span>, paciente<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			req.<span style="color: #006633;">getRequestDispatcher</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/WEB-INF/consulta.jsp&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">forward</span><span style="color: #009900;">&#40;</span>req, resp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">PrintWriter</span> out <span style="color: #339933;">=</span> resp.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			out.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Você fez alguma coisa de errado!&lt;br/&gt;&lt;br/&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span>out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> MedicoRepositorio medicoRep<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E JSP:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">	<span style="color: #009900;">&lt;jsp:useBean <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;paciente&quot;</span> <span style="color: #000066;">scope</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;request&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;br.com.objectzilla.agendamedica.Paciente&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
	<span style="color: #009900;">&lt;jsp:useBean <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;horario&quot;</span> <span style="color: #000066;">scope</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;request&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;java.util.Calendar&quot;</span><span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Data: <span style="color: #009900;">&lt;fmt:formatDate <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;${horario.time}&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;both&quot;</span> dateStyle<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;long&quot;</span> timeStyle<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;medium&quot;</span><span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>Paciente: ${paciente.nome}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;agendaForm&quot;</span>&gt;</span>De novo<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></div></div>

<p>Você pode agora digitar http://localhost:8080/AgendaMedica/agendaForm no seu browser e inserir uma consulta qualquer. Ao fazer a submissão, uma nova página será exibida, cuja URL tem parâmetros de <em>medicoId</em> e <em>horario</em>. Mude esses parâmetros e você verá que, em horários que você não marcou horário, aparece <em>(ninguém)</em> como paciente.</p>
<p>Faltam coisas ainda. A agenda permite horários esdrúxulos, como agendamento no passado, agendamento fora do horário comercial, agendamento de dois pacientes com um minuto de intervalo, e sobreposição de horário. Precisamos resolver todas essas validações. E outra, precisamos criar a classe Consulta, pois não faz sentido temos que mudar Médico quando um paciente quer marcar um dia. E seria bem melhor também, fazer as páginas web com algum framework. JSF 2.0 seria uma ótima pedida.</p>
<p>Mas tudo isso num próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/02/24/aprenda-java-ee-6-agora-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aprenda Java EE 6, agora!</title>
		<link>http://www.objectzilla.com.br/2009/02/15/aprenda-java-ee-6-agora/</link>
		<comments>http://www.objectzilla.com.br/2009/02/15/aprenda-java-ee-6-agora/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 21:44:53 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=154</guid>
		<description><![CDATA[Quando fiquei craque no Java, a versão do &#8220;Enterprise Edition&#8221; era ainda 1.4. Eu aprendi a versão 5, logo depois do lançamento do Glassfish. Mas agora estou fazendo algo diferente, não vou esperar a versão Java EE 6 sair, vou aprender as coisas tão logo as novidades apareçam.
E você também pode fazer isso. Pegue uma [...]]]></description>
			<content:encoded><![CDATA[<p>Quando fiquei craque no Java, a versão do &#8220;Enterprise Edition&#8221; era ainda 1.4. Eu aprendi a versão 5, logo depois do lançamento do Glassfish. Mas agora estou fazendo algo diferente, não vou esperar a versão Java EE 6 sair, vou aprender as coisas tão logo as novidades apareçam.</p>
<p>E você também pode fazer isso. Pegue <a href="http://download.java.net/glassfish/v3/promoted/">uma versão promoted do Glassfish no site deles</a>, que, assim como o <a href="http://abc.go.com/primetime/lost/index?pn=index">Lost</a>, tem sempre uma versão nova nas quartas à noite, que você baixa na quinta. A última versão, que estou usando nesta semana, é a b36.</p>
<p>Baixe a última versão disponível e descompacte num lugar que você achar apropriado. No Eclipse, na hora de instalar o servidor, basta escolher a opção &#8220;Glassfish v3 Prelude&#8221; (se você não usava Glassfish, na tela de novo servidor há uma opção de baixar os adaptadores para outros servidores). Pronto!</p>
<p>Eu vou fazer uma aplicação de exemplo, que é uma agenda de consultório médico. É babaca, mas tem uma regras óbvias que não dá pra ser tratado com o velho CRUD.</p>
<p>Vamos lá. Crie um &#8220;Dynamic Web Project&#8221; cujo Runtime seja o &#8220;Glassfish v3 Prelude&#8221;, vou chamá-lo de <strong>AgendaMedica</strong>. Não sei como vocês lidam com testes no Eclipse, mas costumo criar um novo projeto Java que referencia o projeto que estou interessado em testar. No caso, criarei também o projeto Java <strong>AgendaMedicaTeste</strong>. Após criado, dê &lt;Alt&gt; + &lt;Enter&gt; sobre o projeto, clique em &#8220;Java Build Path&#8221;, vá na aba &#8220;Projects&#8221; e adicione o projeto AgendaMedica.</p>
<p>No projeto AgendaMedicaTeste, eu já criei um método de testes pra realizar a consulta:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">br.com.objectzilla.agendamedica</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Calendar</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Assert</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.junit.Test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoTeste <span style="color: #009900;">&#123;</span>
&nbsp;
	@Test
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> pacienteMarcaHoraComMedico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// um paciente...</span>
		Paciente paciente = <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		paciente.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Maria&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// um médico...</span>
		Medico medico = <span style="color: #000000; font-weight: bold;">new</span> Medico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		medico.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Dr. Gregory House&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// ambos agendam um horário</span>
		Agendamento agendamento = <span style="color: #000000; font-weight: bold;">new</span> AgendamentoImpl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">Calendar</span> horario = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2009</span>, <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MARCH</span>, <span style="color: #cc66cc;">5</span>, <span style="color: #cc66cc;">17</span>, 00, 00<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medico, paciente, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// agora, médico tem consulta com paciente marcada às 5</span>
		Paciente pacienteMarcado = medico.<span style="color: #006633;">consulta</span><span style="color: #009900;">&#40;</span>horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Assert.<span style="color: #006633;">assertEquals</span><span style="color: #009900;">&#40;</span>paciente.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, pacienteMarcado.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Beleza, mas o código não compila, né? Ora, não seja por isso. Vá criando as classes clicando nos erros com o botão direito do mouse, só não se esqueça de colocar as classes no projeto AgendaMedica. No caso, Agendamento é uma interface e o restante são classes.</p>
<p>Bom, tente rodar o script de teste (clique com botão direito sobre a classe e dê Run As&#8230; > JUnit Test). Vai dar erro, óbvio! Por isso, convido a você a escrever código nas classes até o script rodar com sucesso. Não se preocupe, se você não conseguir ou não tiver paciência, no final do post eu mostro o link onde você pode baixar o código.</p>
<p>Agora, vamos transformar a interface Agendamento em um Stateless Session Bean. Não precisa nem mover pra um projeto próprio, pois agora os EJBs podem ser &#8220;deployados&#8221; em aplicações WAR. Basta adicionar @Local na interface (a v3 ainda não possui suporte a @Remote), assim:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Local
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Agendamento <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E adicionar @Stateless na classe que implementa:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@Stateless
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoImpl <span style="color: #000000; font-weight: bold;">implements</span> Agendamento <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pronto, faça o deploy do projeto web no servidor Glassfish v3 e veja o seguinte log aparecer:</p>
<pre>
INFO: Bound Java:Global name [business view] : java:global/AgendaMedica/AgendamentoImpl#br.com.objectzilla.agendamedica.Agendamento
INFO: Bound Java:Global name [single business view] : java:global/AgendaMedica/AgendamentoImpl
</pre>
<p>Repare em como é realizado o <em>binding</em> com o JNDI. A partir da versão 6, não será mais uma implementação específica de contêiner. Todos os servidores de aplicações, se quiserem ser homologados para Java EE 6, deverão dispor seus EJBs, em contextos JNDI, de acordo com o seguinte padrão:</p>
<p><strong>java:global[/&lt;application-name&gt;]/&lt;module-name&gt;/&lt;bean-name&gt;#&lt;interface-name&gt;</strong></p>
<p>Onde:</p>
<p><strong>&lt;application-name&gt;</strong> é opcional, refere-se ao nome do pacote EAR (não tem no nosso caso).</p>
<p><strong>&lt;module-name&gt;</strong> é o módulo onde está o EJB (<em>AgendaMedica</em>).</p>
<p><strong>&lt;bean-name&gt;</strong> é o nome do bean (<em>AgendamentoImpl</em>).</p>
<p><strong>&lt;bean-name&gt;</strong> é o nome do bean (<em>AgendamentoImpl</em>).</p>
<p><strong>&lt;interface-name&gt;</strong> é o nome completo da interface que implementa o bean (<em>br.com.objectzilla.agendamedica.Agendamento</em>).</p>
<p>O leitor atento deve ter reparado: está sendo feito <strong>dois <em>bindings</em></strong> para o EJB! Isso também faz parte do padrão. Se o bean implementar apenas uma interface, um <em>alias</em> será criado onde o nome da interface não aparece.</p>
<p>Já que criamos o Session Bean, seria interessante se usássemos, não é não? Vamos fazer um Servlet, mas não precisa tomar o susto de configurar o wer.xml, pois basta criar um classe que herde de HttpServlet e adicionar uma anotação de acordo com o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@WebServlet<span style="color: #009900;">&#40;</span>value=<span style="color: #0000ff;">&quot;/agendamento&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399; font-weight: bold;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Após o deploy, basta digitar http://localhost:8080/AgendaMedica/agendamento e você vai ver&#8230; uma tela em branco. Normal, a gente não fez nada mesmo. Agora, vamos preencher o doGet() com uma chamada ao método de marcarConsulta() de agendamento. Eu também injetei uma instância de EJB.</p>

<div class="wp_syntax"><div class="code"><pre class="java5" style="font-family:monospace;">@WebServlet<span style="color: #009900;">&#40;</span>value=<span style="color: #0000ff;">&quot;/agendamento&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AgendamentoServlet <span style="color: #000000; font-weight: bold;">extends</span> HttpServlet <span style="color: #009900;">&#123;</span>
&nbsp;
	@EJB
	<span style="color: #000000; font-weight: bold;">private</span> Agendamento agendamento<span style="color: #339933;">;</span>
&nbsp;
	@<span style="color: #003399; font-weight: bold;">Override</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #006600; font-weight: bold;">void</span> doGet<span style="color: #009900;">&#40;</span>HttpServletRequest req, HttpServletResponse resp<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> ServletException,
			<span style="color: #003399; font-weight: bold;">IOException</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">String</span> nomeMedico = req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;medico&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399; font-weight: bold;">String</span> nomePaciente = req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;paciente&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #006600; font-weight: bold;">int</span> hora = <span style="color: #003399; font-weight: bold;">Integer</span>.<span style="color: #006633;">parseInt</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hora&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// criando médico</span>
		Medico medico = <span style="color: #000000; font-weight: bold;">new</span> Medico<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		medico.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span>nomeMedico<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// criando paciente</span>
		Paciente paciente = <span style="color: #000000; font-weight: bold;">new</span> Paciente<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		paciente.<span style="color: #006633;">setNome</span><span style="color: #009900;">&#40;</span>nomePaciente<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// criando horário</span>
		<span style="color: #003399; font-weight: bold;">Calendar</span> horario = <span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">HOUR</span>, hora<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">MINUTE</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		horario.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">SECOND</span>, <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// chamando método de agendamento</span>
		agendamento.<span style="color: #006633;">marcaConsulta</span><span style="color: #009900;">&#40;</span>medico, paciente, horario<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #003399; font-weight: bold;">PrintWriter</span> pw = resp.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		pw.<span style="color: #006633;">format</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Eu juro que marquei consulta para o paciente %s, com o médico %s, na hora %d.&quot;</span>,
				medico.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, paciente.<span style="color: #006633;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, horario.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #003399; font-weight: bold;">Calendar</span>.<span style="color: #006633;">HOUR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Se você rodar http://localhost:8080/AgendaMedica/agendamento?medico=Jose&#038;paciente=Adolfo&#038;hora=14, vai ver que a aplicação mostra uma mensagem na tela que não diz se foi, ou não foi, feito algo. Precisaria de uma tela de consulta, mas só dá pra fazer isso se nossa aplicação persistisse os objetos entre as requisições, o que atualmente não ocorre.</p>
<p>Vou fazer isso no próximo post, onde apresentarei mais novos recursos e novas funcionalidades na aplicação pra que ela finalmente funcione de verdade.</p>
<p>Quem quiser, pode ir alterando a aplicação por conta própria, deixei no repositório <a href="https://github.com/">GitHub</a> em <a href="http://github.com/leonardoverissimo/javaee-6-application/tree/master">http://github.com/leonardoverissimo/javaee-6-application/tree/master</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/02/15/aprenda-java-ee-6-agora/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Desempenho / Escalabilidade: a última carta dos idiotas</title>
		<link>http://www.objectzilla.com.br/2009/01/12/desempenho-escalabilidade-a-ultima-carta-dos-idiotas/</link>
		<comments>http://www.objectzilla.com.br/2009/01/12/desempenho-escalabilidade-a-ultima-carta-dos-idiotas/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 00:29:55 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=67</guid>
		<description><![CDATA[Meu, hoje, 12/01, quase tive um ataque cardíaco (não, não tive não, é brincadeira). Duas coisas que eu vi, uma na Mundo Java, outra no GUJ, me deixaram com raiva.
Vamos à Mundo Java primeiro que, como sempre, está excelente. Hoje vi só a matéria sobre EJB e Spring (muito boa), porém houve um pequeno trecho [...]]]></description>
			<content:encoded><![CDATA[<p>Meu, hoje, 12/01, quase tive um ataque cardíaco (não, não tive não, é brincadeira). Duas coisas que eu vi, uma na Mundo Java, outra no GUJ, me deixaram com raiva.</p>
<p>Vamos à Mundo Java primeiro que, como sempre, está excelente. Hoje vi só a matéria sobre EJB e Spring (muito boa), porém houve um pequeno trecho que me deixou de estômago embrulhado (ênfases são minhas):</p>
<blockquote><p><strong>Anti-pattern em injeção de dependência</strong><br />
Com a facilidade e praticidade do EJB 3.0, alguns desenvolvedores acabam deixando de lado a preocupação com a escalabilidade e gerenciamento de recursos do container, anotando toda e qualquer classe do sistema para se beneficiar da injeção de dependência. <strong>Isso não é uma boa prática porque cada objeto anotado com @Stateless existirá um novo recurso para ser gerenciado pelo servidor de aplicações.</strong></p>
<p>Um exemplo prático dessá má utilização de injeção de dependências no ambiente EJB <strong>é a implementação do design pattern Data Access Object (DAO) como um EJB</strong>. Dependendo do design do software, cada funcionalidade do sistema irá conter um DAO e essa funcionalidade será um Session Bean para se beneficiar do recurso de injeção de dependência do servidor de aplicações. Para evitar esse problema, <strong>uma solução seria injetar o EntityManager diretamente nos session beans, por meio da anotação @PersistenceContext, ou utilizar o design pattern Abstract Factory.</strong>
</p></blockquote>
<p>Primeiro, vamos à bronca: você não está programando em C, nem precisa ouvir os malucos que programam nessa linguagem. Fim da bronca.</p>
<p>Segundo, existe dois problema na definição de um Stateless Session Bean (SLSB): um que a anotação não é sobre o objeto (isso ainda não existe na linguagem), mas na classe; e dois que, quando você cria um SLSB, não há a criação de um recurso, mas de váááários recursos em pool. Se você olhar na configuração do Glassfish, verá que por default é possível ter até 1024 instâncias de SLSB no pool.</p>
<p>Terceiro, sabe qual a justificativa para isso ser um anti-pattern? Escalabilidade, só isso! Não é problema de code smell, de código que gera resultados imprevisíveis, de problemas de manutenção&#8230;, nem nada! Simplesmente ES-CA-LA-BI-LI-DA-DE! Agora, o pool de instâncias de SLSB não existe para se ganhar escalabilidade? Se tiver problemas com isso, vai nas configurações de seu servidor e mude os parâmetros do container EJB! Outra solução é comprar mais memória ou, se for mais sério, fazer <em>load balance</em> de mais de um servidor.</p>
<p>Pior ainda, a alternativa ao &#8220;anti-pattern&#8221; é &#8220;injetar o EntityManager diretamente nos session beans&#8221;, o que fatalmente acarretaria códigos macarrônicos com métodos gigantescos e difíceis de ler. Ou então, &#8220;[utilize] o design pattern Abstract Factory&#8221; que, pelo que já vi usado no contexto do EJB, é <a href="http://desciclo.pedia.ws/wiki/POG">POG!</a>; pois é usado um único EJB para o Factory, que devolveria os DAOs necessários, que por sua vez, tem código muito mais idiota para se pegar o EntityManager do que se fosse feito por SLSB!</p>
<p>Gente, use SLSB para DAO também! Que mal há nisso? Escalabilidade não é! Acho que no fundo, as pessoas sentem saudades do tempo em que cada camada tinha seu framework, tipo: era Struts para a apresentação, EJB para a camada de negócio, Hibernate para a persistância&#8230; Hoje estamos se aproximando da era onde os SLSB podem ser usados até na camada de apresentação (<a href="http://www.seamframework.org/">Seam / Web Beans</a>)! E ninguém passou a escrever código horrível por causa disso! Por que raios ainda ficar nesse pensamento?</p>
<hr/>
<p>Vamos ao tópico do GUJ, maldito! (Não você que é maldito! O tópico!) (<a href="http://www.guj.com.br/posts/list/114680.java">link</a>) O cara parecia que quer defender com unhas e dentes que usar static é melhor que criar instâncias, polimorfismo&#8230;, enfim, essa coisa linda que é o OO.</p>
<p>Bom, o que sei é que usar static a torto e a direito no Java EE dá merda, pois é um static por class loader, e os servidores de aplicações possuem vários class loaders, cada um com potencialidade de carregar a classe e ter seu próprio static. Segundo, que com métodos static não dá pra fazer muita coisa que o Java EE oferece (EJB, por exemplo). Terceiro, que é idiota mesmo, coisa de gente que não sabe OO.</p>
<p>Agora, sabe a justificativa para usar static? O cara acredita que é mais rápido, simplesmente isso! Quer dizer, dava muito bem pra gerar um código bom, usando OO, e comprar uma máquina de configuração muito boa. Muito melhor do que se matar em otimizações minúsculas de veracidade duvidosa.</p>
<p>Aliás, vou dar um <em>guideline</em> para se fazer otimizações:</p>
<p><strong>1.</strong> Pergunte ao cliente se está achando o sistema lento. Se a resposta for não, fim do guideline.</p>
<p><strong>2.</strong> A compra de mais memória, mais disco ou mais blade custa menos que o pagamento de uma equipe de desenvolvedores? Se sim, vá na Santa Efigênia e fim de guideline.</p>
<p><strong>3.</strong> Meça a duração usando vários casos possíveis.</p>
<p><strong>4.</strong> Faça a alteração e meça de novo.</p>
<p><strong>5.</strong> Se a nova medida não for muito menor que a medida antiga, jogue suas alterações no lixo e volte ao passo 4.</p>
<p><strong>6.</strong> Caso contrário, comite a alteração e dê por encerrado (por enquanto).</p>
<hr/>
<p>Os dois casos me deixam perplexos: é como se para se justificar alguma coisa que não sabe bem o porquê, ao invés de ir mais a fundo e pesquisar, diz-se apenas que a altenativa &#8220;ruim&#8221; tem problemas de desempenho ou escalabilidade! Simples assim! E esquece que esses dois tipos de problemas está mais relacionado à arquitetura, à característica do sistema, ao &#8220;conjunto da obra&#8221; e muito pouco sobre a tecnologia ou o paradigma em si. Por muito escarcéu, muita gente escolhe o Barrabás.</p>
<p>Agora, por que as pessoas usam o argumento do desempenho / escalabilidade? Tenho duas teorias:</p>
<p>1. Alguns programadores aprenderam apenas uma determinada tecnologia em sua carreira. Quando esta tecnologia começa a sumir, eles passam a ter um certo desdém pelo novo, classificando pelos mais variados adjetivos. Alguns deles simplesmente não colam. Porém, o que, às vezes, fica marcado, é dizer que tal coisa <em>não tem desempenho</em> ou <em>não tem escalabilidade</em>, e por uma única razão: é difícil provar a menos que se meça com os próprios olhos. E como muita gente não faz isso, fica-se no benefício da dúvida.</p>
<p>2. Alguns programadores trabalham em ambientes péssimos de trabalho, a principal é a ausência de decisão e autonomia. Normalmente, as decisões são concentradas em pouquíssimas pessoas, e que nem sempre são as mais qualificadas. Os &#8220;artefatos&#8221; que saem das mãos dessas pessoas são os famosos diagramas de UML, bastando o programador codificar. (O mais imbecil nisso é que os &#8220;eleitos&#8221; escrevem diagramas tão detalhados que poderiam ter feito o negócio direto em código, e que haveria <em>a mesma </em>abstração. Mas não fazem código porque delegar essa atividade pra alguém é a melhor maneira de camuflar seus próprios erros.) E como o programador não tem a liberdade necessária para fazer seu trabalho, só lhe resta uma coisa intelectual para fazer: otimizar. Pena que será imperceptível para os olhos dos outros. Pena que o próximo a dar manutenção será ele mesmo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/01/12/desempenho-escalabilidade-a-ultima-carta-dos-idiotas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Entre exceção checada e não-checada&#8230; fique com os dois!</title>
		<link>http://www.objectzilla.com.br/2009/01/10/entre-excecao-checada-e-nao-checada/</link>
		<comments>http://www.objectzilla.com.br/2009/01/10/entre-excecao-checada-e-nao-checada/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 21:46:59 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[checada]]></category>
		<category><![CDATA[exceção]]></category>
		<category><![CDATA[não-checada]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=26</guid>
		<description><![CDATA[Já viu aquelas discussões no Reddit ou GUJ sobre usar ou não exceções checadas? Sempre tem uns proponentes e oponentes defendendo um jeito ou de outro. Invariavelmente, a discussão não dá em nada. Primeiro porque não é uma questão de escolher um jeito e usá-lo por todo o sistema. Segundo porque, já que isso existe, [...]]]></description>
			<content:encoded><![CDATA[<p>Já viu aquelas discussões no <a href="http://www.reddit.com/r/programming/">Reddit</a> ou <a href="http://www.guj.com.br/">GUJ</a> sobre usar ou não exceções checadas? Sempre tem uns proponentes e oponentes defendendo um jeito ou de outro. Invariavelmente, a discussão não dá em nada. Primeiro porque não é uma questão de escolher um jeito e usá-lo por todo o sistema. Segundo porque, já que isso existe, a menos que você queira mudar pra C#, você é obrigado a conviver.</p>
<p>Se eu tivesse a oportunidade, do tipo, sei lá: viesse um cara, chamado James e me dissesse:</p>
<blockquote><p>Leo, seguinte, eu tô a fim de fazer uma nova linguagem aí e, sei lá, achei interessante forçar o tratamento de exceções pra que ninguém esquecesse de tratá-lo, tipo uma exceção checada. O que você acha?</p></blockquote>
<p>Minha resposta:</p>
<blockquote><p>Horrível!</p></blockquote>
<p>Sim, existe um limite prático pra tipagens verificadas por compilador, o aumento da complexidade. Isso certamente acaba complicando mais pra quem começa na linguagem. Mas enfim, já que não me consultaram&#8230;. o melhor é usá-las, e usá-las com sabedoria.</p>
<blockquote><p>Mas Leo, como seria?</p></blockquote>
<p>Boa pergunta. Uma definição legal é do livro Effective Java, que diz, na página 244:</p>
<blockquote><p>&#8230; use checked exceptions for conditions from which the caller can reasonably be expected to recover&#8230; use runtime exceptions to indicate programming errors&#8230;</p></blockquote>
<p>Lendo essas duas definições, pode parecer confuso, veja o que alguém poderia pensar: &#8220;Exceção checada só ocorre quando há erros de programação. Nunca cometo erros, logo sempre usarei exceções checadas!&#8221;</p>
<p>Não, não e NÃO!!!</p>
<p>Pra entender o que é um erro de programa, você deveria entender que os métodos de seus objetos só podem ser executados se determinadas pré-condições sejam satisfeitas. O problema é que miuta gente também nunca ouviu falar em pré e pós-condições. E dos que ouviram, aplicam de um jeito errado. Meu, vou contar uma história: uma vez eu estava vendo um &#8220;documento&#8221; de &#8220;caso de uso&#8221; e lá tinha a seção &#8220;pós-condições&#8221;. Em todas as vezes, juro, em <strong>TODAS</strong> as vezes, estava escrito: &#8220;Pós-condição: caso de uso executado com sucesso.&#8221;. O que?! Significa que é uma condição <em>sine qua non</em> de que <strong>NUNCA</strong> vai dar falha?</p>
<p>Vamo lá: pré-condição e pós-condição refere-se ao <em>mundo externo</em> do método (ou do fluxo ou do processo, depende do seu ponto de vista). Pré é como o estado do &#8220;mundo&#8221; deve estar antes da execução. Pós é como o &#8220;mundo&#8221; irá ficar.</p>
<p>Exemplo: um método de inserção. A pré-condição é de que o objeto exista e que seja de um tipo específico. A pós-condição é que no banco existirá um registro a mais, ou ficará como antes (em caso de erro).</p>
<p>E se eu chamar o método e a pré-condição não estiver sido respeitada? Erro! O método nem é chamado. E se a pós-condição não for respeitada? Erro também! O sistema, pelo menos, deve voltar ao estado anterior da execução.</p>
<p>Claro que isso não é implementado nativamente nas linguagens mais populares, nem nas mais-ou-menos populares. Em Java, por causa disso, você trata as pré-condições usando exceções. (As pós poderiam ser a captura de exceções de outros métodos que o método chama.) E como violação de pré-condição é um erro, você usa <strong>exceção não-checada</strong>, pois esta deve ser usada em caso de erros de programa.</p>
<p>Quer ver um exemplo de onde se usa exceção não-checada como violação de pré-condição? HttpServletResponse! Existe uma condição que é o seguinte: uma vez aberto um OutputStream ou um Writer, <em>não</em> se pode abrir um outro stream, nem executar um forward. O que acontece quando alguém, &#8220;sem querer&#8221;, comete <del datetime="2009-01-05T23:20:15+00:00">essa cagada</del> esse erro?</p>
<p>É lançada <a href="http://java.sun.com/javaee/5/docs/api/javax/servlet/ServletResponse.html#getOutputStream()">uma exceção não-checada</a>, a IllegalStateException.</p>
<p>Como guia: use exceções não-checadas quando o chamador tem meios de checar se os parâmetros ou o estado do objeto estão corretos antes da execução do método (claro, não é uma ciência exata, podem haver, err&#8230;, exceções). No caso acima, a pessoa poderia muito bem verificar se, no Response, é possível criar um novo fluxo chamando o método isCommitted().</p>
<p>E quando usar exceções <em>checadas</em>? Existem casos em que o método não tem qualquer meio de verificar determinada pré-condição, ou tem mas o meio de verificar é praticamente a própria execução do método. O chamador então deve se arriscar chamando o método, e este deve dizer depois se deu certo ou não, lançando exceção, checada!</p>
<p>Exemplo: método <a href="http://java.sun.com/javase/6/docs/api/java/text/DateFormat.html#parse(java.lang.String)">parse() de DateFormat</a>, que vai pegar uma String, e devolver a representação dela como um Date. Repare que é lançando exceção checada ParseException caso a String não seja uma data. Por que exceção checada? Porque verificar se uma String é realmente uma data não é tarefa trivial, não dando pra contar com uma verificação prévia antes da execução do método. Por outro lado, <a href="http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String)">parseInt() da classe Integer</a> não lança exceção checada, pois é possível facilmente verificar se uma String contém somente números.</p>
<p>Outro exemplo são os métodos <a href="http://java.sun.com/javase/6/docs/api/java/io/BufferedWriter.html#write(char[],%20int,%20int)">write() de BufferedWriter</a> ou <a href="http://java.sun.com/javase/6/docs/api/java/sql/Connection.html#prepareStatement(java.lang.String)">prepareStatement() de Connection</a> que lançam exceções checadas por uma razão simples: nem o chamador nem o método tem a mínima noção se o sistema de arquivos ou o banco de dados está em condições de realizar a ação desejada (e verificar isso pode resultar em outra exceção!).</p>
<p>Como guia: use exceções checadas quando o chamador precisa tomar uma &#8220;rota alternativa&#8221; após o método ser chamado, pois não dá pra evitar o pior antes.</p>
<p>Uma outra coisa, nem sempre dá pra saber a priori se determinada exceção deveria ser checada ou não. Se você criou uma exceção checada, mas seus chamadores não fazem outra coisa a não ser <em>relançar</em> a exceção ou fazer o log dele, é porque você <strong>tem</strong> que converter a exceção checada em exceção não checada! Exceções checadas é para quando o chamador precisa tomar uma atitude a respeito. Se nenhum chamador precisou fazer isso, é porque, muito provavelmente, a exceção nunca precisaria ser tratada e o lançamento dela significa simplemente um erro de programa.</p>
<p>Outra coisa, exceções precisam ter nomes significativos. Evite as famosas <em>&#8220;exceções arquiteturais&#8221;</em> ou <em>&#8220;exceções de camadas&#8221;</em>, que você identifica por DaoException, BusinessException, ApplicationException ou NomeDaEmpresaException. Todas elas não dão significado ao erro que ocorreu e o programador certamente não irá tratá-las adequadamente, pois não tem a mínima idéia do que fazer, dada a ausência de informações contidas nessa exceção.</p>
<p>E evite criar novas exceções quando existem algumas delas já prontas pra você, como é o caso de <a href="http://java.sun.com/javase/6/docs/api/java/lang/NullPointerException.html">NullPointerException</a> (sim, se você receber um parâmetro nulo, não há problema nenhum em <strong>você</strong> lançar essa exceção, colocando uma mensagem talvez), <a href="http://java.sun.com/javase/6/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException</a> ou <a href="http://java.sun.com/javase/6/docs/api/java/lang/IllegalStateException.html">IllegalStateException</a>. Elas não são exclusivas das bibliotecas Java, nem são exceções reservadas. Use-as quando for o caso.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/01/10/entre-excecao-checada-e-nao-checada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Closure: em C++ (?)</title>
		<link>http://www.objectzilla.com.br/2009/01/07/closure-em-cpp/</link>
		<comments>http://www.objectzilla.com.br/2009/01/07/closure-em-cpp/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 00:44:39 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=29</guid>
		<description><![CDATA[Esse post é uma continuação da série Closure.
C++ tem closure? Como assim? Viajou, né? Bom, vou tentar fazer algo, só não sei se vai dar certo. A minha idéia é fazer uma classe Observer onde é possível registrar uma closure. Quando for chamado a função notify() do objeto dessa classe, a closure será chamada e [...]]]></description>
			<content:encoded><![CDATA[<p><em>Esse post é uma continuação da série <a href="http://www.objectzilla.com.br/2009/01/04/voce-sabe-o-que-e-closure/">Closure</a></em>.</p>
<p>C++ tem closure? Como assim? Viajou, né? Bom, vou <em>tentar</em> fazer algo, só não sei se vai dar certo. A minha idéia é fazer uma classe <strong>Observer</strong> onde é possível registrar uma closure. Quando for chamado a função <strong>notify()</strong> do objeto dessa classe, a closure será chamada e esta terá inclusive referencia de um contexto que não existe pro objeto Observer.<span id="more-29"></span></p>
<p>Primeiro, criei a classe <strong>SimpleObserver</strong> (pois só armazena uma closure por vez e não se aproveita de template). Todo o conteúdo do fonte está em um arquivo hpp (simple_observer.hpp):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifndef _SIMPLE_OBSERVER_H_</span>
<span style="color: #339900;">#define _SIMPLE_OBSERVER_H_</span>
&nbsp;
<span style="color: #339900;">#include &lt;boost/function.hpp&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> SimpleObserver <span style="color: #008000;">&#123;</span>
&nbsp;
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #ff0000; font-style: italic;">/* armazena uma função sem parâmetros que retorna void */</span>
        <span style="color: #0000ff;">void</span> registry<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">function</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">void</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> cb<span style="color: #008000;">&#41;</span>     <span style="color: #008000;">&#123;</span> callback <span style="color: #000080;">=</span> cb<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #ff0000; font-style: italic;">/* invoca a função previamente armazenada */</span>
        <span style="color: #0000ff;">void</span> notify<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>                                             <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>callback<span style="color: #008000;">&#41;</span> callback<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    <span style="color: #008000;">&#125;</span>  
&nbsp;
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        boost<span style="color: #008080;">::</span><span style="color: #007788;">function</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">void</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span> callback<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#endif</span></pre></div></div>

<p>Simples, não? Um método pra armazenar uma função, outro pra chamá-lo. Repare que eu usei uma classe do Boost, <strong>function</strong>, que serve para guardar funções de qualquer tipo. No caso limitei para retorno void e nada de parâmetro de entrada. Outra coisa, pra quem não conhece C++, a expressão <strong>if(callback)</strong> parece estranho. O que ocorre é que nessa linguagem, é possível um objeto ser implicitamente convertido pra outro tipo (contanto que o programador escreva a função de conversão, claro!), e, no nosso caso, a biblioteca converte o objeto function pra um outro do tipo bool. &#8220;Mas pra que?&#8221;, você pensa. Bom, é comum um objeto inválido ser sempre convertido como false, e um válido como true; e nesse caso, o objeto é inválido se o objeto function não apontar pra nenhum ponteiro de função.</p>
<p>Agora, vou mostrar a classe que vai criar uma closure, a <strong>Event</strong>, em dois arquivos, a event.hpp</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifndef _EVENT_H_</span>
<span style="color: #339900;">#define _EVENT_H_</span>
&nbsp;
<span style="color: #339900;">#include &lt;map&gt;</span>
<span style="color: #339900;">#include &lt;boost/function.hpp&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Event <span style="color: #008000;">&#123;</span>
&nbsp;
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        <span style="color: #ff0000; font-style: italic;">/* construtor que recebe um número como argumento */</span>
        Event<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">long</span><span style="color: #000040;">&amp;</span> value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #ff0000; font-style: italic;">/* retorna uma função, que leva em consideração o valor de entrada
           e a própria instância */</span>
        boost<span style="color: #008080;">::</span><span style="color: #007788;">function</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">void</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span> create_closure<span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">map</span><span style="color: #000080;">&lt;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">string</span>, <span style="color: #0000ff;">long</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> parameter_value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000ff;">long</span> instance_value<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> this<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>inst_value<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">void</span> callback_function<span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">map</span><span style="color: #000080;">&lt;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">string</span>, <span style="color: #0000ff;">long</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">*</span> param, <span style="color: #0000ff;">long</span> local<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
        <span style="color: #0000ff;">long</span> inst_value<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#endif</span></pre></div></div>

<p>É uma classe que tem um construtor que recebe um valor (daqui a pouco você vai ver que esse valor é atribuído à única variável de instância da classe). A função <strong>create_closure()</strong> retorna uma &#8220;function&#8221; recebendo um map. A função <strong>instance_value()</strong> simplesmente mostra o valor da variável de instância. Existe uma função privada, a <strong>callback_function</strong> que usarei como ponteiro da minha closure.</p>
<p>Vamos à event.cpp:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;event.hpp&quot;</span>
<span style="color: #339900;">#include &lt;boost/bind.hpp&gt;</span>
&nbsp;
Event<span style="color: #008080;">::</span><span style="color: #007788;">Event</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">long</span><span style="color: #000040;">&amp;</span> value<span style="color: #008000;">&#41;</span>
    <span style="color: #008080;">:</span> inst_value<span style="color: #008000;">&#40;</span>value<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
boost<span style="color: #008080;">::</span><span style="color: #007788;">function</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">void</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><span style="color: #000080;">&gt;</span>
Event<span style="color: #008080;">::</span><span style="color: #007788;">create_closure</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">map</span><span style="color: #000080;">&lt;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">string</span>, <span style="color: #0000ff;">long</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> parameter<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
    <span style="color: #0000ff;">long</span> local_value <span style="color: #000080;">=</span> parameter<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">&quot;value&quot;</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">bind</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>Event<span style="color: #008080;">::</span><span style="color: #007788;">callback_function</span>, <span style="color: #0000dd;">this</span>, <span style="color: #000040;">&amp;</span>parameter, local_value<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> 
Event<span style="color: #008080;">::</span><span style="color: #007788;">callback_function</span><span style="color: #008000;">&#40;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">map</span><span style="color: #000080;">&lt;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">string</span>, <span style="color: #0000ff;">long</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">*</span> param, <span style="color: #0000ff;">long</span> local<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>param<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#91;</span><span style="color: #FF0000;">&quot;value&quot;</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">6</span><span style="color: #008080;">;</span>
    this<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>inst_value <span style="color: #000040;">+</span><span style="color: #000080;">=</span> local<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>A função create_closure() faz uma soma qualquer, criando uma variável local. Depois é usado o <strong>bind()</strong>, também do Boost, para reduzir uma função com três parâmetros (o &#8220;this&#8221; mais os dois parâmetros &#8220;normais&#8221;) para uma função com zero parâmetros. Essa função, a <strong>callback_function</strong>, não faz nada mais do que um cálculo.</p>
<p>Pra finalizar, criei o arquivo main.cpp com a função que chama todo mundo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;simple_observer.hpp&quot;</span>
<span style="color: #339900;">#include &quot;event.hpp&quot;</span>
&nbsp;
<span style="color: #339900;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
    SimpleObserver observer<span style="color: #008080;">;</span>
&nbsp;
    Event event<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    std<span style="color: #008080;">::</span><span style="color: #007788;">map</span><span style="color: #000080;">&lt;</span>std<span style="color: #008080;">::</span><span style="color: #007788;">string</span>, <span style="color: #0000ff;">long</span><span style="color: #000080;">&gt;</span> parameter<span style="color: #008080;">;</span>
    parameter<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">&quot;value&quot;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">8</span><span style="color: #008080;">;</span>
&nbsp;
    observer.<span style="color: #007788;">registry</span><span style="color: #008000;">&#40;</span> event.<span style="color: #007788;">create_closure</span><span style="color: #008000;">&#40;</span>parameter<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    observer.<span style="color: #007788;">notify</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Instance value = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> event.<span style="color: #007788;">instance_value</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Parameter      = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> parameter<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">&quot;value&quot;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Eu tenho o Ubuntu, e usei o apt-get pra pegar uma versão da biblioteca Boost e, obviamente, o g++. Como o gerenciador de pacotes vai colocar os HPPs num lugar visível, basta apenas executar o comando:</p>
<pre>
 c++ -O3 event.cpp main.cpp -o closure
</pre>
<p>Lá na método main, eu chamei tudo mundo, crio o observer, crio o objeto event, e peço a este um closure a ser passado para o observer. Quando o observer for notificado, a instância de event é alterado, assim como o parâmetro passado.</p>
<p>Mas repare uma coisa, eu menti para vocês! C++ não possui suporte a closures! Lá no método create_closure(), tive que passar o &#8220;contexto&#8221; (parâmetros, variáveis locais, a própria referência this) explicitamente com o &#8220;bind&#8221;. E por não ter garbage collector, não há nem garantia de que os objetos passados com bind realmente exista na sua execução. Portanto, nem tente fazer algo parecido.</p>
<p>Eu comecei com C++ porque é a &#8220;pior implementação de closures&#8221; das linguagens que eu conheço. Mas não se preocupe, <a href="http://www.objectzilla.com.br/2009/01/14/closure-em-java/">em um próximo post</a>, vou mostrar closure em uma outra linguagem, só que dessa vez, de verdade!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/01/07/closure-em-cpp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Você sabe o que é: Closure?</title>
		<link>http://www.objectzilla.com.br/2009/01/04/voce-sabe-o-que-e-closure/</link>
		<comments>http://www.objectzilla.com.br/2009/01/04/voce-sabe-o-que-e-closure/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 17:59:20 +0000</pubDate>
		<dc:creator>Leonardo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.objectzilla.com.br/?p=19</guid>
		<description><![CDATA[Existem três propostas de closures em Java, BGGA, CICE/ARM e FCM. A primera proposta é a mais forte mas também a mais criticada, e, ao que parece, não haverá espaço para closures no Java 7. Mas o que é closure?
Primeira coisa: em linguagens que suportam closures, funções são tratadas como dados, ou seja, tem a [...]]]></description>
			<content:encoded><![CDATA[<p>Existem três propostas de closures em Java, <a href="http://www.javac.info/">BGGA</a>, <a href="http://docs.google.com/View?docid=k73_1ggr36h">CICE</a>/<a href="http://docs.google.com/View?docid=dffxznxr_1nmsqkz">ARM</a> e <a href="http://docs.google.com/View?docid=ddhp95vd_0f7mcns">FCM</a>. A primera proposta é a mais forte mas também a mais criticada, e, ao que parece, <a href="http://hamletdarcy.blogspot.com/2008/12/java-7-update-from-mark-reinhold-at.html">não haverá espaço para closures no Java 7</a>. Mas o que é closure?<span id="more-19"></span></p>
<p>Primeira coisa: em linguagens que suportam closures, funções são tratadas como dados, ou seja, tem a mesma semântica que um inteiro, uma string, um objeto&#8230; Isso é diferente de linguagens onde closures não existem, como Java, em que a função é definida estaticamente, e de lá não sai. Na verdade, no nível da máquina, tanto dados quando procedimentos são representados por um endereço de uma região de memória, são as linguagens sem closures que abstraem variáveis e funções como sendo coisas distintas.</p>
<p>Em linguagens procedimentais, como C, existe o conceito chamado <strong>ponteiro de função</strong> que, basicamente, é a obtenção de uma referência de uma função pra ser executada em um tempo posterior. O uso de ponteiro de função é bastante baixo nível, e é utilizado bastante, por exemplo, no Linux, já que os módulos, os callbacks e os próprios processos são executados dinamicamente, de acordo com a vontade de seus usuários.</p>
<p>Porém, pra muitos, a simples referência de uma função não se caracteriza uma closure. Principalmente em linguagens orientadas a objetos, closure é associada à captura de um contexto onde a closure é definida. A função closure captura sempre as referências do objeto e do método que a criou pois a qualquer momento pode chamar uma de suas variáveis ou de seus métodos, ou seja, ela &#8220;fecha&#8221; o contexto (daí o nome closure, ou &#8220;fechamento&#8221;). Parece esquisito, mas na prática, essa característica faz com que você sinta que o escopo &#8220;é o de menos&#8221; e que possa usar os métodos e variáveis disponíveis, sem se preocupar depois se o contexto vai desaparecer ou não. É como se, depois de declarada a função,  houvesse uma variável invisível que tivesse a referência de tudo o que está externo e que, portanto, poderia usá-lo enquanto a função existir. Pense, por exemplo, nas <strong>inner class</strong> do Java, você simplesmente não consegue chamar qualquer variável do objeto mais externo, a menos que esteja marcado final. Porém, em linguagens com closures, não existe uma restrição como essa.</p>
<p>Closures, por serem também um dado, costumam ser transportados de uma variável à outra, passando por vários contextos diferentes.</p>
<p>Vamos a um exemplo: na linguagem Ruby, eu poderia definir uma função e associá-la a uma variável:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">quadrado = <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span>
  x <span style="color:#006600; font-weight:bold;">*</span> x
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Por ser um dado, então atribuí-la a uma outra variável é possível:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">funcaoMisteriosa = quadrado</pre></div></div>

<p>E tanto &#8220;quadrado&#8221; quanto &#8220;funcaoMisteriosa&#8221; possuem a referência à mesma função. E ambos são capazes de avaliar a função, veja:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">puts</span> quadrado.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#41;</span>    <span style="color:#008000; font-style:italic;"># 16</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> funçãoMisteriosa.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#41;</span>  <span style="color:#008000; font-style:italic;"># 16</span></pre></div></div>

<p>Isso por si só não é uma closure. Como dito antes, a linguagem C possui a capacidade de transportar ponteiros de funções, e é apenas isso que eu estou fazendo. Eu poderia, em Ruby, utilizar variáveis e métodos do contexto mais externo, mesmo que este não estivesse visível no momento em que a função fosse realmente executado. Como exemplo, imagine que uma função é declarada em uma classe, e que fosse possível passar pra um outro objeto:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># essa classe só tem um método que vai</span>
<span style="color:#008000; font-style:italic;"># executar o bloco recebido</span>
<span style="color:#9966CC; font-weight:bold;">class</span> Bar
  <span style="color:#9966CC; font-weight:bold;">def</span> execute<span style="color:#006600; font-weight:bold;">&#40;</span>bloco<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> bloco.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Foo
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>atributo<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@atributo</span> = atributo
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> teste<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># criei uma função e associei à variável funcaoQualquer</span>
    <span style="color:#008000; font-style:italic;"># repare que a função tem uma instância de uma variável pertencente</span>
    <span style="color:#008000; font-style:italic;"># a esse objeto (atributo)</span>
&nbsp;
    blocoQualquer = <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#0066ff; font-weight:bold;">@atributo</span> <span style="color:#006600; font-weight:bold;">+</span> x
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#008000; font-style:italic;"># criei um objeto...</span>
    bar = Bar.<span style="color:#9900CC;">new</span>
    <span style="color:#008000; font-style:italic;"># ...e passei a variável contendo a função</span>
    bar.<span style="color:#9900CC;">execute</span><span style="color:#006600; font-weight:bold;">&#40;</span>blocoQualquer<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># crio o objeto passando 5 como attributo</span>
foo = Foo.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># chamo teste, que vai criar um bloco e chamar execute de um outro objeto,</span>
<span style="color:#008000; font-style:italic;"># que por sua vez, vai imprimir uma soma (o resultado é 15). Repare que foi</span>
<span style="color:#008000; font-style:italic;"># utilizado, na sua execução, uma variável (@atributo) que o objeto do tipo</span>
<span style="color:#008000; font-style:italic;"># Bar não conhece, mas que está no contexto do bloco passado (houve a closure).</span>
foo.<span style="color:#9900CC;">teste</span></pre></div></div>

<p>Foi possível chamar a variável @atributo porque, ao declarar o bloco &#8220;blocoQualquer&#8221; foi feita a captura do contexto em volta; como, por exemplo as variáveis do método Foo#teste e os atributos de instância do objeto Foo.</p>
<p>Cada linguagem tem seu jeito de chamar uma closure. Por isso, nos próximos posts, vou dar exemplos em algumas delas. Aguarde.</p>
<p>UPDATE:<br />
Essa série sobre Closures continua <a href="http://www.objectzilla.com.br/2009/01/07/closure-em-cpp/">aqui</a>, e <a href="http://www.objectzilla.com.br/2009/01/14/closure-em-java/">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.objectzilla.com.br/2009/01/04/voce-sabe-o-que-e-closure/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
