Un uso muy común en diseños de Software es agrupar distintos valores relacionados entre sí en una sola variable, lo cual permite una manipulación más eficiente de datos; en el lenguaje Java existen diversos mecanismos para agrupar datos en conjunto, una de ellas que ha venido siendo utilizada a lo largo de los distintos programas en este curso es denominada: Arreglo.
A través de un Arreglo es posible generar agrupaciones de cualquier tipo de Objeto simplemente agregando una simbología de corchetes , ya sea seguido de la definición de Clase o bien la referencia en cuestión, a continuación se describen diversos ejemplos más amplios de Arreglos:
Al final de esta sección serán descritas otras metodologías para agrupar datos que poseen distintas ventajas a emplear un Arreglo.
El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a Objetos, las mismas raíces de la palabra pueden ser una fuerte pista de su significado: Poli = Multiple
, morfismo= Formas
, esto implica que un mismo Objeto puede tomar diversas formas.
A través del concepto de Herencias ("Inheritance") es posible ilustrar este comportamiento:
El poder manipular un Objeto como si éste fuera de un tipo genérico otorga mayor flexibilidad al momento de programar con Objetos, el término Polimorfismo también es asociado con un concepto llamado Late-Binding (Ligamiento Tardío), observe el siguiente fragmento de código:
Figura a = new Circulo(); Figura b = new Triangulo(); |
Inicialmente se puede pensar que este código generaría un error debido a que el tipo de referencia es distinta a la instancia del objeto, sin embargo, el fragmento anterior es correcto y demuestra el concepto de Polimorfismo; para asentar este tema se describe un ejemplo más completo:
El uso de Polimorfismo posee ciertos detalles que no fueron descritos en el ejemplo anterior, uno de estos, que también tiene implicaciones en otros componentes es: Casting.
El termino "Casting" viene de la palabra "Cast" que significa Molde, por lo que el termino literal es Hacer un Molde, en Polimorfismo se lleva acabo este proceso de "Casting" implícitamente, una Guitarra se coloca en el molde de un Instrumento, un Triangulo en el molde de una Figura, sin embargo, en ciertas ocasiones se requiere realizar un tipo de "Casting" que no es considerado seguro en términos computacionales.
Anteriormente se mencionó que el "Casting" llevado acabo con Polimorfismo es implícito, esto se debe a que no se requiere de sintaxis especial, simplemente se convierte una Guitarra a un Instrumento, sin embargo, para llevar una transformación en sentido opuesto se requiere de sintaxis adicional para mantener la seguridad de transformación; analicemos: mientras se puede asegurar que un Triangulo es una Figura ("Up-Casting"), una Figura no necesariamente es un Triangulo, claro esta que lo puede ser, pero en Java se requiere definir explícitamente esta operación ("Down-Casting").
El uso practico de "Down-Casting" será explorado en la sección de Vectores y "Hashtables".
Al ser utilizado Herencias ("Inheritance") y/o Polimorfismo es muy común que en la Clase Base existan métodos diseñados únicamente con el propósito de ofrecer una guia para las Clases heredadas, en Java existe un vocablo que permite prohibir el uso de métodos en Clases Base, este calificativo es : abstract.Al ser definido un método como abstract se restringe que éste sea llamado directamente, cuando una Clase contiene un método de este tipo a ésta se le llama: Clase Abstracta.
Al ser definida una Clase, además de ser declarados los métodos/campos como abstract también es necesario utilizar el vocablo abstract en la definición de cada Clase.
Una de las características de las Clases que Heredan("Inherit") de una Clase abstracta, es que éstas deben definir los mismos métodos definidos en la Clase Base; en Java existe otro mecanismo que permite llevar acabo diseños donde se parte de una Estructura o Cápsula.
Una Interfase es una Clase abstracta llevada al extremo, la cual permite pre-definir el uso de métodos/campos en futuras clases tal como: Una jerarquía de Instrumentos restringido al uso de una Interfase Instrumento, o bien, una estructura de Figuras al uso de la Interfase Figura.
Una Interfase básicamente dice: "Todas las Clases que implementen esta Interfase deben contener su misma estructura", para definir una Interfase se utiliza el vocablo interface
y para especificar que una Clase debe utilizar determinada Interfase se utiliza el vocablo implements
.
Al ser utilizada una Interfase en una Clase se esta indicando: "La Interfase dicta la forma/estructura ahora se va describir como debe funcionar", en el siguiente ejemplo se describe el uso de Interfases:
Una característica especifica de Interfases que no es posible a través de Clases Abstractas es el uso de Herencias Múltiples ("Multiple Inheritance"), este concepto reside en diseñar Clases que adoptan el comportamiento de más de una Clase, a continuación se describe su uso:
Cabe mencionar que el uso de Interfases es ampliamente utilizado en EJB's ("Enterprise Java Beans") uno de los principales componentes de J2EE ("Java 2 Enterprise Edition").
Algunas de las principales características de Arreglos en Java son las siguientes:
Es necesario definir el tamaño de un Arreglo antes de ser utilizado, este se hace con la intención de administrar el uso de memoria, pero a su vez presenta la restricción de utilizar Arreglos en estructuras de datos cambiantes.
Un arreglo únicamente puede incluir Objetos/primitivos del mismo tipo, si bien esto permite un control más estricto sobre estructura de datos, restringe una posible mezcla de elementos comunes que difieran en su Clase.
A diferencia de un Arreglo, un Vector es un tipo de Objeto que permite almacenar objetos (referencias) de cualquier tipo, que además de ofrecer estas facilidades, también es posible que su tamaño incremente conforme las necesidades del programa lo requieran; aparentemente este es un contenedor de Objetos ideal para toda situación, sin embargo, su uso puede ser un poco deficiente ya que requiere mayor uso de memoria que un arreglo de Objetos, el siguiente ejemplo demuestra el uso de esta Clase :
Otro elemento que es ampliamente empleado en programación es la utilización de listas de valores con determinados conceptos, esto es conocido como key-value lists y en el mundo Java recibe el nombre de "Hashtable", a continuación se describe un ejemplo de "Hashtable's":
Además del uso de Vectores y "Hashtables", también existen otra serie de Clases para el almacenaje de Objetos, cada una de éstas posee sus ventajas y desventajas para agrupar elementos comunes; mayores detalles sobre estas estructuras de datos serán descritas a continuación en el "Collection Framework" de Java.