Injeção de Dependência em Java

Injeção de dependência (Depedency Injection ou apenas DI) é um design pattern utilizado para manter o acoplamento fraco entre classes ou módulos do sistema. O foco principal é fazer com que uma classe não tenha conhecimento de como instanciar um objeto de um tipo do qual é dependente.

Inject Coffee - Injeção Dependência em Java

Neste post vou apresentar as principais ferramentas utilizadas com essa finalidade em Java, mas antes uma explicação inicial sobre o assunto. Dê uma olhada no código Java abaixo:

Continue reading »

Evento ITCare-PR em Curitiba 14/05/11

Banner IT Care Paraná

Quer assistir palestras interessantes e ao mesmo tempo ajudar as vítimas das fortes chuvas que atingiram o Paraná? Este é o objetivo do evento IT Care-PR que contará com a presença de Roger Brinkley da Oracle.

Eu participarei do evento com a palestra TDD com Java, onde vou explicar os fundamentos da metodologia Test Driven Development com exemplos na linguagem Java.

Além de Java, o evento também terá palestras sobre .NET, Android, iOS (iPhone) e Scrum.

Quando: 14/05/2011
Onde: Universidade Positivo - Auditório 2 da Escola de Negócios (Bloco Amarelo)
Palestras: Clique aqui
Palestrantes: Clique aqui
Inscrição: Clique aqui
Entrada: Alimentos não-perecíveis, material de limpeza e água mineral

Simulador online de iPad

Com este simulador online é possível visualizar alguns aplicativos nativos e navegar na internet como se estivesse utilizando o iPad.

Simulador iPad Online

Simulador iPad Online

Isso facilita a vida dos desenvolvedores web que não possuem um iPad. Para visualizar um site como se estivesse utilizando o dispositivo, basta entrar no navegador e acessar a url que deseja testar.

O desenvolvedor do simulador disponibilizou o código-fonte no github: https://github.com/altryne/Ipad-Simulator

Annotation com atributo “default null” funciona?

As annotations podem ter atributos que são obrigatórios ou opcionais, sendo que os opcionais a linguagem exige que se defina um valor padrão. Para deixar um atributo que não  seja primitivo como opcional, nada mais óbvio do que definí-lo com “default null”, certo? Mas será que isso funciona?
Arroba Annotation
O exemplo abaixo apresenta como deixamos atributos da annotation com valores padrões:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface GuardarLogAlteracao {
   String value() default "";
   boolean exibirValor() default true;
}
Observe que “value” possui como valor padrão uma string vazia e “exibirValor” possui “true”. Essa annotation poderia ser utilizado como  o seguinte exemplo:
public class Usuario {
   @GuardarLogAlteracao("Nome do usuário")
   private String nome;

   @GuardarLogAlteracao(value = "Senha", exibirValor = false)
   private String senha;

   //getters e setters...
}
Para “nome” o atributo “exibirValor” será “true”. Voltando a questão principal, se adicionarmos um atributo que seja um objeto, poderíamos definí-lo como nulo por padrão como abaixo:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface GuardarLogAlteracao {
   String value() default "";
   boolean exibirValor() default true;
   Class<? extends FormatadorLog> formatador() default null;
}
Então utilizaríamos a annotation dessa forma, onde por padrão “formator” é nulo para “nome” e “senha”:
public class Usuario {
   @GuardarLogAlteracao("Nome do usuário")
   private String nome;

   @GuardarLogAlteracao(value = "Senha", exibirValor = false)
   private String senha;

   @GuardarLogAlteracao(formatador = FormatadorData.class)
   private Date dataAlteracao;

   //getters e setters...
}
Aí vem o problema: isso não compila. O erro retornado pelo compilador é “The value for annotation attribute GuardarLogAlteracao.formatador must be a class literal“.
O motivo disso é que o compilador bloqueia valores nulos para os campos das annotations para evitar o uso incorreto como “@GuardarLogAlteracao(value = null)“. Isso facilita para quem for implementar o código que tratará a annotation, pois não será necessário validar se os campos possuem valor diferente de nulo e lançar NullPointerException.  Na JSR-308 existe um texto que diz respeito a essa questão.
Para contornar essa limitação encontrei algumas pessoas que utilizaram formas altenativas (pra não chamar de “xunxo” ou “gambiarra”) como esta:
public @interface Optional {
public String value() default NULL;
   public static final NULL = "THIS IS A SPECIAL NULL VALUE" +
      "- DO NOT USE";
}
Pessoalmente eu não gosto desse tipo de solução. Minha sugestão é tentar remodelar a idéia inicial, por exemplo, separando o atributo opcional em outra annotation:
public class Usuario {
   @GuardarLogAlteracao("Nome do usuário")
   private String nome;

   @GuardarLogAlteracao(value = "Senha", exibirValor = false)
   private String senha;

   @GuardarLogAlteracao("Data de Alteração")
   @FormatadorLog(FormatadorData.class)
   private Date dataAlteracao;

   //getters e setters...
}
Apesar de ser necessário mais uma annotation, essa seria uma solução mais elegante para o problema. E você, tem outra sugestão?

Geração de XML a partir de XSD

Precisei gerar um arquivo XML de exemplo a partir de um schema (XSD) e deixo aqui uma dica rápida pra quem precisar. Será necessário o Eclipse com o pacote WTP instalado.
Adicione o arquivo XSD em um projeto, clique com o botão direito e vá em “Generate” e depois em “XML File…”. Um wizard será aberto e é só seguir as instruções para gerar o XML.

Wizard geração de XML a partir de XSD no Eclipse

Code Bubbles: Uma IDE inovadora

Sendo você um desenvolvedor que utiliza um simples editor de texto ou uma IDE gráfica com milhares de botões e janelas, sabe que às vezes é confuso ficar navegando e trabalhando com vários arquivos abertos apenas para utilizar uma parte do código deles.

Pensando nisso, pesquisadores da Brown University e da University of Central Florida estão desenvolvendo um projeto chamado Code Bubbles. A idéia dessa IDE baseada no Eclipse é, ao invés de abrir arquivos inteiros, visualizar fragmentos de código como ”bolhas” que se relacionam.

Veja o vídeo que é mais fácil de entender:

 

Achei uma visão bem inovadora e diferente das atuais IDEs. Se realmente ajuda no desenvolvimento, só podemos saber na prática.

No site do projeto dá para se registrar para ser notificado quando a versão beta for lançada.

Temas de cores no Eclipse

Uns dias atrás, cansado do “fundo branco“, resolvi trocar as cores do editor do Eclipse. Imaginei que eu iria encontrar combinações de cores pré-configuradas, mas para minha surpresa eu teria que definir uma a uma na mão.

UPDATE (14/02/2012): Recentemente foi criado um plugin para o Eclipse que já faz isso. Recomendo dar uma olhada nele ao invés de usar esses procedimentos, apesar de funcionar também.

Pesquisando um pouco na internet encontrei essa solução. Apesar de não se tratar de um suporte “nativo” a temas, é bem simples.

O Eclipse salva as cores do editor nesses 2 arquivos localizados em .metadata/.plugins/org.eclipse.core.runtime/.settings dentro do seu workspace:

  • org.eclipse.jdt.ui.prefs
  • org.eclipse.ui.editors.prefs

Basta substituir esses arquivos pelos do “tema” que você deseja utilizar. Naquele link que encontrei sobre isso, tem algumas combinações de cores muito legais:

Baixar temas

Baixar temas

Se você gosta de programar com “fundo preto“, é só escolher um desses temas e usar no seu Eclipse. Apenas lembre-se de fazer o backup dos arquivos originais.

Google Go: Primeiros passos e exemplos

Semana passada o Google anunciou que disponibilizou uma nova linguagem de programação chamada Go. Como sempre, cada novo lançamento do Google vem recheado de comentários “O Google vai dominar o mundo” e “O Google será a nova Microsoft”.

Logotipo Go

Fiquei curioso e resolvi fazer alguns testes nessa nova linguagem. Aqui eu apresento o passo-a-passo do que fiz para instalar e implementar 3 exemplos (hello world, programação concorrente e servidor web).

Continue reading »

Rodando o Google Android em x86

Originalmente o sistema operacional Android tinha como objetivo (pelo menos oficialmente) de ser utilizado em telefones celulares. Com o mercado crescente dos netbooks, muito tem se falado da possibilidade de rodar esse sistema em computadores pessoais.  Lendo essa notícia fiquei sabendo do projeto LiveAndroid, que tem como objetivo disponibilizar uma versão do Android que rode em computadores x86 sem precisar instalar nada. Apesar de eu já conhecer o sistema através do emulador disponibilizado na SDK, resolvi baixar a imagem de CD e testar em meu computador.

Continue reading »

Instalando o JBoss Tools 3 no Eclipse 3.4/3.5

O Jboss Tools é um conjunto de plugins que facilita a vida de quem trabalha com Seam, JSF, (X)HTML, Hibernate, JBoss AS, Drools, jBPM, entre outros. A versão estável do JBoss Tools 3 foi lançada essa semana e é necessária para quem quer utilizar estes plugins no Eclipse 3.4 (ou 3.5)¹, já que as versões 2.x rodam somente no 3.3 ou inferior.

É importante notar que antes você precisa ter instalado os plugins padrões para Java EE no Eclipse, caso não tenha baixe a versão “Eclipse 3.5 IDE for Java EE Developers”¹ aqui.

A instalação do JBoss Tools é muito simples e pode ser realizada pelo próprio update do Eclipse. Bem, vamos lá:

Eclipse Galileo 3.5¹

  1. Vá em “Help” e “Install New Software…”
  2. Clique em “Add…” para adicionar um novo site
  3. Na tela coloque em “JBoss Tools” (ou outro nome que preferir) e “http://download.jboss.org/jbosstools/updates/development” na url e clique em “OK”
  4. Expanda esse novo site, vá em “JBoss Tools 3.1.0 …” e selecione os plugins que deseja instalar
  5. Clique em “Next” e siga os procedimentos
Instalação do Jboss Tools 3 no Eclipse 3.5

Instalação do Jboss Tools 3 no Eclipse 3.5

Eclipse Ganymede 3.4

  1. Vá em “Help” e “Software Updates…”
  2. Na aba “Available Software” clique em “Add Site…”
  3. Coloque a url “http://download.jboss.org/jbosstools/updates/development” e clique em “OK”
  4. Expanda esse novo site, vá em “JBoss Tools 3.0.0 …” e selecione os plugins que deseja instalar
  5. Clique em “Install…” e siga os procedimentos

Instalação do JBoss Tools 3

As imagens abaixo mostram os plugins Seam Tools (com editor visual de JSF/XHTML aberto) e Hibernate Tools funcionando:

Seam Tools

Hibernate Tools


Mais informações em: http://www.jboss.org/tools

Post do Camilo Lopes com vídeo do processo de instalação: http://blog.camilolopes.com.br/?p=1177

¹Atualização em 10/08/2009: Adicionei os procedimentos para a instalação no Eclipse 3.5 / Galileo