JavaBeans
Un JavaBean es una clase que sigue las convenciones de JavaBeans definidas por Sun. Wikipedia tiene un resumen bastante bueno de lo que son los JavaBeans :
JavaBeans son componentes de software reutilizables para Java que se pueden manipular visualmente en una herramienta de creación. Prácticamente, son clases escritas en el lenguaje de programación Java conforme a una convención particular. Se usan para encapsular muchos objetos en un solo objeto (el bean), de modo que se puedan pasar como un solo objeto de bean en lugar de como múltiples objetos individuales. Un JavaBean es un objeto Java que es serializable, tiene un constructor nular y permite el acceso a las propiedades utilizando métodos getter y setter.
Para funcionar como una clase JavaBean, una clase de objeto debe obedecer ciertas convenciones sobre nombres de métodos, construcción y comportamiento. Estas convenciones permiten tener herramientas que pueden usar, reutilizar, reemplazar y conectar JavaBeans.
Las convenciones requeridas son:
- La clase debe tener un constructor público predeterminado. Esto permite una fácil creación de instancias dentro de los 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 de acceso y métodos de mutación), siguiendo una convención de nomenclatura estándar. Esto permite una fácil inspección y actualización automatizadas del estado del bean dentro de los marcos, muchos de los cuales incluyen editores personalizados para varios tipos de propiedades.
- La clase debe ser serializable. Esto permite que las aplicaciones y los marcos guarden, almacenen y restauren de manera confiable el estado del bean de manera independiente de la VM y la plataforma.
Debido a que estos requisitos se expresan en gran medida como convenciones en lugar de mediante la implementación de interfaces, algunos desarrolladores ven los JavaBeans como Objetos Java sencillos que siguen convenciones de nomenclatura específicas.
POJO
Un objeto Java simple o POJO es un término introducido inicialmente para designar un objeto Java liviano simple, sin implementar ninguna javax.ejb
interfaz, a diferencia del EJB 2.x de peso pesado (especialmente los beans de entidad, los beans de sesión sin estado no son tan malos IMO). Hoy, el término se usa para cualquier objeto simple sin cosas adicionales. Nuevamente, Wikipedia hace un buen trabajo al definir POJO :
POJO es un acrónimo de Plain Old Java Object. El nombre se usa para enfatizar que el objeto en cuestión es un Objeto Java ordinario, no un objeto especial, y en particular no un Enterprise JavaBean (especialmente antes de EJB 3). El término fue acuñado por Martin Fowler, Rebecca Parsons y Josh MacKenzie en septiembre de 2000:
"Nos preguntamos por qué las personas estaban tan en contra del uso de objetos regulares en sus sistemas y concluimos que era porque los objetos simples carecían de un nombre elegante. Así que les dimos uno, y se entiende muy bien".
El término continúa el patrón de los términos más antiguos para las tecnologías que no usan nuevas características sofisticadas, como POTS (Servicio telefónico antiguo simple) en telefonía y PODS (Estructuras de datos simples antiguas) que se definen en C ++ pero usan solo funciones de lenguaje C, y POD (Plain Old Documentation) en Perl.
Lo más probable es que el término haya ganado una aceptación generalizada debido a la necesidad de un término común y fácil de entender que contraste con marcos de objetos complicados. Un JavaBean es un POJO que es serializable, tiene un constructor sin argumentos y permite el acceso a las propiedades utilizando métodos getter y setter. Un Enterprise JavaBean no es una clase única sino un modelo de componente completo (nuevamente, EJB 3 reduce la complejidad de Enterprise JavaBeans).
A medida que los diseños que utilizan POJO se han vuelto más comunes, han surgido sistemas que brindan a los POJO algunas de las funcionalidades utilizadas en los marcos y más opciones sobre qué áreas de funcionalidad se necesitan realmente. Hibernate y Spring son ejemplos.
Objeto de valor
Un objeto de valor o VO es un objeto como el 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í Value Object como un objeto pequeño, como un Money o un objeto de rango de fechas. Su propiedad clave es que siguen la semántica de valores en lugar de la semántica de referencia.
Por lo general, puede decirles 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 necesita comparar todos los campos si un subconjunto es único; por ejemplo, los códigos de moneda para los objetos de moneda son suficientes para probar la igualdad.
Una heurística general es que los objetos de valor deben ser completamente inmutables. Si desea cambiar un objeto de valor, debe reemplazar el objeto por uno nuevo y no se le debe permitir actualizar los valores del objeto de valor en sí mismo; los objetos de valor actualizables conducen a problemas de alias.
La literatura temprana de J2EE usó el término objeto de 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 Transferir objeto lugar.
Puede encontrar más material bueno sobre objetos de valor en la wiki y por Dirk Riehle .
Objeto de transferencia de datos
Data Transfer Object o DTO es un patrón (anti) introducido con EJB. En lugar de realizar muchas llamadas remotas en EJB, 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 :
El objeto de transferencia de datos (DTO), anteriormente conocido como objetos de valor o VO, es un patrón de diseño utilizado para transferir datos entre subsistemas de aplicaciones de software. Los DTO a menudo se usan 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 comerciales u objetos de acceso a datos es que un DTO no tiene ningún comportamiento, excepto el almacenamiento y la recuperación de sus propios datos (accesores y mutadores).
En una arquitectura EJB tradicional, los DTO tienen dos propósitos: primero, evitan el problema de que los beans de entidad no son serializables; segundo, definen implícitamente una fase de ensamblaje en la que todos los datos que utilizará la vista se obtienen y se agrupan en los DTO antes de devolver el control al nivel de presentación.
Entonces, para muchas personas, los DTO y VO son lo mismo (pero Fowler usa VO para significar algo más 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.