Diferencia entre DTO, VO, POJO, JavaBeans?


He visto algunas preguntas similares:

¿Puede decirme también los contextos en los que se usan? O el propósito de ellos?

Author: Community, 2009-10-23

6 answers

JavaBeans

Un JavaBean es una clase que sigue las convenciones de JavaBeans definidas por Sun. Wikipedia tiene un buen resumen de lo que JavaBeans son:

Los JavaBeans son componentes de software reutilizables para Java que se pueden manipular visualmente en una herramienta de construcción. Prácticamente, son clases escritas en el lenguaje de programación Java conforme a una convención en particular. Se utilizan para encapsular muchos objetos en un solo objeto (el frijol), por lo que que se pueden pasar como un solo objeto bean en lugar de como múltiples objetos individuales. Un JavaBean es un objeto Java que es serializable, tiene un constructor nullary, y permite el acceso a propiedades usando los métodos getter y setter.

Para funcionar como una clase JavaBean, una clase object debe obedecer ciertas convenciones sobre el nombre, la construcción y el comportamiento de los métodos. Estas convenciones hacen posible tener herramientas que pueden usar, reutilizar, reemplazar y conectar JavaBeans.

Las convenciones requeridas son:

  • La clase debe tener un constructor público por defecto. Esto permite una creación de instancias fácil dentro de marcos de edición y activación.
  • Las propiedades de la clase deben ser accesibles usando get, set y otros métodos (los llamados métodos accesor y métodos mutator), siguiendo una convención de nomenclatura estándar. Esto permite una fácil inspección automatizada y actualización del estado del frijol dentro de marcos, muchos de los cuales incluyen personalizados editores para varios tipos de propiedades.
  • La clase debe ser serializable. Esto permite que las aplicaciones y los marcos guarden, almacenen y restauren de forma fiable el estado de bean de forma independiente de la máquina virtual y la plataforma.

Debido a que estos requisitos se expresan en gran medida como convenciones en lugar de implementar interfaces, algunos desarrolladores ven los JavaBeans como Objetos Java Antiguos que siguen convenciones de nomenclatura específicas.

POJO

A Plain Old Java Object o POJO es un término introducido inicialmente para designar un simple objeto Java ligero, que no implementa ninguna interfaz javax.ejb, a diferencia de EJB 2 de peso pesado.x (especialmente los Frijoles de Entidad, los Frijoles de Sesión sin estado no son tan malos IMO). Hoy en día, el término se utiliza para cualquier objeto simple sin cosas adicionales. Una vez más, Wikipedia hace un buen trabajo definiendo POJO :

POJO es un acrónimo de Plain Old Java Objeto. El nombre se usa para enfatizar que el objeto en cuestión es un objeto Java ordinario, no especial objeto, y en particular no un Empresa JavaBean (especialmente antes EJB 3). El término fue acuñado por Martin Fowler, Rebecca Parsons y Josh MacKenzie en septiembre de 2000:

"Nos preguntamos por qué la gente estaba tan en contra de usar objetos regulares en su sistemas y llegó a la conclusión de que porque los objetos simples carecían de fantasía nombre. Así que les dimos uno, y es cogido en muy bien."

El término continúa el patrón de términos más antiguos para tecnologías que sí no utilice nuevas características de lujo, tales como POTS (Plain Old Telephone Service) in telefonía y PODS (Datos Antiguos sin formato Estructuras) que se definen en C++ pero utilice solo las características del lenguaje C, y POD (Plain Old Documentation) en Perl.

El término probablemente ha ganado aceptación generalizada debido a la necesidad de un común y fácil término entendido que contrasta con marcos de objetos complicados. Un JavaBean es un POJO que es serializable, no tiene argumento constructor, y permite el acceso a propiedades usando getter y setter método. Una empresa JavaBean no es una sola clase pero un componente completo modelo (de nuevo, EJB 3 reduce el complejidad de los JavaBeans empresariales).

Como diseños que utilizan POJOs se han convertido más comúnmente utilizados, los sistemas tienen que le dan a POJOs algunos de los funcionalidad utilizada en frameworks y mas elección sobre qué áreas de la funcionalidad es realmente necesaria. La hibernación y la primavera son ejemplos.

Objeto de valor

Un Objeto de valor o VO es un objeto como java.lang.Integer que contiene valores (por lo tanto objetos de valor). Para una definición más formal, a menudo me refiero a la descripción de Martin Fowler de Value Object :

En Patterns of Enterprise Application Architecture describí el Objeto Value como un objeto pequeño, como un objeto Money o Date range. Su llave la propiedad es que siguen la semántica de valor en lugar de la semántica de referencia.

Normalmente se les puede decir porque su noción de igualdad no se basa en la identidad, sino que dos objetos de valor son iguales si todos sus campos son iguales. Aunque todos los campos son iguales, no es necesario comparar todos los campos si un subconjunto es único; por ejemplo, los códigos de moneda para objetos de moneda son suficientes para probar la igualdad.

Una heurística general es que los objetos de valor deben ser enteramente inmutable. Si desea cambiar un objeto de valor, debe reemplazar el objeto por uno nuevo y no se le permitirá actualizar los valores del objeto de valor en sí: los objetos de valor actualizables generan problemas de aliasing.

La literatura temprana de J2EE usó el término objeto valor para describir una noción diferente, lo que yo llamo un Objeto de Transferencia de Datos. Desde entonces han cambiado su uso y usan el término Transfer Object en su lugar.

Puedes encontrar algo más de buen material on value objects on the wiki and by Dirk Riehle .

Objeto de Transferencia de datos

El Objeto de transferencia de datos o DTO es un patrón (anti) introducido con EJB. En lugar de realizar muchas llamadas remotas en EJBs, la idea era encapsular datos en un objeto de valor que pudiera transferirse a través de la red: un Objeto de Transferencia de datos. Wikipedia tiene una definición decente de Objeto de transferencia de datos :

Objeto de transferencia de datos (DTO), anteriormente conocido como value objects o VO, es un patrón de diseño utilizado para transferir datos entre subsistemas de aplicaciones de software. Los DTO se utilizan a menudo junto con objetos de acceso a datos para recuperar datos de una base de datos.

La diferencia entre los objetos de transferencia de datos y los objetos de negocio o los objetos de acceso a datos es que un DTO no tiene ningún comportamiento excepto para el almacenamiento y la recuperación de sus propios datos (accesores y mutadores).

En una arquitectura EJB tradicional, los DTO sirven para propósitos duales: en primer lugar, resuelven el problema de que los beans de entidad no son serializables; en segundo lugar, definen implícitamente una fase de ensamblado en la que todos los datos que utilizará la vista se obtienen y agrupan en los DTO antes de devolver el control al nivel de presentación.


Entonces, para muchas personas, DTOs y VOs son la misma cosa (pero Fowler usa VOs para significar otra cosa como vimos). La mayoría de las veces, siguen las convenciones de JavaBeans y, por lo tanto, también son JavaBeans. Y todos son POJOs.

 722
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-22 09:33:03

DTO vs VO

DTO - Los objetos de transferencia de datos son solo contenedores de datos que se utilizan para transportar datos entre capas y niveles.

  • Contiene principalmente atributos. Incluso puede usar atributos públicos sin getters y setters.
  • Los objetos de transferencia de datos no contienen ninguna lógica de negocio.

Analogía:
Formulario de registro simple con atributos nombre de usuario, contraseña e id de correo electrónico.

  • Cuando este formulario se envía en el archivo RegistrationServlet, obtendrá todos los atributos de la capa de vista a la capa de negocio donde pasa los atributos a java beans y luego a la DAO o la capa de persistencia.
  • Los DTO ayudan a transportar los atributos de la capa de vista a la capa de negocio y, finalmente, a la capa de persistencia.

DTO se utilizó principalmente para obtener datos transportados a través de la red de manera eficiente, puede ser incluso de JVM a otra JVM.

Los DTO suelen ser java.io.Serializable para transferir datos a través de JVM.

VO - Un Objeto de valor [1][2] representa a sí mismo un conjunto fijo de datos y es similar a una enumeración Java. La identidad de un Objeto de Valor se basa en su estado en lugar de en su identidad de objeto y es inmutable. Un ejemplo del mundo real sería el Color.ROJO, Color.AZUL, SEXO.MUJER, etc.

POJO vs JavaBeans

[1] La Beanness Java de un POJO es que se accede a todos sus atributos privados a través de getters y setters públicos que se ajustan a las convenciones de JavaBeans. por ejemplo,

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

[2] JavaBeans debe implementar Serializable y tener un constructor sin argumento, mientras que en POJO no tiene estas restricciones.

 49
Author: Srinivas M.V.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-26 19:32:46

Básicamente,

DTO: Los "objetos de transferencia de datos" pueden viajar entre capas separadas en la arquitectura de software.

VO: los "objetos de valor" contienen un objeto como Integer, Money, etc.

POJO: Objeto Java antiguo que no es un objeto especial.

Java Beans: requiere un Java Class para ser serializable, tener un constructor no-arg y un getter y setter para cada campo

 36
Author: Olcay Tarazan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-15 10:06:59

Java Beans no son lo mismo que EJBs.

La especificación JavaBeans en Java 1.0 fue el intento de Sun de permitir que los objetos Java fueran manipulados en un IDE que se pareciera a VB. Había reglas establecidas para los objetos que calificaban como "Java Beans":

  1. Constructor predeterminado
  2. Getters y setters para miembros de datos privados que siguieron la convención de nomenclatura adecuada
  3. Serializable
  4. Tal vez otros que estoy olvidando.

EJBs vino más tarde. Combinan componentes distribuidos y un modelo transaccional, que se ejecutan en un contenedor que administra subprocesos, agrupación, ciclo de vida y proporciona servicios. Están muy lejos de las habas de Java.

Los DTO surgieron en el contexto Java porque la gente descubrió que la especificación EJB 1.0 era demasiado "conversadora" con la base de datos. En lugar de hacer un viaje de ida y vuelta para cada elemento de datos, la gente los empaquetaría en Java Beans a granel y los enviaría.

POJOs fueron una reacción contra EJBs.

 22
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-26 12:58:36

POJO : Es un archivo java(clase) que no extiende ni implementa ningún otro archivo java(clase).

Bean : Es un archivo java(clase) en el que todas las variables son privadas, los métodos son públicos y se utilizan getters y setters apropiados para acceder a las variables.

Clase normal: Es un archivo java(clase) que puede consistir en variables públicas/privadas/predeterminadas/protegidas y que puede o no extender o implementar otro archivo java (clase).

 3
Author: Suraj Kalokhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-17 05:31:53

Primero Habla De

Clase Normal - eso significa que cualquier clase define que es un normalmente en java es significa que crear diferentes tipos de propiedades de método etc.
Bean - Bean no es nada es solo un objeto de esa clase en particular usando este bean puedes acceder a tu clase java igual que object..

Y después de eso hablar sobre el último POJO

POJO - POJO es esa clase que no tiene ningún servicio que tenga solo un constructor predeterminado y una propiedad privada y esas propiedades para establecer un valor correspondiente a los métodos setter y getter. Es una forma corta de Objeto Java Simple.

 1
Author: ASHISH KUMAR SINGH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-15 09:25:44