<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9086858542017565627</id><updated>2012-02-06T16:21:54.386-03:00</updated><category term='VRaptor'/><category term='JPA'/><category term='java'/><category term='Recursos'/><category term='Interceptor'/><category term='igualdade'/><category term='Transação'/><category term='Hibernate'/><category term='hash'/><category term='hashCode'/><category term='LAZY'/><category term='collection'/><category term='Session'/><category term='coleção'/><category term='coleções'/><category term='utils'/><category term='Transaction'/><category term='busca'/><category term='VRaptor3'/><category term='DI'/><title type='text'>Programando Java</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9086858542017565627.post-3338034447251063125</id><published>2009-10-20T07:41:00.007-03:00</published><updated>2009-10-20T09:20:01.455-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VRaptor3'/><category scheme='http://www.blogger.com/atom/ns#' term='DI'/><category scheme='http://www.blogger.com/atom/ns#' term='Recursos'/><category scheme='http://www.blogger.com/atom/ns#' term='Session'/><category scheme='http://www.blogger.com/atom/ns#' term='LAZY'/><category scheme='http://www.blogger.com/atom/ns#' term='VRaptor'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>VRaptor 3 - Poupando recursos - LAZY Dependence Injection</title><content type='html'>Objetivo: Ao final deste artigo espera-se que você saiba como poupar recursos caros, trazendo eles de forma LAZY, ou como prefiro chamar Just-in-Time (no momento certo).&lt;br /&gt;&lt;br /&gt;No VRaptor3 a injeção de dependencia ficou bem mais fácil, os interceptadores que eram os responsáveis para injetar a dependencia sumiram e agora fica tudo a cargo do container, que pode ser o Spring ou o Pico.&lt;br /&gt;&lt;br /&gt;A facilidade na injeção de dependencia tem um custo, como não é mais controlado pelo programador que cria o interceptor sempre que declaramos uma dependencia no construtor de um @Component, @Resource ou @Intercepts ele é injetado no inicio, logo na construção, porem as vezes o fluxo de um requisição faz com que não usemos algumas destas injeções de dependencia, disperdiçando recursos valiosos.&lt;br /&gt;&lt;br /&gt;Por exemplo, vamos supor o seguinte @Resource abaixo, que cadastra produtos&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import java.util.List;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import org.hibernate.Session;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.Result;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.view.Results;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; ProdutoController &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* O recurso que queremos poupar.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; Session session;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; Result result;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; ProdutoController&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw2"&gt;final&lt;/span&gt; Session session, &lt;span class="kw2"&gt;final&lt;/span&gt; Result result&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;session&lt;/span&gt; = session;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;result&lt;/span&gt; = result;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/** &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* apenas renderiza o formulário&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; form&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; List&amp;lt;Produto&amp;gt; listar&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; session.&lt;span class="me1"&gt;createCriteria&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Produto.&lt;span class="kw2"&gt;class&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;list&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; Produto adiciona&lt;span class="br0"&gt;(&lt;/span&gt;Produto produto&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; session.&lt;span class="me1"&gt;persist&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;produto&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result.&lt;span class="me1"&gt;use&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Results.&lt;span class="me1"&gt;logic&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;redirectTo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;getClass&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;listar&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; produto;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Sempre que alguem faz uma requisição a qualquer lógica dentro do recurso ProdutoController uma Session é aberta, porem note que abrir o formulário para adicionar produtos não requer sessão com o banco, ele apenas renderiza uma página, cada vez que o formulário de produtos é aberto um importante e caro recurso do sistema esta sendo requerido, e de forma totalmente ociosa.&lt;br /&gt;&lt;br /&gt;Como agir neste caso ? isolar o formulário poderia resolver este problema mais recairia em outro, da mantenabilidade.&lt;br /&gt;&lt;br /&gt;O ideal é que este recurso só fosse realmente injetado no tempo certo (Just in Time) como seria possivel fazer isso ? a solução é usar proxy dinamicos, enviando uma session que só realmente abrirá a conexão com o banco quando um de seus métodos for invocado&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import java.lang.reflect.Method;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import javax.annotation.PreDestroy;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import org.hibernate.classic.Session;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import org.hibernate.SessionFactory;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import net.vidageek.mirror.dsl.Mirror;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.ioc.ApplicationScoped;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.ioc.Component;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.ioc.ComponentFactory;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.ioc.RequestScoped;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.proxy.MethodInvocation;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.proxy.Proxifier;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.proxy.SuperMethod;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* &amp;lt;b&amp;gt;JIT (Just-in-Time) {@link Session} Creator&amp;lt;/b&amp;gt; fábrica para o componente {@link Session}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* gerado de forma LAZY ou JIT(Just-in-Time) a partir de uma {@link SessionFactory}, que&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* normalmente se encontra em um ecopo de aplicativo @{@link ApplicationScoped}.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* @author Tomaz Lavieri&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* @since 1.0&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;@&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AComponent+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Component&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;@RequestScoped&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; JITSessionCreator &lt;span class="kw2"&gt;implements&lt;/span&gt; ComponentFactory&amp;lt;Session&amp;gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AMethod+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Method&lt;/span&gt;&lt;/a&gt; CLOSE = &lt;span class="kw2"&gt;new&lt;/span&gt; Mirror&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;on&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Session.&lt;span class="kw2"&gt;class&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;reflect&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;method&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"close"&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;withoutArgs&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AMethod+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Method&lt;/span&gt;&lt;/a&gt; FINALIZE = &lt;span class="kw2"&gt;new&lt;/span&gt; Mirror&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;on&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AObject+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Object&lt;/span&gt;&lt;/a&gt;.&lt;span class="kw2"&gt;class&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;reflect&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;method&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"finalize"&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;withoutArgs&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; SessionFactory factory;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/** Guarda a Proxy Session */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; Session proxy;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/** Guarada a Session real. */&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; Session session;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; JITSessionCreator&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw2"&gt;final&lt;/span&gt; SessionFactory factory, &lt;span class="kw2"&gt;final&lt;/span&gt; Proxifier proxifier&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;factory&lt;/span&gt; = factory;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;proxy&lt;/span&gt; = proxify&lt;span class="br0"&gt;(&lt;/span&gt;Session.&lt;span class="kw2"&gt;class&lt;/span&gt;, proxifier&lt;span class="br0"&gt;)&lt;/span&gt;; &lt;span class="co1"&gt;// *1*&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* Cria o JIT Session, que repassa a invocação de qualquer método, exceto &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* {@link Object#finalize()} e {@link Session#close()}, para uma session real, criando &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* uma se necessário.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; Session proxify&lt;span class="br0"&gt;(&lt;/span&gt;Class&amp;lt;? &lt;span class="kw2"&gt;extends&lt;/span&gt; Session&amp;gt; target, Proxifier proxifier&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; proxifier.&lt;span class="me1"&gt;proxify&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;target, &lt;span class="kw2"&gt;new&lt;/span&gt; MethodInvocation&amp;lt;Session&amp;gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override &lt;span class="co1"&gt;// *2*&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AObject+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Object&lt;/span&gt;&lt;/a&gt; intercept&lt;span class="br0"&gt;(&lt;/span&gt;Session proxy, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AMethod+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Method&lt;/span&gt;&lt;/a&gt; method, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AObject+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Object&lt;/span&gt;&lt;/a&gt;&lt;span class="br0"&gt;[&lt;/span&gt;&lt;span class="br0"&gt;]&lt;/span&gt; args, SuperMethod superMethod&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;method.&lt;span class="me1"&gt;equals&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;CLOSE&lt;span class="br0"&gt;)&lt;/span&gt; || &lt;span class="br0"&gt;(&lt;/span&gt;method.&lt;span class="me1"&gt;equals&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;FINALIZE&lt;span class="br0"&gt;)&lt;/span&gt; &amp;amp;&amp;amp; session == &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;null&lt;/span&gt;; &lt;span class="co1"&gt;//skip&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Mirror&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;on&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;getSession&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;invoke&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;method&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;method&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;withArgs&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;args&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; Session getSession&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;session == &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="co1"&gt;// *3*&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; session =&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;factory.&lt;span class="me1"&gt;openSession&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; session;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; Session getInstance&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; proxy; &lt;span class="co1"&gt;// *4*&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @PreDestroy&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; destroy&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt; &lt;span class="co1"&gt;// *5*&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;session != &lt;span class="kw2"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; session.&lt;span class="me1"&gt;isOpen&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; session.&lt;span class="me1"&gt;close&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Explicando alguns pontos chaves, comentados com // *N*&lt;br /&gt;&lt;ol&gt;&lt;li&gt;O Proxfier é um objeto das libs do vrapor que auxilia na criação de objetos proxys ele é responsável por escolher a biblioteca que implementa o proxy dinamico, e então invocar via callback um método interceptor, como falamo abaixo.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Neste ponto temos a implementação do nosso interceptor, sempre que um método for envocado em nosso proxy, esse intereptor é invocado primeiro, ele filtra as chamada ao método finalize caso a session real ainda não tenha sido criada, isso evita criar a session apenas para finaliza-la.&lt;br /&gt;O método close também é filtrao, isso é feito para evitar criar uma session apenas para fecha-la, e também por que o nosso SessionCreator é que é o responsavel por fechar a session ao final do scopo, quando a request acabar.&lt;br /&gt;Todos os outros métodos são repassados para uma session através do método getSession() onde é realmente que acontece o LAZY ou JIT.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Aqui é onde acontece a mágia, da primeira vez que getSession() é invocado a sessão é criada, e então repassada, todas as outras chamadas a getSession() repassam a sessão anteriormente criada, assim, se getSession() nunca for envocado, ou seja, se nenhum método for envocado no proxy, getSession() nunca será invocado, e a sessão real não será criada.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;O retorno desse ComponentFactory é a Session proxy, que só criará a session real se um de seus métodos for invocado.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ao final do escopo o destroy é invocado, ele verifica se a session real existe, existindo verifica se esta ainda esta aberta, e estando ele fecha, desta forma é possivel garantir que o recurso será sempre liberado.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Assim podemos agora pedir uma session sempre que acharmos que vamos precisar de uma, sabendo que o recurso só será realmente solicitado quando formos usar um de seus métodos, salvando assim o recurso.&lt;br /&gt;&lt;br /&gt;Esta mesma abordagem pode ser usada para outros recursos caros do sistema.&lt;br /&gt;&lt;br /&gt;Os códigos fonte para os ComponentFactory de EntityManager e Session que utilizo podem ser encontrados neste link: &lt;a href="http://guj.com.br/posts/list/141500.java"&gt;http://guj.com.br/posts/list/141500.java&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9086858542017565627-3338034447251063125?l=java-i9se.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/3338034447251063125/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://java-i9se.blogspot.com/2009/10/vratpro-3-poupando-recursos-lazy.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/3338034447251063125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/3338034447251063125'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/2009/10/vratpro-3-poupando-recursos-lazy.html' title='VRaptor 3 - Poupando recursos - LAZY Dependence Injection'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9086858542017565627.post-8266150793792183839</id><published>2009-10-17T17:01:00.012-03:00</published><updated>2009-10-20T09:05:59.149-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VRaptor3'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Transação'/><category scheme='http://www.blogger.com/atom/ns#' term='VRaptor'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Transaction'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><category scheme='http://www.blogger.com/atom/ns#' term='Interceptor'/><title type='text'>VRaptor3 - Interceptando recursos anotados</title><content type='html'>Em primeira lugar, gostaria de tecer meus mais sinceros elogios a equipe VRaptor, a versão 3 esta muito boa, bem mais intuitiva e fácil de usar que a 2.6&lt;br /&gt;&lt;br /&gt;Neste artigo vou mostar como interceptar um método de um Resource especifico, identificando-o a partir de uma anotação e executar ações antes do método executar, e após ele executar.&lt;br /&gt;&lt;br /&gt;Vamos supor que nós temos o seguinte Resource para adicionar produtos no nosso sistema&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;@Resource&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; ProdutoController &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; DaoFactory factory;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; ProdutoDao dao;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; ProdutoController&lt;span class="br0"&gt;(&lt;/span&gt;DaoFactory factory&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;factory&lt;/span&gt; = factory;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;dao&lt;/span&gt; = factory.&lt;span class="me1"&gt;getProdutoDao&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; List&amp;lt;Produto&amp;gt; listar&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; dao.&lt;span class="me1"&gt;list&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; Produto atualizar&lt;span class="br0"&gt;(&lt;/span&gt;Produto produto&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; factory.&lt;span class="me1"&gt;beginTransaction&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; produto = dao.&lt;span class="me1"&gt;update&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;produto&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; factory.&lt;span class="me1"&gt;commit&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; produto;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt; &lt;span class="kw2"&gt;catch&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;DaoException ex&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; factory.&lt;span class="me1"&gt;rollback&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;throw&lt;/span&gt; ex;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; Produto adicionar&lt;span class="br0"&gt;(&lt;/span&gt;Produto produto&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; factory.&lt;span class="me1"&gt;beginTransaction&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; produto = dao.&lt;span class="me1"&gt;store&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;produto&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; factory.&lt;span class="me1"&gt;commit&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; produto;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt; &lt;span class="kw2"&gt;catch&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;DaoException ex&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; factory.&lt;span class="me1"&gt;rollback&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;throw&lt;/span&gt; ex;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora nos queremos que um interceptador intercepte meu recurso, e execute a lógica dentro de um escopo transacional, como fazer isso ? é só criar um interceptador assim.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import org.hibernate.Session;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import org.hibernate.Transaction;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.Intercepts;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.core.InterceptorStack;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.interceptor.Interceptor;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import br.com.caelum.vraptor.resource.ResourceMethod;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;@Intercepts&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; TransactionInterceptor &lt;span class="kw2"&gt;implements&lt;/span&gt; Interceptor &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; Session session;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; TransactionInterceptor&lt;span class="br0"&gt;(&lt;/span&gt;Session session&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;session&lt;/span&gt; = session;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; intercept&lt;span class="br0"&gt;(&lt;/span&gt;InterceptorStack stack, ResourceMethod method, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AObject+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Object&lt;/span&gt;&lt;/a&gt; instance&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Transaction transaction = &lt;span class="kw2"&gt;null&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; transaction = session.&lt;span class="me1"&gt;beginTransaction&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; stack.&lt;span class="me1"&gt;next&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;method, instance&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; transaction.&lt;span class="me1"&gt;commit&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt; &lt;span class="kw2"&gt;finally&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;transaction != &lt;span class="kw2"&gt;null&lt;/span&gt; &amp;&amp; transaction.&lt;span class="me1"&gt;isActive&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; transaction.&lt;span class="me1"&gt;rollback&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;boolean&lt;/span&gt; accepts&lt;span class="br0"&gt;(&lt;/span&gt;ResourceMethod method&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;true&lt;/span&gt;; &lt;span class="co1"&gt;//aceita todas as requisições&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ok, o interceptador vai rodar e abrir transação antes e depois de executar a logica, e os métodos transacionais da minha lógica irão se reduzir a isto&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; Produto atualizar&lt;span class="br0"&gt;(&lt;/span&gt;Produto produto&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; dao.&lt;span class="me1"&gt;update&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;produto&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; Produto adicionar&lt;span class="br0"&gt;(&lt;/span&gt;Produto produto&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; dao.&lt;span class="me1"&gt;store&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;produto&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ok mas, neste caso temos o problema de que métodos que não exigem transação estão abrindo e fechando transação a cada requisição sem necessidade.&lt;br /&gt;&lt;br /&gt;Como então selecionar apenas algumas lógicas para serem transacionais ? podem criar uma anotação para isto, desta forma:&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import java.lang.annotation.ElementType;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import java.lang.annotation.Retention;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import java.lang.annotation.RetentionPolicy;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import java.lang.annotation.Target;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* Usado para garantir que um determinado recurso interceptado seja executada em um&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* escopo de tranzação.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* @author Tomaz Lavieri&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* @since 1.0&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;@Retention&lt;span class="br0"&gt;(&lt;/span&gt;RetentionPolicy.&lt;span class="me1"&gt;RUNTIME&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;@Target&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;{&lt;/span&gt;ElementType.&lt;span class="me1"&gt;METHOD&lt;/span&gt;,ElementType.&lt;span class="me1"&gt;TYPE&lt;/span&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; @&lt;span class="kw2"&gt;interface&lt;/span&gt; Transactional &lt;span class="br0"&gt;{&lt;/span&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora precisamos marcar os pontos onde queremos que o escopo seja transacional com esta anotação.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;@Resource&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; ProdutoController &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw2"&gt;final&lt;/span&gt; ProdutoDao dao;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; ProdutoController&lt;span class="br0"&gt;(&lt;/span&gt;ProdutoDao dao&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;dao&lt;/span&gt; = dao;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; List&amp;lt;Produto&amp;gt; listar&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; dao.&lt;span class="me1"&gt;list&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Transactional&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; Produto atualizar&lt;span class="br0"&gt;(&lt;/span&gt;Produto produto&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; dao.&lt;span class="me1"&gt;update&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;produto&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Transactional&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; Produto adicionar&lt;span class="br0"&gt;(&lt;/span&gt;Produto produto&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; dao.&lt;span class="me1"&gt;store&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;produto&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ok o código ficou bem mais enxuto, mas como interceptar apenas os métodos marcados com esta anotação ?? para tal basta no nosso accepts do TransactionInterceptor verificarmos se a anotação esta presente no método, ou no proprio rescurso (quando marcado no recurso todos os métodos do recurso seriam transacionais).&lt;br /&gt;&lt;br /&gt;A modificação do método ficaria assim&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;boolean&lt;/span&gt; accepts&lt;span class="br0"&gt;(&lt;/span&gt;ResourceMethod method&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt;&amp;nbsp; method &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span class="me1"&gt;getMethod&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="co1"&gt;//metodo anotado&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span class="me1"&gt;isAnnotationPresent&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Transactional.&lt;span class="kw2"&gt;class&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; || method&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span class="me1"&gt;getResource&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="co1"&gt;//ou recurso anotado&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span class="me1"&gt;getType&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;span class="me1"&gt;isAnnotationPresent&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;Transactional.&lt;span class="kw2"&gt;class&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Pronto agora somente os métodos com a anotação @Transacional são executados em escopo de transação e economisamos linhas e linhas de códigos de try{commit}catch{rollback throw ex}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9086858542017565627-8266150793792183839?l=java-i9se.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/8266150793792183839/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://java-i9se.blogspot.com/2009/10/vraptor3-interceptando-recursos.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/8266150793792183839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/8266150793792183839'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/2009/10/vraptor3-interceptando-recursos.html' title='VRaptor3 - Interceptando recursos anotados'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9086858542017565627.post-905983058084057382</id><published>2009-09-19T10:15:00.007-03:00</published><updated>2009-09-21T21:15:37.906-03:00</updated><title type='text'>Apresentação Java Collection</title><content type='html'>No dia 18/09/2009 falei no SUN DAY da Semana de computação da UFPB sobre Java Collection.&lt;br /&gt;&lt;br /&gt;Os arquivos usados na apresentação seguem logo abaixo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blogs.sun.com/elenilsonvieira/resource/folder_ii-sun-day.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 716px;" src="http://blogs.sun.com/elenilsonvieira/resource/folder_ii-sun-day.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/tomazlavieri/files/Collections.pdf?attredirects=0"&gt;Collections: Apresentação usada no Sun Day&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/tomazlavieri/files/Collections%20Escolha.pdf?attredirects=0"&gt;Diagrama de Escolha&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/tomazlavieri/files/Collections%20Agrupamento.pdf?attredirects=0"&gt;Diagrama de Agrupamento&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Apresentação original, feita para o grupo de estudos&lt;br /&gt;&lt;a href="http://sites.google.com/site/tomazlavieri/files/Collections_e_Generics.pdf?attredirects=0"&gt;Collections e Generics: Apresentação no Grupo de estudos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;meu twitter:&lt;br /&gt;&lt;a href="http://twitter.com/tomazlavieri"&gt;http://twitter.com/tomazlavieri&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fotos do evento:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_vayaetO-4Hw/SreNbKeeUjI/AAAAAAAAARE/9AXRbBazxAE/s800/100_1100.JPG"&gt;&lt;img style="cursor: pointer; width: 800px; height: 600px;" src="http://lh6.ggpht.com/_vayaetO-4Hw/SreNbKeeUjI/AAAAAAAAARE/9AXRbBazxAE/s800/100_1100.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_vayaetO-4Hw/SreNbe3n4LI/AAAAAAAAARM/vLWB59whsyQ/s800/100_1102.JPG"&gt;&lt;img style="cursor: pointer; width: 800px; height: 600px;" src="http://lh4.ggpht.com/_vayaetO-4Hw/SreNbe3n4LI/AAAAAAAAARM/vLWB59whsyQ/s800/100_1102.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh3.ggpht.com/_vayaetO-4Hw/SreNbhE9PkI/AAAAAAAAARQ/6V_LPP2fByA/s800/100_1103.JPG"&gt;&lt;img style="cursor: pointer; width: 800px; height: 600px;" src="http://lh3.ggpht.com/_vayaetO-4Hw/SreNbhE9PkI/AAAAAAAAARQ/6V_LPP2fByA/s800/100_1103.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9086858542017565627-905983058084057382?l=java-i9se.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/905983058084057382/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://java-i9se.blogspot.com/2009/09/apresentacao-java-collection.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/905983058084057382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/905983058084057382'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/2009/09/apresentacao-java-collection.html' title='Apresentação Java Collection'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_vayaetO-4Hw/SreNbKeeUjI/AAAAAAAAARE/9AXRbBazxAE/s72-c/100_1100.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9086858542017565627.post-5422053254469429489</id><published>2009-07-17T15:06:00.003-03:00</published><updated>2009-07-17T15:18:55.979-03:00</updated><title type='text'>Collection e Generics</title><content type='html'>Ultima apresentação que fiz para o Grupo de SCJP referencte a Collections e Generics&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Em breve posto mais detalhes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;para baixar a apresentação sem se cadastrar no SlideShare &lt;a href="http://sites.google.com/site/tomazlavieri/files/Collections_e_Generics.pdf?attredirects=0"&gt;slides em pdf&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_1732924"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/lavieri/collections-e-generics" title="Collections E Generics"&gt;Collections E Generics&lt;/a&gt;&lt;object style="margin:0px" width="723" height="604"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=collectionsegenerics-090716213639-phpapp02&amp;amp;stripped_title=collections-e-generics"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=collectionsegenerics-090716213639-phpapp02&amp;amp;stripped_title=collections-e-generics" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="723" height="604"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/lavieri"&gt;lavieri&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9086858542017565627-5422053254469429489?l=java-i9se.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/5422053254469429489/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://java-i9se.blogspot.com/2009/07/collection-e-generics.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/5422053254469429489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/5422053254469429489'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/2009/07/collection-e-generics.html' title='Collection e Generics'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9086858542017565627.post-3064294801497759427</id><published>2009-06-04T20:19:00.003-03:00</published><updated>2009-06-04T20:48:43.744-03:00</updated><title type='text'>SCJP - Exercicio sobre Garbage Collector</title><content type='html'>&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;A pedido de um colega, fiz um pequeno Slide, mostrando como resolver exercícios para a Certificação SCJP 6 sobre Garbage Collector.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_1535546"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/lavieri/scjp-6-garbage-collector?type=powerpoint" title="SCJP 6 - Garbage Collector"&gt;SCJP 6 - Garbage Collector&lt;/a&gt;&lt;object style="margin:0px" width="723" height="604"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=garbagecollector-090604183730-phpapp01&amp;amp;stripped_title=scjp-6-garbage-collector"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=garbagecollector-090604183730-phpapp01&amp;amp;stripped_title=scjp-6-garbage-collector" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="723" height="604"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;Microsoft Word documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/lavieri"&gt;lavieri&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;O pdf pode ser baixado &lt;a href="http://www.slideshare.net/lavieri/scjp-6-garbage-collector"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Obs.: prometo que muito em breve dou uma revisada, para melhorar o portugues da apresentação.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9086858542017565627-3064294801497759427?l=java-i9se.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/3064294801497759427/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://java-i9se.blogspot.com/2009/06/scjp-exercicio-sobre-garbage-collector.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/3064294801497759427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/3064294801497759427'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/2009/06/scjp-exercicio-sobre-garbage-collector.html' title='SCJP - Exercicio sobre Garbage Collector'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9086858542017565627.post-656658376409843499</id><published>2009-06-02T23:51:00.002-03:00</published><updated>2009-06-03T00:02:45.868-03:00</updated><title type='text'>SCJP 6.0 passei com 90%</title><content type='html'>Bom pessoal, passei os últimos 45 dias, ocupado, escutando para o SCJP e por isso não postei mais, a partir de agora, pretendo retomar os posts... segue um pequeno resumo da trajetória que fiz para a certificação.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: verdana; font-size: 12px; line-height: 18px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px; "&gt;Fiz hoje cedo o exame em recife,&lt;br /&gt;&lt;br /&gt;foi bem tranquilo, tirando que não tive muito paciencia de fazer a revisão, e devo ter errado em questões por desatenção, pois anotei todas as questões que tive duvida, real, e depois da prova conferi que minhas suposições foram corretas ^^... &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fiz o score de 90%&lt;/b&gt; divido conforme abaixo... &lt;br /&gt;&lt;br /&gt;&lt;div class="dp-highlighter" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; background-color: rgb(231, 229, 220); width: 99%; overflow-x: auto; overflow-y: auto; margin-top: 18px !important; margin-right: 0px !important; margin-bottom: 18px !important; margin-left: 0px !important; padding-top: 1px; "&gt;&lt;div class="bar" style="padding-left: 45px; "&gt;&lt;div class="tools" style="padding-top: 3px; padding-right: 8px; padding-left: 10px; font: normal normal normal 9px/normal Verdana, Geneva, Arial, Helvetica, sans-serif; color: silver; background-color: rgb(248, 248, 248); padding-bottom: 10px; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); "&gt;&lt;a href="http://www.guj.com.br/posts/list/128633.java#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" style="background-image: none; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; color: rgb(160, 160, 160); background-color: inherit; text-decoration: none; margin-right: 10px; background-position: initial initial; "&gt;view plain&lt;/a&gt;&lt;a href="http://www.guj.com.br/posts/list/128633.java#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" style="background-image: none; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; color: rgb(160, 160, 160); background-color: inherit; text-decoration: none; margin-right: 10px; background-position: initial initial; "&gt;copy to clipboard&lt;/a&gt;&lt;a href="http://www.guj.com.br/posts/list/128633.java#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" style="background-image: none; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; color: rgb(160, 160, 160); background-color: inherit; text-decoration: none; margin-right: 10px; background-position: initial initial; "&gt;print&lt;/a&gt;&lt;a href="http://www.guj.com.br/posts/list/128633.java#" onclick="dp.sh.Toolbar.Command('About',this);return false;" style="background-image: none; background-repeat: initial; background-attachment: initial; -webkit-background-clip: initial; -webkit-background-origin: initial; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 9px; color: rgb(160, 160, 160); background-color: inherit; text-decoration: none; margin-right: 10px; background-position: initial initial; "&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-j" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-color: rgb(255, 255, 255); margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 1px !important; margin-left: 45px !important; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(92, 92, 92); "&gt;&lt;li class="alt" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; background-color: rgb(255, 255, 255); color: inherit; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;/*&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); background-color: rgb(248, 248, 248); color: rgb(92, 92, 92); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;- Declarations, Initialization and Scoping .... 91%&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="alt" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; background-color: rgb(255, 255, 255); color: inherit; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;- Flow Control ................................ 90%&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); background-color: rgb(248, 248, 248); color: rgb(92, 92, 92); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;- API Contents ................................ 90%&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="alt" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; background-color: rgb(255, 255, 255); color: inherit; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;- Concurrency ................................ 100%&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); background-color: rgb(248, 248, 248); color: rgb(92, 92, 92); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;- OO Concepts ................................ 100%&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="alt" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; background-color: rgb(255, 255, 255); color: inherit; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;- Collections / Generics ...................... 90%&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); background-color: rgb(248, 248, 248); color: rgb(92, 92, 92); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;- Fundamentals ................................ 72%&lt;/span&gt; &lt;/span&gt;&lt;/li&gt;&lt;li class="alt" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-width: initial; border-color: initial; list-style-type: decimal-leading-zero; list-style-image: initial; list-style-position: outside !important; border-left-width: 3px; border-left-style: solid; border-left-color: rgb(108, 226, 108); padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; line-height: 14px; background-color: rgb(255, 255, 255); color: inherit; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;&lt;span class="comment" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: rgb(0, 130, 0); background-color: inherit; "&gt;*/&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Comecei a esudar 14/04/2009 quando comprei o livro&lt;/b&gt; =&gt; &lt;a class="snap_shots" href="http://www.guj.com.br/posts/list/123655.java" target="_blank" rel="nofollow" style="color: rgb(67, 130, 176); text-decoration: none; "&gt;http://www.guj.com.br/posts/list/123655.java&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Estudei pelo livro da Kathy, SCJP 6, fiz todos os exercicios &lt;br /&gt;&lt;br /&gt;cap 01 -&gt; . 100% &lt;br /&gt;cap 02 -&gt; .. 80% &lt;br /&gt;cap 03 -&gt; . 100% &lt;br /&gt;cap 04 -&gt; .. 90% &lt;br /&gt;cap 05 -&gt; .. 94% &lt;br /&gt;cap 06 -&gt; .. 80% &lt;br /&gt;cap 07 -&gt; .. 94% &lt;br /&gt;cap 08 -&gt; .. 92% &lt;br /&gt;cap 09 -&gt; .. 94% &lt;br /&gt;cap 10 -&gt; .. 83% &lt;br /&gt;&lt;br /&gt;......... &lt;br /&gt;Ai fiz um Mock (bem fraco por sinal) do javaranch, que tem varias questões fora do escopo da prova, que acertei 92% &lt;br /&gt;&lt;a class="snap_shots" href="http://www.javaprepare.com/quests/test.html" target="_blank" rel="nofollow" style="color: rgb(67, 130, 176); text-decoration: none; "&gt;http://www.javaprepare.com/quests/test.html&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Ai fiz o exame do Inquisition-0.14 ... o de 82 questões, acertei 94% .. fiz os outros exames menores também, que acertei por volta de 90% &lt;br /&gt;&lt;br /&gt;Depois fiz 2 provas sorteadas no Testkiller (72 questões cada prova) 92% na primeira, e 96% na segunda &lt;br /&gt;&lt;br /&gt;em seguida nos dois dia antes do exame fiz 2 provas do ExamLab for SCJP6, que achei o melhor dos exames, principalmente, pq é muito semelhante a prova, o mais proximo a prova original... tirei + de 94% na primeira e 92% na segunda... (a engine é semelhante, mais o nivel é mais dificil)... &lt;br /&gt;&lt;br /&gt;e hoje pela manha fiz a prova, enfim, agora é batalhar por experiencia profissional, e passar para as proximas certificações &lt;br /&gt;&lt;br /&gt;e foi isso&lt;/span&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9086858542017565627-656658376409843499?l=java-i9se.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/656658376409843499/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://java-i9se.blogspot.com/2009/06/scjp-60-passei-com-90.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/656658376409843499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/656658376409843499'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/2009/06/scjp-60-passei-com-90.html' title='SCJP 6.0 passei com 90%'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9086858542017565627.post-6782715120523132507</id><published>2009-04-02T15:47:00.012-03:00</published><updated>2009-05-15T22:22:38.646-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='collection'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='coleção'/><category scheme='http://www.blogger.com/atom/ns#' term='hashCode'/><category scheme='http://www.blogger.com/atom/ns#' term='hash'/><category scheme='http://www.blogger.com/atom/ns#' term='igualdade'/><category scheme='http://www.blogger.com/atom/ns#' term='coleções'/><title type='text'>Igualdade em java - equals() e hashCode()</title><content type='html'>Um dos maiores problemas que os programadores encontram ao inciar seu trabalho em java é o de entender os testes de igualdade.&lt;br /&gt;&lt;br /&gt;A igualdade em java não pode ser testada através do operador == , estes operador apenas verifica se duas variaveis fazem referencia a mesma instancia de um objetos.&lt;br /&gt;&lt;br /&gt;Para ser um pouco mais claro, imaginemos uma classe Pessoa, como segue abaixo.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; Pessoa &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; nome;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; cpf;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AInteger+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Integer&lt;/span&gt;&lt;/a&gt; idade;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; Pessoa&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; nome, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; cpf&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;nome&lt;/span&gt; = nome;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;cpf&lt;/span&gt; = cpf;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AInteger+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Integer&lt;/span&gt;&lt;/a&gt; getIdade&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; idade;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; setIdade&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AInteger+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Integer&lt;/span&gt;&lt;/a&gt; idade&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;this&lt;/span&gt;.&lt;span class="me1"&gt;idade&lt;/span&gt; = idade;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; getNome&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; nome;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;String&lt;/span&gt;&lt;/a&gt; getCpf&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; cpf;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Como posso eu falar que duas pessoas são as mesmas pessoas ? a JVM (Java Virutal Machine) por se só não tem como identificar como duas pessoas podem ser ditas iguais, desta forma o teste abaixo, verifica apenas se estas são instancias de um mesmo objeto.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;Pessoa maria = &lt;span class="kw2"&gt;new&lt;/span&gt; Pessoa&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;Maria da Silva&amp;quot;&lt;/span&gt;,&lt;span class="st0"&gt;&amp;quot;111.222.333-44&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;maria.&lt;span class="me1"&gt;setIdade&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;Pessoa mariaDaSilva = &lt;span class="kw2"&gt;new&lt;/span&gt; Pessoa&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;Maria da Silva&amp;quot;&lt;/span&gt;,&lt;span class="st0"&gt;&amp;quot;333.555.222-11&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;mariaDaSilva.&lt;span class="me1"&gt;setIdade&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;40&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//apesar dos nomes iguais de maria e mariaDaSilva, os cpfs são&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co1"&gt;//diferentes e desta forma posso falar que são pessoas diferentes&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;Pessoa mariaDaSilva2 = &lt;span class="kw2"&gt;new&lt;/span&gt; Pessoa&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;Maria da Silva&amp;quot;&lt;/span&gt;,&lt;span class="st0"&gt;&amp;quot;333.555.222-11&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co1"&gt;//mariaDaSilva e mariaDaSilva2 são pessoas iguais, e mesmo não setando&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//a idade de mariaDaSilva2, em um teste de igualdade eu vou querer que&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co1"&gt;//para esses 2 objetos ele seja positivo.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co1"&gt;//porem são 2 instancias de de objetos diferentes, portanto&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw4"&gt;boolean&lt;/span&gt; referencia = mariaDaSilva == mariaDaSilva2;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3ASystem+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span class="me1"&gt;out&lt;/span&gt;.&lt;span class="me1"&gt;println&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;Referencia é falso (&amp;quot;&lt;/span&gt; + referencia + &lt;span class="st0"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//isso ocorre pq:&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co1"&gt;//a variável mariaDaSilva aponta para um objeto enquanto&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//a variável mariaDaSilva2 aponta para outro objeto.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Equals&lt;/strong&gt;&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;Para resolver esse problema em java existe um mecanismo de igualdade que vem em todo objeto, e descende da classe Object, onde vc pode testar a igualdade entre objetos através de: &lt;spam class="syntax"&gt;&lt;spam class="java" style="font-family: monospace;"&gt;primeiroObjeto.equals(segundoObjeto);&lt;/spam&gt;&lt;/spam&gt; este teste, quando não sobrescrito apenas testa se os 2 objetos são referencia de uma mesma instancia, ou seja, tem o mesmo efeito que &lt;spam class="syntax"&gt;&lt;spam class="java" style="font-family: monospace;"&gt;primeiroObjeto == segundoObjeto;&lt;/spam&gt;&lt;/spam&gt;.&lt;br /&gt;&lt;br /&gt;Antes de implementar um equals em nossos objetos é preciso saber de cinco regras.&lt;br /&gt;Equals...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;É reflexivo: para qualquer qualquer referencia não nula a, a.equals(a) tem sempre que ser verdadeiro, ou seja, um objeto é sempre igual a se mesmo.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;É simétrico: para quaisquer referencias não nulas de a e b, a.equals(b) so poderá retornar verdade se b.equals(a) retornar verdade, o mesmo raciocinio vale para falso.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;É transitivo: para quisquer referencias não nulas de a,b e c, se a.equals(b) e b.equals(c) são verdade então também tem que ser verdade que a.equals(c).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;É consistente - para quaisquer referencias não nulas de a e b, multiplas invocações de a.equals(b) terá sempre que retornar true ou sempre retornar false, enquanto informações usadas na comparação do equals não sejam alteradas.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;O resultado de equals() entre um objeto e nulo deve retornar sempre falso, a.equals(null) é sempre falso.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Com essa ideia podemos pensar em como implementar o equals para nossa classe Pessoa, sabemos que, duas Pessoas de mesmo nome podem ser diferente, portanto esse não pode ser nosso parametro para teste. Duas pessoas não podem ter o mesmo número de CPF, então este número é unico, e pode identificar uma pessoa, sendo assim nosso teste de igualdade entre duas pessoa pode ser&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;@Override&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;boolean&lt;/span&gt; equals&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AObject+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Object&lt;/span&gt;&lt;/a&gt; obj&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;obj == &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;; &lt;span class="co1"&gt;//nenhum objeto pode ser igual a null&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;!obj &lt;span class="kw2"&gt;instanceof&lt;/span&gt; Pessoa&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &lt;span class="co1"&gt;//uma pessoa só pode ser igual a outra pessoa&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;final&lt;/span&gt; Pessoa other = &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Pessoa&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; obj;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;getCpf&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; == &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="co1"&gt;//se não houver CPF não há como testar as duas pessoas.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; getCpf&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;equals&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;other.&lt;span class="me1"&gt;getCpf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;//duas pessoas serão iguais...&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;//se seus CPFs forem iguais...&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;HashCode&lt;/strong&gt;&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;Assim como há um teste de igualdade, Java ainda dispoem de outro teste, onde é possivel rapidamente, através de integer, restringir o campo de igualdade, através de hashCode(). assim como equals, o hashCode segue um contrato descrito abaixo:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;É constante: A qualquer momento durante a excecução de um programa java, o método hashCode deve constantemente retornar o mesmo inteiro, enquanto informações usadas na comparação do equals não sejam alteradas. O hashCode não precisa ser constante de uma execução da aplicação para outra.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Se dois objetos a e b, são iguais, a.equals(b) retorna verdadeiro, então os inteiros produzidos por a e b devem ser os mesmos, ou seja a.hashCode() == b.hashCode()&lt;/li&gt;&lt;br /&gt;&lt;li&gt;O inverso não é necessariamente verdadeiro, dois objetos que produzirem o mesmo hashCode podem ser diferentes&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Diante disso a utilização do hashCode é principalmente para excluir igualdade, ou seja, ele serve como uma peneira, e é largamente utilizado por Collection em buscas como contains, remove, removeAll, retainAll entre outras coisas. A ideia é se os hashCode são diferentes então não é preciso testar a igualdade, pois já se garante que os objetos não serão iguais, poupando processamento no momento da busca, pois hashCode usa um calculo com int, que consome pouco processo, geralmente bem menos que o equals.&lt;br /&gt;&lt;br /&gt;Existem varias estrategias para calculo do hashCode, desde a mais simples, onde vc praticamente exclui a funcionalidade do hashCode, deixando seu valor constante para qualquer objeto.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;@Override&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; hashCode&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Este método acima, funciona e respeita as regras de contrato de hashCode, porem seu programa poderá perder em velocidade. É extremamente desaconselhavel o uso de hashCode constante para qualquer objeto, pois várias funcionalidade que otimizam processos de busca não terão serventia com um hashCode mau projetado.&lt;br /&gt;&lt;br /&gt;A melhor estratégia para hashCode é olhar para equals, e verificar como a igualdade é exegida, e assim montar um hashCode, concetenando os hashCode dos objetos que fazem a igualdade e designando um peso para as propriedades.&lt;br /&gt;&lt;br /&gt;Por exemplo, para nossa classe Pessoa uma boa estrategia de hashCode seria&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;@Override&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;int&lt;/span&gt; hashCode&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;int&lt;/span&gt; hash = &lt;span class="nu0"&gt;7&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; hash = &lt;span class="nu0"&gt;23&lt;/span&gt; * hash + &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;getCpf&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; != &lt;span class="kw2"&gt;null&lt;/span&gt; ? getCpf&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;hashCode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; : &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; hash;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;O número 7 contido nesse hashCode é apenas um número randomico para startar o hashCode, e diferenciar de outros objetos, por exemplo, um objeto empresa poderia iniciar por 3. o número 23 é outro número randomico, usado para quando há varias propriedades e escalar o hashCode entre as varias propriedade que definem um objeto igual.&lt;br /&gt;&lt;br /&gt;Como no exemplo acima usamos o hashCode da string cpf, e como String tem seu hashCode bem implementando, podemos assim garantir que sempre que os CPF forem iguais os hashCode serão iguais.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Conclusão&lt;/em&gt;&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;A igualdade entre objetos é uma parte fundamental da programação, e é uma das necessidades basica de logica, saber se dois objetos são iguais.&lt;br /&gt;&lt;br /&gt;A implementação destes dois métodos é importante, e deve ser implementado em todas as classes instanciáveis do projeto, de forma a prover mecanismos corretos de comparação de igualdade (equals), assim como uma forma de otimizar os processos de busca (hashCode).&lt;br /&gt;&lt;br /&gt;Muitos programadores só começam a entender a real necessidade da correta implementação destes dois métodos ao utilizar mais largamente a &lt;em&gt;Java Collection Framework&lt;/em&gt; do pacote java.util, pois varios de seus métodos como contains, removeAll, remove, ratainAll ... falham quando equals não esta corretamente implementado, e perdem perfomance ou falham quando hashCode não esta otimizado ou corretamente implementando.&lt;br /&gt;&lt;BR&gt;&lt;br /&gt;&lt;BR&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9086858542017565627-6782715120523132507?l=java-i9se.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/6782715120523132507/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://java-i9se.blogspot.com/2009/04/igualdade-em-java-equals-e-hashcode.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/6782715120523132507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/6782715120523132507'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/2009/04/igualdade-em-java-equals-e-hashcode.html' title='Igualdade em java - equals() e hashCode()'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9086858542017565627.post-538631786517028738</id><published>2009-04-02T10:40:00.006-03:00</published><updated>2009-04-02T15:26:19.565-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='collection'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='coleção'/><category scheme='http://www.blogger.com/atom/ns#' term='busca'/><category scheme='http://www.blogger.com/atom/ns#' term='utils'/><category scheme='http://www.blogger.com/atom/ns#' term='coleções'/><title type='text'>CollectionUtils e Filter&lt;T&gt; Manipulando e criando buscas.</title><content type='html'>A algum tempo atrás eu andava com uma dúvida de como realizar buscas genéricas em uma &lt;em&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Collection.html"&gt;Collection&lt;/a&gt;&lt;t&gt; &lt;/em&gt;tipada, ate que um colega &lt;a href="http://sergiotaborda.wordpress.com/about/"&gt;Sérgio Taborda&lt;/a&gt; me sugeriu o uso de uma interface muito simples.&lt;br /&gt;&lt;br /&gt;A ideia é muito simples cria-se uma interface chamada &lt;em&gt;Filter&amp;lt;T&amp;gt; &lt;/em&gt;que é um contrato, que relata como deve ser o objeto que queremos encontrar, e então cria-se rotinas simples baseando neste contrato (a interface) para buscas.&lt;br /&gt;&lt;br /&gt;interface &lt;em&gt;&lt;strong&gt;Filter&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* Filtro de objeto, que testa se um obejto candidato T confere com o filtro.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* @author Tomaz Lavieri&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* @param &amp;lt;T&amp;gt; o tipo de objetos que o filtro testa.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* @see CollectionUtils&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;interface&lt;/span&gt; Filter&amp;lt;T&amp;gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Verifica se o objeto candidato passa pelo filtro.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @param candidate Objeto candidato.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @return &amp;nbsp;&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; - caso o candidato passe no filtro.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; - caso o candidato não pesse pelo filtro.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;boolean&lt;/span&gt; match&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;T candidate&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;É com essa ideia do filtro, que se cria um critério para buscas em coleções, por exemplos, vamo supor que agente tem uma classe chamada Pessoa e que queremos buscar todas as pessoas que contenham o nome "João" e que a idade seja maior ou igual a 18 anos.&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;Filter&amp;lt;Pessoa&amp;gt; joaoMaioresDe18 = &lt;span class="kw2"&gt;new&lt;/span&gt; Filter&amp;lt;Pessoa&amp;gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw4"&gt;boolean&lt;/span&gt; match&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Pessoa candidate&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;boolean&lt;/span&gt; nomeOk = candidate.&lt;span class="me1"&gt;getNome&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; != &lt;span class="kw2"&gt;null&lt;/span&gt; ? &lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; candidate.&lt;span class="me1"&gt;getNome&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;toLowerCase&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;contains&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;joão&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; :&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; nomeOk &amp;amp;&amp;amp; candidate.&lt;span class="me1"&gt;getIdade&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &amp;gt;= &lt;span class="nu0"&gt;18&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora temos um critério de busca que foi guardado na variável &lt;span class="syntax"&gt;&lt;span class="java"  style="font-family:monospace;"&gt;&lt;span class="de1"&gt;joaoMaioresDe18&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; e podemos checar facilmente se qualquer pessoa passa pelo criterio utilizando &lt;span class="syntax"&gt;&lt;span class="java"  style="font-family:monospace;"&gt;&lt;span class="de1"&gt;joaoMaioresDe18.&lt;span class="me1"&gt;match&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;pessoa&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; este retorna true caso a pessoa seja um joão maior de 18 anos.&lt;br /&gt;&lt;br /&gt;Agora podemos criar uma rotina para buscar em uma lista, todas as pessoas que pertençam ao criterio informado, ficando assim:&lt;br /&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;List&amp;lt;Pessoa&amp;gt; pessoas = getAllPessoas&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;//abstraindo como essa lista é obtida.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;List&amp;lt;Pessoa&amp;gt; resultado = &lt;span class="kw2"&gt;new&lt;/span&gt; ArrayList&amp;lt;Pessoa&amp;gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;//guarda o resultado&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Pessoa pessoa : pessoas&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="co1"&gt;//realizando a busca&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;joaoMaioresDe18.&lt;span class="me1"&gt;match&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;pessoa&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; resultado.&lt;span class="me1"&gt;add&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;pessoa&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Após isto, temos em resultado, todas as pessoas que contém o nome "joão" e que são maiores de idade.&lt;br /&gt;&lt;br /&gt;Ficou bom, mais o processo pode ser automatizado e tornar-se ainda melhor, para isso é criado uma classe utilitária chamada &lt;em&gt;&lt;strong&gt;CollectionUtils&lt;/strong&gt;&lt;/em&gt; onde podemos guardar rotinas como: &lt;ol&gt;&lt;li&gt;Buscar todos os resultados que coincidem com o filtro - &lt;em&gt;&lt;span style="color:#000099;"&gt;findAllMatch&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Buscar todos os resultados que não coincidem com o filtro - &lt;em&gt;&lt;span style="color:#000099;"&gt;findAllNotMatch&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Buscar o primeiro resultado que coincidir com o filtro - &lt;em&gt;&lt;span style="color:#000099;"&gt;findFirstMatch&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Buscar o primeiro resultado que não coincir com o filtro - &lt;em&gt;&lt;span style="color:#000099;"&gt;findFirstNotMatch&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Reter na lista total apenas os objetos que coincidirem com o filtro - &lt;em&gt;&lt;span style="color:#000099;"&gt;retainAll&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Remover da lista total todos os objetos que coincidirem com o filtro - &lt;em&gt;&lt;span style="color:#000099;"&gt;removeAll&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Adciona a uma segunda lista todos os itens da primeira lista que coincidirem com o filtro - &lt;em&gt;&lt;span style="color:#000099;"&gt;addAllMatch&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Adciona a uma segunda lista todos os itens da primeira lista que não coincidirem com o filtro - &lt;em&gt;&lt;span style="color:#000099;"&gt;addAllNotMatch&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Colocarei aqui apenas um trecho de &lt;a href="http://pastebin.com/f9d80cb7"&gt;CollectionUtils&lt;/a&gt; e o link para o código completo segue aqui &lt;a href="http://pastebin.com/f9d80cb7"&gt;http://pastebin.com/f9d80cb7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;class &lt;strong&gt;&lt;em&gt;CollectionUtils&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;div class="syntax"&gt;&lt;div class="java" style="font-family: monospace; font-size: 80%;"&gt;&lt;ol&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import java.util.ArrayList;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import java.util.Collection;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co2"&gt;import java.util.Iterator;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="co2"&gt;import java.util.List;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* Classe utilitária para manipular coleções&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;* @author Tomaz Lavieri&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; CollectionUtils &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Não é possivel instaciar CollectionUtils.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;private&lt;/span&gt; CollectionUtils&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Busca todos os objetos &amp;lt;b&amp;gt;T&amp;lt;/b&amp;gt; na lista de &amp;lt;tt&amp;gt;candidates&amp;lt;/tt&amp;gt; que&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* conferem com o &amp;lt;tt&amp;gt;filter&amp;lt;/tt&amp;gt;.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;lt;BR&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;lt;BR&amp;gt;Tem o resultado inverso a {@link #findAllNotMatch(Collection, Filter)}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @param &amp;nbsp; &amp;lt;T&amp;gt; o tipo de objeto a ser buscado.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @param &amp;nbsp; candidates a coleção de condidatos aonde deseja-se realizar a&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;busca.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @param &amp;nbsp; filter o filtro que será usado para &amp;lt;b&amp;gt;&amp;lt;u&amp;gt;aceitar&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt; um&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;candidato no resultado da busca.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @return &amp;nbsp;todos os itens que passaram pelo filtro.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @see #findAllNotMatch(Collection, Filter)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;static&lt;/span&gt; &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; findAllMatch&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Collection&amp;lt;? &lt;span class="kw2"&gt;extends&lt;/span&gt; T&amp;gt; candidates,&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Filter&amp;lt;T&amp;gt; filter&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List&amp;lt;T&amp;gt; matchs = &lt;span class="kw2"&gt;new&lt;/span&gt; ArrayList&amp;lt;T&amp;gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addAllMatch&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;candidates, filter, matchs&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; matchs;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="coMULTI"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Adciona a coleção &amp;lt;tt&amp;gt;recipient&amp;lt;/tt&amp;gt; todos os objetos &amp;lt;tt&amp;gt;T&amp;lt;/tt&amp;gt; da lista&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* de &amp;lt;tt&amp;gt;candidates&amp;lt;/tt&amp;gt; que coincidirem com o &amp;lt;tt&amp;gt;filter&amp;lt;/tt&amp;gt;.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;lt;BR&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;lt;BR&amp;gt;Adciona o inverso dos itens de &amp;lt;tt&amp;gt;candidates&amp;lt;/tt&amp;gt; que&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* {@link #addAllNotMatch(Collection, Filter, Collection)} adcionaria.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @param &amp;nbsp; &amp;lt;T&amp;gt; o tipo de objeto a ser adcionado.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @param &amp;nbsp; candidates a coleção de candidatos a serem adcionados ao&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;tt&amp;gt;recipient&amp;lt;/tt&amp;gt;.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @param &amp;nbsp; filter o filtro que será usado para &amp;lt;b&amp;gt;&amp;lt;u&amp;gt;aceitar&amp;lt;/u&amp;gt;&amp;lt;/b&amp;gt; um&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;candidato a ser adcionado ao &amp;lt;tt&amp;gt;recipient&amp;lt;/tt&amp;gt;.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @param &amp;nbsp; recipient coleção onde os objetos serão adicionados.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @see #addAllNotMatch(Collection, Filter, Collection)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="coMULTI"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;static&lt;/span&gt; &amp;lt;T&amp;gt; &lt;span class="kw4"&gt;void&lt;/span&gt; addAllMatch&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Collection&amp;lt;? &lt;span class="kw2"&gt;extends&lt;/span&gt; T&amp;gt; candidates,&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Filter&amp;lt;T&amp;gt; filter, &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3ACollection+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span class="kw3"&gt;Collection&lt;/span&gt;&lt;/a&gt; recipient&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;for&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;T object : candidates&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;filter.&lt;span class="me1"&gt;match&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;object&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; recipient.&lt;span class="me1"&gt;add&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;object&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="co1"&gt;//... restante da classe segue no link indicado&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class="li2"&gt;&lt;div class="de2"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora com essas duas classes, basta criar um filtro, e mandar junto com a coleção, para CollectionUtils e receber os resultados.&lt;br /&gt;&lt;br /&gt;Desta forma espera-se aumentar a produtividade, e facilitar a manipulação de coleções.&lt;br /&gt;&lt;BR&gt;&lt;BR&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/f354ad34"&gt;Filter.java&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pastebin.com/f9d80cb7"&gt;CollectionUtils.java&lt;/a&gt;&lt;br /&gt;&lt;BR&gt;&lt;BR&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9086858542017565627-538631786517028738?l=java-i9se.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java-i9se.blogspot.com/feeds/538631786517028738/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://java-i9se.blogspot.com/2009/04/collectionutils-e-filter-manipulando-e.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/538631786517028738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9086858542017565627/posts/default/538631786517028738'/><link rel='alternate' type='text/html' href='http://java-i9se.blogspot.com/2009/04/collectionutils-e-filter-manipulando-e.html' title='CollectionUtils e Filter&amp;lt;T&amp;gt; Manipulando e criando buscas.'/><author><name>Tomaz Lavieri</name><uri>http://www.blogger.com/profile/13459065266453711806</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_vwm7goc9kUA/St7jjtWHjtI/AAAAAAAAAB8/lr_K52x8vDw/S220/temp.jpg'/></author><thr:total>0</thr:total></entry></feed>
