Plain Old Java Objects (Os Singelos Clássicos Objetos Java), ou POJOs, são objetos Java que seguem um desenho simplificado em contraposição aos EJBs, por exemplo. Um JavaBean é um POJO que segue definições rígidas de estrutura (construtor default sem argumentos e métodos que seguem o padrão de getters e setters para seus atributos).
Este padrão é baseado na ideia de que quanto mais simples o projeto, melhor. O termo foi inventado por Martin Fowler, Rebecca Parsons e Josh MacKenzie em Setembro de 2000. "Nós queríamos saber porque as pessoas eram contra o uso de objetos regulares em seus sistemas e concluímos que era devido a falta de um nome extravagante para eles. Assim nós demos-lhes um, e funcionou muito bem.". O termo segue o padrão de atribuir um nome para tecnologias que não possuem nenhuma característica nova, como POTS (Plain Old Telephone Service).
O termo ganhou aceitação por causa da necessidade de um termo comum e facilmente inteligível que contrasta com complicados frameworks de objetos. É mais atrativo do que o termo bean do Java devido à confusão gerada pela semelhança dos termos JavaBeans e os EJB (Enterprise JavaBeans). O primeiro é predominantemente um POJO que segue rigorosas convenções para nomear métodos, e o último é um modelo de componente (EJB 3 reduz o grau de diferença entre eles).
Definição
Falando idealmente, um POJO é um objeto de Java não limitado por alguma restrição outra que esses forçados por Java Language Specification. Em outras palavras, um POJO deve:
- Não estender classes pre-especificadas, como em
public class Foo extends javax.servlet.http.HttpServlet { ...
- Não implementar interfaces pre-especificadas, como em
public class Bar implements javax.ejb.EntityBean { ...
- Não conter anotações pre-especificadas, como em
@javax.persistence.Entity public class Baz { ...
No entanto, por causa das dificuldades técnicas e outras razões, muitos produtos de software ou muitos framework descritos como acordantes com POJO ainda pedem efectivamente o uso das anotações pre-especificadas para tais características como persistência para funcionar correctamente. A ideia é que se o objeto (efectivamente a classe) foi um POJO dantes de que algumas anotações foram acrescentadas, e regressaria no estado de POJO se as anotações são tiradas, então pode estar considerado como um POJO. Então o objeto básico fica um POJO no sentido que não tem características especiais (como uma interface implementada) que o fazem "Specialized Java Object" (SJO ou (sic) SoJO).
Exemplo
Este exemplo mostra uma classe POJO que segue o padrão JavaBean.
public class Carro implements java.io.Serializable {
private String nome;
private String cor;
public Carro() {
}
public Carro(String nome, String cor) {
this.nome = nome;
this.cor = cor;
}
public String getCor() {
return cor;
}
public void setCor(String cor) {
this.cor = cor;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}