Download POO_Genericidad

Document related concepts
no text concepts found
Transcript
PROGRAMACIÓN ORIENTADA A OBJETOS
Unidad 1 GENERICIDAD
M.S.C. Ivette Hernández Dávila
Clases fundamentales
• Todas las clases de Java poseen una superclase común,
esa es la clase Object. Por eso los métodos de la clase
Object son fundamentales ya que todas las clases los
heredan.
• Esos métodos están pensados para todas las clases, pero
hay que redefinirlos para que funcionen adecuadamente.
• Es decir, Object proporciona métodos que son heredados
por todas las clase. La idea es que todas las clases
utilicen el mismo nombre y prototipo de método para
hacer operaciones comunes como comprobar igualdad,
clonar, .... y para ello habrá que redefinir esos métodos a
fin de que se ajusten adecuadamente a cada clase.
Comparar objetos
• La clase Object proporciona un método para comprobar
si dos objetos son iguales. Este método es equals. Este
método recibe como parámetro un objeto con quien
comparar y devuelve true si los dos objetos son iguales.
• No es lo mismo equals que usar la comparación de
igualdad. Ejemplos:
• El operador “==” devuelve true si los dos objetos se
refieren a la misma cosa (las dos referencias apuntan al
mismo objeto).
• Realmente en el ejemplo anterior la respuesta del
método equals sólo será válida si en la clase que se está
comparando (Coche en el ejemplo) se ha redefinido el
método equals. Esto no es opcional sino obligatorio si se
quiere usar este método. El resultado de equals depende
de cuándo consideremos nosotros que devolver
verdadero o falso.
• La clase Object define una serie de métodos que pueden
utilizarse sobre todos los objetos que se creen en Java.
Estos métodos son: clone(), equals(), finalize(),
getClass(), hashCode(), toString(), wait(), notify() y
notifyAll().
• El método toString() devuelve una cadena asociada al
objeto. De esta forma todos los objetos en Java tienen
una representación en forma de cadena de texto.
• El método hashCode() devuelve un entero que puede
utilizarse como identificador único del objeto en la
máquina virtual.
La madre de todas las clases: Object
• En Java todas las clases descienden de la clase Object.
• Es como si el compilador añadiera “extends Object” a todas las
clases que no extienden explícitamente a ninguna otra.
Introducción: Genericidad
• La programación orientada a objetos tiene como principales
objetivos favorecer la confiabilidad, reusabilidad y
extensibilidad del software.
• Adoptar el enfoque propuesto por la programación orientada
a objetos implica:
 En la etapa de diseño reducir la complejidad en base a la
descomposición del problema en piezas más simples a partir
de la identificación de objetos y su organización en una
estructura de clases.
 En la etapa de implementación utilizar un lenguaje que
permita retener la estructura de clases identificada en la
etapa de diseño y encapsular la representación interna de
modo que sea inaccesible desde el exterior.
Genericidad
• El encapsulamiento permite usar una clase considerando qué
funcionalidad brinda, sin tener en cuenta cómo la implementa.
• La herencia permite aumentar el nivel de abstracción mediante un
proceso de clasificación en niveles.
• El proceso consiste en abstraer lo que es común y esencial en un
conjunto de entidades para formar un concepto general que
comprenda a todas.
• Una clase derivada puede pensarse como una especialización de
una clase más general.
• Alternativamente podemos pensar a una clase derivada como una
extensión de la clase base.
Genericidad
• La extensibilidad se refiere a reducir el impacto de los cambios.
• Las modificaciones con frecuencia pueden resolverse definiendo
nuevas clases específicas, sin necesidad de cambiar las que ya
han sido verificadas.
• La reusabilidad evita escribir el mismo código repetidamente. Para
lograrlo es necesario distinguir el comportamiento general del
particular.
• La genericidad favorece la reusabilidad.
• Una clase genérica
comportamiento es
componentes.
encapsula a una estructura cuyo
independiente del tipo de las
Genericidad
• La genericidad puede modelarse en Java de dos
maneras diferentes: usando tipos de datos
parametrizados o usando herencia.
Clases parametrizadas
• Para dar soporte a la genericidad, en la versión 1.5 Java
introduce el concepto de genérico. Los genéricos
permiten definir parámetros que se corresponden con un
tipo en la definición de una clase o una interfaz. Estos
genéricos dan lugar al concepto de clase (o interfaz)
genérica. Las clases (o interfaces) genéricas también
suelen denominarse clases parametrizadas.
• La principal utilidad de las clases parametrizadas es la de
permitir la creación de contenedores genéricos que
acepten elementos independientes de su tipo. Hasta la
versión 1.4 de Java, la genericidad se conseguía
construyendo contenedores que almacenaban objetos de
la clase Object y el casting posterior a la clase
correspondiente.
Jerarquía de herencia entre clases
parametrizadas
Ejemplo de uso genérico
• El siguiente ejemplo muestra cómo utilizar los genéricos
al crear una clase Concesionario genérica, que luego será
capaz de generar objetos Concesionario de objetos
Deportivo y objetos Concesionario de objetos Utilitario.
• Al crear una clase parametrizada se crea una superclase
de la que heredarán cada una de las clases con una
parametrización específica. A esta clase se la puede
referenciar utilizando el símbolo de interrogación como
parámetro. Así, la clase VectorDinamico<?> es
superclase de todas las clases VectorDinamico, y puede
utilizarse para aquellos casos en los que deseemos
realizar alguna operación sobre un VectorDinamico sin
importarnos el tipo de objeto que almacena.
Métodos genéricos
• Al igual que se definen clases genéricas, es posible definir métodos
genéricos (incluso en clases no genéricas).
• Es posible definir tipos genéricos en el interior de las clases y
utilizarlos para definir los parámetros de los métodos y los valores
devueltos por estos. Al definir el método, las llaves angulares
aparecen después de los modificadores del método y antes del tipo
devuelto.
Genericidad con más de una variable
• Una clase genérica (o un método) puede referencias más de una
variable genérica.
• Ejemplo:
• La interfaz Map<K,V> del API de Java
• public interface Map<K, V>{ … }
• Permite establecer una correspondencia entre objetos de un tipo
(denominados claves) y de otro (denominados valores)
• Ambos tipos pueden coincidir.
• Ejemplo de instanciación:
• Map<Integer, String> m = new SortedMap<Integer, String>();
• m.put(new Integer(5), “casa”);
• String s = m.get(new Integer(5));
Bibliografía
• Tutorial “Learning the Java Lenguage. Generics”
disponible en Inglés en la siguiente dirección:
http://java.sun.com/docs/books/tutorial/java/generics/
Colecciones de Objetos
• Una colección de objetos es sencillamente un conjunto
de cosas del mismo tipo.
• En Java, existen colecciones de objetos que también son
considerados otros objetos, están modelados por clases o
por estructuras primitivas. ArrayList es una clase que
modela a un grupo especial de colecciones.
ArrayList
• La clase ArrayList almacena un conjunto de objetos del
mismo tipo a manera de lista. Java tiene una suite
completa de objetos “Collection” que almacenan objetos
de varias maneras. ArrayList es el tipo de colección más
famoso y comúnmente usado.
Métodos
Ejemplo de operaciones más utilizadas
• Declaración de un ArrayList de enteros
• Creación de un ArrayList de enteros
• Añadiendo elementos al ArrayList
• Conociendo el tamaño del ArrayList
• Obteniendo un elemento del ArrayList
• Borrando un elemento del ArrayList
• Existen otras clases que modelan colecciones de objetos
como HashMap, HashSet, Vector, etc. todas ellas propias
de Java. También existen estructuras primitivas para
manejar conjuntos de elementos conocidas como
arreglos.