Diferença entre DTO, VO, POJO, JavaBeans?


584

Vimos algumas perguntas semelhantes:

Você também pode me dizer os contextos em que eles são usados? Ou o objetivo deles?


1
POJO vem com nenhuma restrição onde JavaBeans como vem com restrições mencionadas acima bem
exexzian

Respostas:


848

JavaBeans

Um JavaBean é uma classe que segue as convenções do JavaBeans, conforme definido pela Sun. A Wikipedia tem um resumo muito bom do que são JavaBeans :

JavaBeans são componentes de software reutilizáveis ​​para Java que podem ser manipulados visualmente em uma ferramenta de construção. Na prática, são classes escritas na linguagem de programação Java, em conformidade com uma convenção específica. Eles são usados ​​para encapsular muitos objetos em um único objeto (o bean), para que possam ser passados ​​como um único objeto de bean em vez de como vários objetos individuais. Um JavaBean é um Objeto Java que pode ser serializado, possui um construtor nulo e permite acesso a propriedades usando os métodos getter e setter.

Para funcionar como uma classe JavaBean, uma classe de objeto deve obedecer a certas convenções sobre nomeação, construção e comportamento de métodos. Essas convenções tornam possível ter ferramentas que podem usar, reutilizar, substituir e conectar o JavaBeans.

As convenções necessárias são:

  • A classe deve ter um construtor público padrão. Isso permite instanciação fácil nas estruturas de edição e ativação.
  • As propriedades da classe devem ser acessíveis usando métodos get, set e outros (chamados métodos acessadores e métodos mutadores), seguindo uma convenção de nomenclatura padrão. Isso permite inspeção e atualização automatizadas fáceis do estado do bean nas estruturas, muitas das quais incluem editores personalizados para vários tipos de propriedades.
  • A classe deve ser serializável. Isso permite que aplicativos e estruturas salvem, armazenem e restaurem com segurança o estado do bean de maneira independente da VM e da plataforma.

Como esses requisitos são amplamente expressos como convenções, e não pela implementação de interfaces, alguns desenvolvedores veem o JavaBeans como objetos Java antigos simples que seguem convenções de nomenclatura específicas.

POJO

Um Objeto Java Antigo Simples ou POJO é um termo introduzido inicialmente para designar um objeto Java simples e leve, sem implementar nenhuma javax.ejbinterface, em oposição ao EJB 2.x pesado (especialmente Entity Beans, Stateless Session Beans não são tão ruins para IMO). Hoje, o termo é usado para qualquer objeto simples, sem itens extras. Novamente, a Wikipedia faz um bom trabalho ao definir o POJO :

POJO é um acrônimo para Plain Old Java Object. O nome é usado para enfatizar que o objeto em questão é um objeto Java comum, não um objeto especial e, em particular, não um JavaBean Enterprise (especialmente antes do EJB 3). O termo foi cunhado por Martin Fowler, Rebecca Parsons e Josh MacKenzie em setembro de 2000:

"Nós nos perguntamos por que as pessoas eram tão contra o uso de objetos regulares em seus sistemas e concluímos que era porque os objetos simples não tinham um nome sofisticado. Então, demos a eles um, e ele ficou muito bem".

O termo continua o padrão de termos mais antigos para tecnologias que não usam novos recursos sofisticados, como POTS (Serviço Telefônico Antigo Simples) em telefonia e PODS (Estruturas de Dados Antigos Simples) definidos em C ++, mas usam apenas recursos da linguagem C, e POD (Plain Old Documentation) em Perl.

Provavelmente, o termo ganhou ampla aceitação devido à necessidade de um termo comum e de fácil compreensão que contrasta com estruturas de objetos complicadas. Um JavaBean é um POJO que é serializável, possui um construtor sem argumento e permite acesso a propriedades usando os métodos getter e setter. Um Enterprise JavaBean não é uma classe única, mas um modelo de componente inteiro (novamente, o EJB 3 reduz a complexidade do Enterprise JavaBeans).

À medida que os projetos que usam POJOs se tornam mais comumente usados, surgiram sistemas que fornecem aos POJOs parte da funcionalidade usada em estruturas e mais opções sobre quais áreas de funcionalidade são realmente necessárias. Hibernate e Spring são exemplos.

Objeto Valor

Um objeto de valor ou VO é um objeto como java.lang.Integeresse que mantém valores (portanto, objetos de valor). Para uma definição mais formal, costumo me referir à descrição de Martin Fowler do Value Object :

Em Patterns of Enterprise Application Architecture, descrevi o Value Object como um objeto pequeno, como um objeto Money ou período. Sua principal propriedade é que eles sigam a semântica de valores em vez de referenciar a semântica.

Geralmente, você pode dizer a eles porque a noção de igualdade deles não se baseia na identidade; em vez disso, dois objetos de valor são iguais se todos os campos forem iguais. Embora todos os campos sejam iguais, você não precisa comparar todos os campos se um subconjunto for único - por exemplo, códigos de moeda para objetos de moeda são suficientes para testar a igualdade.

Uma heurística geral é que os objetos de valor devem ser totalmente imutáveis. Se você deseja alterar um objeto de valor, substitua-o por um novo e não tenha permissão para atualizar os valores do próprio objeto de valor - objetos de valor atualizáveis ​​causam problemas de alias.

A literatura inicial do J2EE usava o termo objeto de valor para descrever uma noção diferente, o que eu chamo de Objeto de Transferência de Dados . Desde então, eles mudaram seu uso e, em vez disso, usam o termo Transfer Object .

Você pode encontrar mais material bom sobre objetos de valor no wiki e por Dirk Riehle .

Objeto de transferência de dados

O Data Transfer Object ou DTO é um (anti) padrão introduzido no EJB. Em vez de executar muitas chamadas remotas nos EJBs, a idéia era encapsular dados em um objeto de valor que pudesse ser transferido pela rede: um objeto de transferência de dados. A Wikipedia tem uma definição decente de objeto de transferência de dados :

O objeto de transferência de dados (DTO), anteriormente conhecido como objetos de valor ou VO, é um padrão de design usado para transferir dados entre subsistemas de aplicativos de software. Os DTOs geralmente são usados ​​em conjunto com objetos de acesso a dados para recuperar dados de um banco de dados.

A diferença entre objetos de transferência de dados e objetos de negócios ou objetos de acesso a dados é que um DTO não possui nenhum comportamento, exceto para armazenamento e recuperação de seus próprios dados (acessadores e mutadores).

Em uma arquitetura EJB tradicional, os DTOs têm dois propósitos: primeiro, eles resolvem o problema de que os beans de entidade não são serializáveis; segundo, eles definem implicitamente uma fase de montagem em que todos os dados a serem usados ​​pela exibição são buscados e empacotados nos DTOs antes de retornar o controle à camada de apresentação.


Portanto, para muitas pessoas, DTOs e VOs são a mesma coisa (mas Fowler usa VOs para significar outra coisa como vimos). Na maioria das vezes, eles seguem as convenções do JavaBeans e, portanto, também são JavaBeans. E todos são POJOs.


1
Portanto, se eu tiver uma classe de conveniência criada apenas para transferir dados não relacionados como este class SomeClass { public String foo;public String bar; }dentro de uma classe com muita lógica complicada, com certeza não é um JavaBean, não pode ser um VO, pois é mutável, poderia ser um DTO? apesar de não ser direcionado para invocações remotas de qualquer tipo. Pode ser considerado um POJO?
Jaime Hablutzel

3
@ user2601512: Ainda seria um Bean. : P Não há nada de errado em um Bean ter comportamento - na verdade, é bem esperado que ele tenha. Se não fizer mais nada, é basicamente um DTO.
cHao 11/12

7
@xSNRG: Em parte porque rebaixa objetos para dados nos quais outro código atua. É um retrocesso da perspectiva do OO, onde os objetos agem e devem ser responsáveis ​​por seu próprio estado. Ocasionalmente, os DTOs são uma solução decente se você está apenas transferindo dados - daí o nome -, mas o encapsulamento basicamente sai pela janela e você geralmente perde qualquer garantia de validade / consistência que um objeto real poderia fornecer.
Chao

1
@KumaresanPerumal: Você pode, se quiser. Mas o modelo é distinto da camada de dados e tem objetivos e regras diferentes. A camada de dados normalmente precisa de tudo definido e arbitrariamente configurável, e o modelo idealmente deseja ocultar dados e aplicar invariantes. Você deseja usar objetos de modelo para armazenamento, precisará comprometer um lado ou o outro.
Chao

1
@KumaresanPerumal: a camada de dados existe para armazenar e recuperar dados. Para fazer isso, tudo precisa ter acesso total a qualquer objeto que contenha os dados, pois recuperar significa definir valores em um objeto em algum lugar. Mas o modelo gerencia esses dados no sistema e é vinculado aos princípios de OO, como encapsulamento - a idéia de que os objetos devem manter controle sobre seu estado interno e não ter outro código brincando arbitrariamente com suas entranhas. DTOs podem preencher essa lacuna; a camada de dados pode acessá-los à vontade e o modelo não precisa abdicar do controle.
Chao

66

DTO vs VO

DTO - Objetos de transferência de dados são apenas recipientes de dados usados ​​para transportar dados entre camadas e camadas.

  • Ele contém principalmente atributos. Você pode até usar atributos públicos sem getters e setters.
  • Os objetos de transferência de dados não contêm nenhuma lógica comercial.

Analogia:
Formulário de registro simples com atributos nome de usuário, senha e ID de email.

  • Quando esse formulário é enviado no arquivo RegistrationServlet, você obtém todos os atributos da camada de exibição para a camada de negócios, onde passa os atributos para java beans e, em seguida, para o DAO ou a camada de persistência.
  • As DTOs ajudam no transporte dos atributos da camada de visualização para a camada de negócios e, finalmente, para a camada de persistência.

O DTO foi usado principalmente para obter dados transportados pela rede de maneira eficiente, podendo ser da JVM para outra JVM.

Os DTOs geralmente são java.io.Serializable- para transferir dados pela JVM.

VO - Um Objeto de Valor [1] [2] representa um conjunto fixo de dados e é semelhante a uma enumeração Java. A identidade de um objeto de valor é baseada em seu estado e não em sua identidade de objeto e é imutável. Um exemplo do mundo real seria Color.RED, Color.BLUE, SEX.FEMALE etc.

POJO vs JavaBeans

[1] O Java-Beanness de um POJO é que todos os seus atributos privados são acessados ​​por meio de getters e setters públicos que estão em conformidade com as convenções do JavaBeans. por exemplo

    private String foo;
    public String getFoo(){...}
    public void setFoo(String foo){...}; 

[2] O JavaBeans deve implementar Serializable e ter um construtor sem argumento, enquanto no POJO não há essas restrições.


Desculpe pelo comentário tããão tarde, mas estou aprendendo sobre as diferenças entre eles e tenho uma pergunta. E se eu tiver uma classe Java Bean, mas com outros métodos como doSomething (). Que tipo de classe seria? Saudações
jscherman

@srinivas Por que não podemos passar os dados no objeto java DOMAIN ou MODEL? Mas eu uso MODELO sem DTO. por favor me explique brevemente. graças
Kumaresan Perumal

46

Basicamente,

DTO: "Objetos de transferência de dados" podem viajar entre camadas separadas na arquitetura do software.

VO: "Objetos de valor" contêm um objeto como Inteiro, Dinheiro etc.

POJO: Objeto Java antigo simples que não é um objeto especial.

Java Beans: requer Java Classque seja serializável, tenha um no-argconstrutor e um getter e setter para cada campo


Essas descrições estão principalmente erradas / incompletas.
cellepo

24

Java Beans não são a mesma coisa que EJBs.

A especificação do JavaBeans no Java 1.0 foi a tentativa da Sun de permitir que objetos Java fossem manipulados em um IDE que se parecesse com o VB. Havia regras estabelecidas para objetos qualificados como "Java Beans":

  1. Construtor padrão
  2. Getters e setters para membros de dados privados que seguiram a convenção de nomenclatura adequada
  3. Serializable
  4. Talvez outros que eu estou esquecendo.

EJBs vieram mais tarde. Eles combinam componentes distribuídos e um modelo transacional, executando em um contêiner que gerencia threads, pool, ciclo de vida e fornece serviços. Eles estão muito longe do Java Beans.

Os DTOs surgiram no contexto Java porque as pessoas descobriram que a especificação do EJB 1.0 estava muito "faladora" com o banco de dados. Em vez de fazer uma ida e volta para cada elemento de dados, as pessoas os empacotariam no Java Beans em massa e as enviariam.

Os POJOs foram uma reação contra os EJBs.


1
Eu estava errado e preferi excluir minha mensagem. Obrigado pela correção. Quero notar que o significado do POJO mudou há algum tempo. Primeiro, eles são feitos apenas de propriedades particulares e de seus acessadores. Agora, nós consideramos um POJO uma classe com anotações, implementando e estendendo outras classes, etc.
sinuhepop

E o VO, como a pergunta foi feita? Esta não é uma resposta até responder à pergunta completa
cellepo

4

POJO : É um arquivo java (classe) que não estende ou implementa qualquer outro arquivo java (classe).

Bean : é um arquivo java (classe) no qual todas as variáveis ​​são privadas, os métodos são públicos e os getters e setters apropriados são usados ​​para acessar variáveis.

Classe normal : é um arquivo java (classe) que pode consistir em variáveis ​​públicas / privadas / padrão / protegidas e que pode ou não estender ou implementar outro arquivo java (classe).


E o VO, como a pergunta foi feita? Esta não é uma resposta até responder à pergunta completa
cellepo

1

Primeira conversa sobre

Classe Normal - isso significa que qualquer classe define que normalmente é em java, significa que você cria diferentes tipos de propriedades de método, etc.
Bean - Bean não é nada, é apenas um objeto dessa classe específica usando este bean, você pode acessar sua classe java da mesma forma que o objeto. .

e depois falar sobre o último POJO

POJO - POJO é a classe que não possui nenhum serviço, possui apenas um construtor padrão e uma propriedade privada e essas propriedades para definir um valor correspondente aos métodos setter e getter. É uma forma abreviada de Plain Java Object.


E o VO, como a pergunta foi feita? Esta não é uma resposta até responder à pergunta completa
cellepo

1
  • Objeto de valor : use quando necessário para medir a igualdade dos objetos com base no valor dos objetos.
  • Objeto de transferência de dados : passe dados com vários atributos de uma só vez do cliente para o servidor na camada, para evitar várias chamadas para o servidor remoto.
  • Objeto Java antigo simples : É como uma classe simples cujas propriedades, construtor público no-arg. Como declaramos para a entidade JPA.

diferença-entre-valor-objeto-padrão-e-transferência-de-dados-padrão

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.