<?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-5543109741008314616</id><updated>2012-02-17T00:04:12.035-02:00</updated><category term='thread-safe'/><category term='lazy load'/><category term='pessoal'/><category term='suntechdays java comet javaee maringa sun sang shang'/><category term='java'/><category term='spring'/><category term='java spring validacao assert'/><category term='singleton'/><title type='text'>Eduardo Rebola - Tech Blog</title><subtitle type='html'>Compartilhando experiências em desenvolvimento de software</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eduardorebola.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eduardorebola.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eduardo Rebola Danielli</name><uri>http://www.blogger.com/profile/07270632532674146290</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_BJApd4Eonug/SZ4KIhdS-iI/AAAAAAAAAFE/mpFpxr588dM/S220/edu.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5543109741008314616.post-5304632518973665299</id><published>2009-12-10T22:09:00.005-02:00</published><updated>2009-12-11T01:08:28.698-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='suntechdays java comet javaee maringa sun sang shang'/><title type='text'>Sun Tech Days 2009</title><content type='html'>Olá amigos!&lt;br /&gt;&lt;br /&gt;Faz tempo hein! Tanta coisa passou desde meu último post que eu nem sei por onde começar. Bom, acho mais fácil começar pelo mais recente e marcante fato que ocorreu nessa semana: &lt;span style="font-weight: bold;"&gt;Sun Tech Days 2009&lt;/span&gt;, dias 8 e 9/12 em São Paulo.&lt;br /&gt;&lt;br /&gt;Depois de muitos anos lamentando a falta de condições para poder participar, finalmente consegui estar presente. Não quis esperar a euforia passar e resolvi retomar imediatamente o blog em grande estilo, comentando e recomendando o evento.&lt;br /&gt;&lt;br /&gt;Pra começar, lá estava ele, &lt;span style="font-weight: bold;"&gt;James Gosling, ao vivo e a cores&lt;/span&gt;. Cor na verdade ele só tem duas: branca e vermelha. Praticamente um urso polar (sim, ele é grande) e aquele vozeirão que muitos já devem ter ouvido na internet. Simpatia pura, infelizmente pouco acessível p/ o público geral. Não consegui tirar uma foto com ele, ao contrário dos meus ex-colegas de &lt;a href="http://www.insula.com.br/"&gt;Insula&lt;/a&gt; &lt;a href="http://www.yanaga.com.br/"&gt;Edson Yanaga&lt;/a&gt; e Marcelo H Felipe, que não perderam tempo p/ ficar tirando sarro da minha cara&lt;br /&gt;&lt;br /&gt;Nesta edição, o evento foi organizado em 4 tracks: Enterprise Computing, Client-Side Computing, OpenSolaris e Hands-on Lab. Eu procurei priorizar as apresentações sobre Java EE 6, porém felizmente consegui participar de um hands-on sobre Ajax Push (Comet) e assistir uma introdução ao OpenSolaris. Confesso não perder 1 minuto sequer com JavaFX, tecnologia bastante presente no evento, pois acredito que não irá fazer parte da minha vida por um bom tempo.&lt;br /&gt;&lt;br /&gt;Sobre os palestrantes, eu achei o &lt;a href="http://www.javapassion.com/"&gt;Sang Shin&lt;/a&gt; disparado o mais competente. As apresentações mais requisitados eram dele, sempre conduzidas com muita didática, organização e clareza. Apesar de ser chinês, seu inglês é fluente e de fácil compreensão. Muito simpático, me deu uma camiseta do evento em mãos (sim, eu pedi na cara dura). Saca só a foto que tirei com ele:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BJApd4Eonug/SyGyK9xXD6I/AAAAAAAAAGQ/g7Cnj9zqP0Y/s1600-h/DSC04190.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 400px;" src="http://2.bp.blogspot.com/_BJApd4Eonug/SyGyK9xXD6I/AAAAAAAAAGQ/g7Cnj9zqP0Y/s400/DSC04190.JPG" alt="" id="BLOGGER_PHOTO_ID_5413804128526077858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Um aviso ao pessoal de &lt;span style="color: rgb(255, 0, 0);"&gt;Maringá&lt;/span&gt;: Não percam de forma alguma &lt;/span&gt;&lt;a style="font-weight: bold;" href="https://redfoot.dev.java.net/"&gt;a edição local do Sun Tech Days dia 11/12!&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; O &lt;span style="color: rgb(255, 0, 0);"&gt;Sang Shin&lt;/span&gt; em pessoa estará aí falando sobre Java EE 6. Se você não pôde ir pra São Paulo, não perca essa oportunidade única!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;Por enquanto é isso pessoal. Vou tentar manter o blog atualizado com mais frequência e trazer sempre assuntos interessantes para vocês. 2010 promete, novos ares (pra quem não sabe ainda, estou trabalhando em Brasília) e novos projetos.&lt;br /&gt;&lt;br /&gt;Um grande abraço, e até a próxima!&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5543109741008314616-5304632518973665299?l=eduardorebola.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardorebola.blogspot.com/feeds/5304632518973665299/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://eduardorebola.blogspot.com/2009/12/sun-tech-days-2009.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/5304632518973665299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/5304632518973665299'/><link rel='alternate' type='text/html' href='http://eduardorebola.blogspot.com/2009/12/sun-tech-days-2009.html' title='Sun Tech Days 2009'/><author><name>Eduardo Rebola Danielli</name><uri>http://www.blogger.com/profile/07270632532674146290</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_BJApd4Eonug/SZ4KIhdS-iI/AAAAAAAAAFE/mpFpxr588dM/S220/edu.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BJApd4Eonug/SyGyK9xXD6I/AAAAAAAAAGQ/g7Cnj9zqP0Y/s72-c/DSC04190.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5543109741008314616.post-2620553047445085228</id><published>2009-04-04T12:22:00.006-03:00</published><updated>2009-04-04T13:22:37.356-03:00</updated><title type='text'>Thread.sleep(2 * 30 * 24 * 60 * 60 * 1000L)</title><content type='html'>Para aqueles que acompanham meu blog (mas não comentam, ;), devem estar se perguntando o motivo do jejum de posts. Não, eu não desisti do blog. O que aconteceu, ou melhor, está acontecendo, é uma dedicação 110% no &lt;a href="http://www.insula.com.br/"&gt;trabalho&lt;/a&gt;. Peço um pouco de paciência e compreensão a todos. Assim que puder, estarei de volta com novas postagens.&lt;br /&gt;&lt;br /&gt;Abraços!&lt;br /&gt;&lt;br /&gt;PS: Pra quem não entendeu o título deste post, significa "hibernar" o blog por 2 meses, que é justamente o que aconteceu em março e vai se repetir em abril :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5543109741008314616-2620553047445085228?l=eduardorebola.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardorebola.blogspot.com/feeds/2620553047445085228/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://eduardorebola.blogspot.com/2009/04/threadsleep2-30-24-60-60-1000l.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/2620553047445085228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/2620553047445085228'/><link rel='alternate' type='text/html' href='http://eduardorebola.blogspot.com/2009/04/threadsleep2-30-24-60-60-1000l.html' title='Thread.sleep(2 * 30 * 24 * 60 * 60 * 1000L)'/><author><name>Eduardo Rebola Danielli</name><uri>http://www.blogger.com/profile/07270632532674146290</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_BJApd4Eonug/SZ4KIhdS-iI/AAAAAAAAAFE/mpFpxr588dM/S220/edu.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5543109741008314616.post-3839599399517468203</id><published>2009-03-01T09:37:00.006-03:00</published><updated>2009-03-01T10:56:16.329-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java spring validacao assert'/><title type='text'>Spring Framework: Você sabia? Parte I - Validando parâmetros</title><content type='html'>Pra começar essa série de posts sobre o lado "oculto" do Spring, vamos conhecer algumas classes utilitárias que podem evitar (drasticamente) a repetição de código para validação de parâmetros. Por exemplo, quantas vezes você já validou Strings dessa forma?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void setNome(String nome) {&lt;br /&gt;  if (nome == null || "".equals(nome)) {&lt;br /&gt;    throw new IllegalArgumentException("Nome requerido!");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Algumas vezes? Muitas vezes? Pois é, eu perdi a conta. Mas isso foi ANTES de fuçar na API do Spring:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;b&gt;import org.springframework.util.Assert;&lt;/b&gt;&lt;br /&gt;...&lt;br /&gt;public void setNome(String nome) {&lt;br /&gt;  &lt;b&gt;Assert.hasLength(nome, "Nome requerido!");&lt;/b&gt;&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;As vezes pequenos detalhes passam despercebidos e perdemos horas revirando código atrás de um problema. E se o argumento &lt;span style="font-style: italic;"&gt;nome&lt;/span&gt; for uma String não vazia contendo somente espaços em branco, por exemplo, "     " ? Se &lt;span style="font-weight: bold;"&gt;não&lt;/span&gt; for permitido, o código precisa de reparos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void setNome(String nome) {&lt;br /&gt;  Assert.&lt;span style="color:red;"&gt;&lt;b&gt;hasText&lt;/b&gt;&lt;/span&gt;(nome, "Nome requerido!");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;As vezes a coisa pode tão simples quanto um null-check:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void setValorObrigatorio(Object obj) {&lt;br /&gt;  if (obj == null) {&lt;br /&gt;    throw new IllegalArgumentException("Valor obrigatório!");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Não tem desculpa. Antes 1 linha do que 3:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void setValorObrigatorio(Object obj) {&lt;br /&gt;  Assert.&lt;span style="color:red;"&gt;&lt;b&gt;notNull&lt;/b&gt;&lt;/span&gt;(obj, "Valor obrigatório!");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As vezes a coisa pode ser mais complicada. Por exemplo, Arrays ou Collections que não podem ser vazios:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void setArrayNaoVazio(Object[] array) {&lt;br /&gt;  if (array == null || array.length == 0) {&lt;br /&gt;    throw new IllegalArgumentException("Array não pode ser vazio!");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setCollectionNaoVazia(Collection collection) {&lt;br /&gt;  if (collection == null || collection.isEmpty() == 0) {&lt;br /&gt;    throw new IllegalArgumentException("Collection não pode ser vazia!");&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Com certeza não precisamos fazer isso...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void setArrayNaoVazio(Object[] array) {&lt;br /&gt;  Assert.&lt;span style="color:red;"&gt;&lt;b&gt;notEmpty&lt;/b&gt;&lt;/span&gt;(array, "Array não pode ser vazio!");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setCollectionNaoVazia(Collection collection) {&lt;br /&gt;  Assert.&lt;span style="color:red;"&gt;&lt;b&gt;notEmpty&lt;/b&gt;&lt;/span&gt;(collection, "Collection não pode ser vazia!");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;E assim encerro a parte 1 desta série. Não deixem de conferir a &lt;a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/util/Assert.html"&gt;classe Assert&lt;/a&gt; por completo através da &lt;a href="http://static.springframework.org/spring/docs/2.5.x/api/index.html"&gt;documentação online&lt;/a&gt;. Há outros métodos não abordados não menos úteis do que os apresentados neste post. Vá mais longe, explore o código-fonte dela. Eu particularmente acho o Spring Framework o open source melhor documentado da atualidade.&lt;br /&gt;&lt;br /&gt;Abraço!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5543109741008314616-3839599399517468203?l=eduardorebola.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardorebola.blogspot.com/feeds/3839599399517468203/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://eduardorebola.blogspot.com/2009/03/spring-framework-voce-sabia-parte-i.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/3839599399517468203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/3839599399517468203'/><link rel='alternate' type='text/html' href='http://eduardorebola.blogspot.com/2009/03/spring-framework-voce-sabia-parte-i.html' title='Spring Framework: Você sabia? Parte I - Validando parâmetros'/><author><name>Eduardo Rebola Danielli</name><uri>http://www.blogger.com/profile/07270632532674146290</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_BJApd4Eonug/SZ4KIhdS-iI/AAAAAAAAAFE/mpFpxr588dM/S220/edu.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5543109741008314616.post-1040999302141903945</id><published>2009-02-24T22:22:00.005-03:00</published><updated>2009-02-24T23:07:58.884-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring Framework: Você sabia? (prelúdio)</title><content type='html'>Lembro como se fosse ontem quando visitei pela primeira vez o site do &lt;a href="http://springframework.org"&gt;Spring Framework&lt;/a&gt;. Naquela época eu tinha acabado de entrar no mercado de trabalho e já me deparava com projetos JSP + Servlets estruturados de forma assustadora. Tinha JDBC dentro de Servlet, de JSP, objetos duplicados sem necessidade, factories pra todo lado... Dói só de lembrar.&lt;br /&gt;&lt;br /&gt;Confesso que quando li a &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_Control"&gt;definição de IoC&lt;/a&gt; pela primeira vez, simplesmente não entendi NADA. "Esse Martin Fowler tá viajando geral"! Mas não desisti e comecei a avançar na documentação (que diga-se de passagem sempre foi ÓTIMA). Não demorou muito para concluir que aquilo era algo simplesmente genial e essencial para minha vida profissional. E foi, ou melhor, está sendo.&lt;br /&gt;&lt;br /&gt;Isso foi em meados de 2005. Spring estava na versão 1.2.x. Época de muitos XMLs (Spring, Hibernate, etc). Era preciso muita organização e convenções pra não se perder no meio de tantos beans, &lt;a href="http://springide.org/blog/"&gt;SpringIDE&lt;/a&gt; não existia.&lt;br /&gt;&lt;br /&gt;Assim que adquiri meu primeiro cartão de crédito internacional, entrei no site da &lt;a href="http://www.amazon.com"&gt;Amazon&lt;/a&gt; e comprei 2 livros de Spring: &lt;a href="http://www.amazon.com/Pro-Spring-Rob-Harrop/dp/1590594614/ref=sr_1_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1235526244&amp;amp;sr=1-2"&gt;Pro Spring&lt;/a&gt; e &lt;a href="http://www.amazon.com/Professional-Java-Development-Spring-Framework/dp/0764574833/ref=sr_1_3?ie=UTF8&amp;amp;s=books&amp;amp;qid=1235526015&amp;amp;sr=1-3"&gt;Professional Java Development with the Spring Framework&lt;/a&gt;. Outros vieram depois, mas as 2 semanas que passei lendo o Pro Spring foram essenciais para as decisões que tomei logo em sequência.&lt;br /&gt;&lt;br /&gt;Mas afinal do que se trata esse post? Vou explicar. Esse post é apenas um prelúdio da minha experiência com o Spring. Nos próximos que virão, estarei abordando recursos e funcionalidades não tão divulgados pelo framework. Não vou perder tempo mostrando as 1001 formas de fazer &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;injeção de dependência&lt;/a&gt;, ou como integrar com &lt;a href="http://hibernate.org"&gt;Hibernate&lt;/a&gt; de forma mais robusta e produtiva. Isso você acha aos montes por aí. O foco será explorar as ferramentas menos populares desse verdadeiro canivete suíço virtual.&lt;br /&gt;&lt;br /&gt;Fiquem na escuta. Parte 1 tá no forno!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5543109741008314616-1040999302141903945?l=eduardorebola.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardorebola.blogspot.com/feeds/1040999302141903945/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://eduardorebola.blogspot.com/2009/02/spring-framework-voce-sabia-preludio.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/1040999302141903945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/1040999302141903945'/><link rel='alternate' type='text/html' href='http://eduardorebola.blogspot.com/2009/02/spring-framework-voce-sabia-preludio.html' title='Spring Framework: Você sabia? (prelúdio)'/><author><name>Eduardo Rebola Danielli</name><uri>http://www.blogger.com/profile/07270632532674146290</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_BJApd4Eonug/SZ4KIhdS-iI/AAAAAAAAAFE/mpFpxr588dM/S220/edu.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5543109741008314616.post-6944874142300983046</id><published>2009-02-22T12:03:00.011-03:00</published><updated>2009-02-22T18:39:26.768-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='thread-safe'/><category scheme='http://www.blogger.com/atom/ns#' term='lazy load'/><category scheme='http://www.blogger.com/atom/ns#' term='singleton'/><title type='text'>Lazy Objects em ação!</title><content type='html'>A discussão é antiga: Lazy Loading (ou Lazy Instantiation). Antes de mais nada atenção: não estou me referindo aos problemas de Lazy Loading do Hibernate (LazyInitializationException). Me refiro a inicialização tardia de objetos complexos para fins de otimização de memória.&lt;br /&gt;&lt;br /&gt;Ao invés de longas explicações, vamos ao código:&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:small;"  &gt;&lt;pre&gt;&lt;br /&gt;import java.io.BufferedWriter;&lt;br /&gt;import java.io.FileWriter;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;public class LogFile { &lt;br /&gt;  private BufferedWriter writer;&lt;br /&gt; &lt;br /&gt;  public LogFile() {&lt;br /&gt;    openFile();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void openFile() {&lt;br /&gt;    try {&lt;br /&gt;      writer = new BufferedWriter(new FileWriter("logFile.log", true));&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void debug(String message) {&lt;br /&gt;    try {&lt;br /&gt;      writer.write("DEBUG: " + message);&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;/span&gt;Somente analisando a classe acima fica difícil assumir que haja algo de errado com ela, certo? Então vou adicionar um requisito: O arquivo de log deverá ser inicializado somente quando necessário, ou seja, na primeira invocação do método debug. Adaptar o código não chega a ser uma tarefa complicada:&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:small;"  &gt;&lt;pre&gt;&lt;br /&gt;// imports omitidos&lt;br /&gt;&lt;br /&gt;public class LogFile { &lt;br /&gt;  private BufferedWriter writer;&lt;br /&gt; &lt;br /&gt;  public LogFile() {&lt;br /&gt;    &lt;span style="font-weight: bold;color:red;" &gt;// openFile();&lt;/span&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;color:red;" &gt;// método renomeado p/ deixar claro seu funcionamento&lt;/span&gt;&lt;br /&gt;  private void &lt;span style="font-weight: bold;color:red;" &gt;openFileIfNecessary() {&lt;br /&gt;    if (writer == null) {&lt;/span&gt;&lt;br /&gt;      try {&lt;br /&gt;        writer = new BufferedWriter(new FileWriter("logFile.log", true));&lt;br /&gt;      } catch (IOException e) {&lt;br /&gt;        throw new RuntimeException(e);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void debug(String message) {&lt;br /&gt;    try {&lt;br /&gt;      &lt;span style="font-weight: bold;color:red;"&gt;openFileIfNecessary();&lt;/span&gt;writer.write("DEBUG: " + message);&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;/span&gt;Problema resolvido, certo? Sim e não. Caso esta classe seja utilizada em um ambiente single thread (ex. GWT), sim. Caso contrário, precisamos consertar o método openFileIfNecessary para deixar a classe thread-safe. Aplicando o conceito &lt;a href="http://www.ibm.com/developerworks/java/library/j-dcl.html"&gt;double-checked locking&lt;/a&gt;:&lt;span style=";font-family:courier new;font-size:small;"  &gt;&lt;pre&gt;&lt;br /&gt;// imports omitidos&lt;br /&gt;&lt;br /&gt;public class LogFile { &lt;br /&gt;  private &lt;span style="font-weight: bold;color:red;" &gt;volatile&lt;/span&gt; BufferedWriter writer;&lt;br /&gt; &lt;br /&gt;  public LogFile() {&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void openFileIfNecessary() {&lt;br /&gt;    if (writer == null) {&lt;br /&gt;      synchronized (this) {&lt;br /&gt;        if (writer == null) {&lt;br /&gt;          try {&lt;br /&gt;            writer = new BufferedWriter(new FileWriter("logFile.log", true));&lt;br /&gt;          } catch (IOException e) {&lt;br /&gt;            throw new RuntimeException(e);&lt;br /&gt;          }&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void debug(String message) {&lt;br /&gt;    try {&lt;br /&gt;      openFileIfNecessary();&lt;br /&gt;      writer.write("DEBUG: " + message);&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;/span&gt;Apesar do exemplo não ser tão ilustrativo como eu esperava, experimente repetir esse comportamento com outros atributos "pesados". O trabalho se torna repetitivo e você acabará: 1) se conformando; 2) criando uma classe de suporte. Comigo acontenceu a opção 2, a qual compartilho abaixo:&lt;span style=";font-family:courier new;font-size:small;"  &gt;&lt;pre&gt;&lt;br /&gt;package com.blogspot.eduardorebola.lazyobject;&lt;br /&gt;&lt;br /&gt;public abstract class LazyObject&amp;lt;T&amp;gt; {&lt;br /&gt;  private volatile T lazyObject;&lt;br /&gt;&lt;br /&gt;  protected abstract T createObject();&lt;br /&gt;&lt;br /&gt;  public T get() {&lt;br /&gt;    return get(true);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public T get(boolean createIfNecessary) {&lt;br /&gt;    if (createIfNecessary &amp;amp;&amp;amp; lazyObject == null) {&lt;br /&gt;      synchronized (this) {&lt;br /&gt;        if (lazyObject == null) {&lt;br /&gt;          lazyObject = createObject();&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    return lazyObject;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public final boolean isLoaded() {&lt;br /&gt;    if (lazyObject == null) {&lt;br /&gt;      synchronized (this) {&lt;br /&gt;        return lazyObject != null;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    return true;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;Perceba como a classe controla a criação do objeto e garante que ele se comporte como um singleton. Todos os pontos discutidos até o momento (inicialização tardia, thread-safe) estão implementados numa classe só, agora basta estendê-la com o tipo desejado e implementar a lógica de construção do objeto.&lt;br /&gt;&lt;br /&gt;Infelizmente há algumas limitações nesta implementação vinculadas ao construtor do objeto encapsulado: 1) Não é possível passar parâmetros; 2) Não se pode lançar checked exceptions. Há mais uma limitação referente ao double-checked locking: Só funciona a partir do Java 5.&lt;br /&gt;&lt;br /&gt;Adaptando o exemplo anterior, temos o seguinte resultado:&lt;span style=";font-family:courier new;font-size:small;"  &gt;&lt;pre&gt;&lt;br /&gt;package com.blogspot.eduardorebola.lazyobject;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedWriter;&lt;br /&gt;import java.io.FileWriter;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;&lt;br /&gt;public class LogFile { &lt;br /&gt;  private &lt;span style="font-weight: bold;color:red;"&gt;LazyObject&amp;lt;BufferedWriter&amp;gt; writer;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  public LogFile() {&lt;br /&gt;    &lt;span style="font-weight: bold;color:red;"&gt;writer = new LazyObject&amp;lt;BufferedWriter&amp;gt;() {&lt;br /&gt;      protected BufferedWriter createObject() {&lt;br /&gt;        try {&lt;br /&gt;          writer = new BufferedWriter(new FileWriter("logFile.log", true));&lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;          throw new RuntimeException(e);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    };&lt;/span&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void debug(String message) {&lt;br /&gt;    try {&lt;br /&gt;      &lt;span style="font-weight: bold;color:red;"&gt;writer.get()&lt;/span&gt;.write("DEBUG: " + message);&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;Dúvidas, sugestões, melhorias? Deixe seu comentário. A comunidade agradece! Até a próximo!&lt;br /&gt;&lt;br /&gt;Rebola.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5543109741008314616-6944874142300983046?l=eduardorebola.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardorebola.blogspot.com/feeds/6944874142300983046/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://eduardorebola.blogspot.com/2009/02/lazy-objects-em-acao.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/6944874142300983046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/6944874142300983046'/><link rel='alternate' type='text/html' href='http://eduardorebola.blogspot.com/2009/02/lazy-objects-em-acao.html' title='Lazy Objects em ação!'/><author><name>Eduardo Rebola Danielli</name><uri>http://www.blogger.com/profile/07270632532674146290</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_BJApd4Eonug/SZ4KIhdS-iI/AAAAAAAAAFE/mpFpxr588dM/S220/edu.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5543109741008314616.post-8082499984005402747</id><published>2009-02-19T21:57:00.005-03:00</published><updated>2009-02-19T23:19:17.236-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pessoal'/><title type='text'>Por que decidi montar um blog?</title><content type='html'>&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Hello&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;World&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;Blog é algo revolucionário. Me lembra muito a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;idéia&lt;/span&gt; de um diário, porém sem se preocupar em escondê-lo. Nele nós desabafamos, escrevemos coisas que deram certo e coisas que ainda nos &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;incomodam&lt;/span&gt;. Após cada &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;postagens&lt;/span&gt;, ficamos ansiosos na espera de um comentário, seja bom ou ruim, pois só vai valer a pena se alguém do outro lado dizer o que pensa a respeito.&lt;br /&gt;&lt;br /&gt;Minha &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;idéia&lt;/span&gt; nesse espaço é estar expondo minhas experiências profissionais. Como &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;desenvolvedor&lt;/span&gt; de sistemas, cada dia me deparo com um novo problema, um velho problema ou um futuro problema. Estamos constantemente tomando decisões de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;projeto&lt;/span&gt;, de implementação, de gerência, etc. O que for possível publicar, publicarei. Convido todos meus colegas de profissão a dividirem suas experiências com os demais leitores deste blog.&lt;br /&gt;&lt;br /&gt;Se não criei um blog antes foi por saber que não estava preparado para &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;mantê&lt;/span&gt;-lo. Se for para postar mensalmente, não vale a pena. Blog é compromisso. Todo dia você vive algo novo, presencia uma situação diferente. Sempre há algo para dividir.&lt;br /&gt;&lt;br /&gt;Meu muito obrigado a você que chegou até essa última linha. Até mais ver!&lt;br /&gt;&lt;br /&gt;Rebola.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5543109741008314616-8082499984005402747?l=eduardorebola.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eduardorebola.blogspot.com/feeds/8082499984005402747/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://eduardorebola.blogspot.com/2009/02/por-que-decidi-montar-um-blog.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/8082499984005402747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5543109741008314616/posts/default/8082499984005402747'/><link rel='alternate' type='text/html' href='http://eduardorebola.blogspot.com/2009/02/por-que-decidi-montar-um-blog.html' title='Por que decidi montar um blog?'/><author><name>Eduardo Rebola Danielli</name><uri>http://www.blogger.com/profile/07270632532674146290</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_BJApd4Eonug/SZ4KIhdS-iI/AAAAAAAAAFE/mpFpxr588dM/S220/edu.JPG'/></author><thr:total>2</thr:total></entry></feed>
