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).
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:
public class Foo extends javax.servlet.http.HttpServlet { ...
public class Bar implements javax.ejb.EntityBean { ...
@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).
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; } }