1 Pedro García López [email protected]/Lenguajes de Programación Tema 4. Paradigma Orientado a Objetos Java 1.5 Pedro García López
2 Versiones de Java Oak: Designed for embedded devicesJava: Original, not very good version (but it had applets) Java 1 Java 1.1: Adds inner classes and a completely new event-handling model Java 1.2: Includes “Swing” but no new syntax Java 2 Java 1.3: Additional methods and packages, but no new syntax Java 1.4: More additions and the assert statement Java 1.5: Generics, enums, new for loop, and other new syntax Java 5.0
3 Nuevas caraterísticas de Java 1.5Generics (Polimorfismo paramétrico) Comprobación de tipos en tiempo de compilación, elimina el uso intensivo de Object y las conversiones de tipos Iterador for mejorado Mejora sintáctica que mejora el uso de Iteradores Autoboxing/unboxing Wrapping autómático de tipos primitivos Tipos enumerados Mejoran la legibilidad del código y evitan el uso de interfaces Static import Permite utilizar métodos estáticos sin precederlos de su clase
4 Iterador for mejorado Sintaxis: for(type var : array) {...} o for(type var : collection) {...} Ejemplo (Array): for(float x : miArray) suma += x; Ejemplo (colecciones) Antes: for (Iterator iter = granja.iterator(); iter.hasNext(); ) ((Animal) iter.next()).habla(); Ahora: for (Animal a : granja) a.habla();
5 Iterar sobre nuestras clasesjava.lang interface Iterable
6 Auto boxing/unboxing Java no permitirá usar tipos primitivos donde se esperan objetos (necesitas un Wrapper) myVector.add(new Integer(5)); Por otro lado, no podemos usar un object donde se espera un tipo primitivo(necesitas convertirlo-unwrap) int n = ((Integer)myVector.lastElement()).intValue(); Java 1.5 lo hace automático: Vector
7 Tipos enumerados Una enumeración es simplemente un conjunto de constantes que representan diferentes valores Como se resolvia antes (java 1.4) public final int SPRING = 0; public final int SUMMER = 1; public final int FALL = 2; public final int WINTER = 3; Ahora sería así: enum Season { WINTER, SPRING, SUMMER, FALL }
8 enums son clases Un enum es un nuevo tipo de clasePuedes declarar variables de tipo enumerado y tener comprobación de tipos en tiempo de compilación Cada valor declarado es una instancia de la clase enum Los Enums son implícitamente public, static y final Puedes comparar enums con equals o == enums hereda de java.lang.Enum e implementa java.lang.Comparable Así que los enums pueden ser ordenados Enums redefinen toString() y proporcionan valueOf() Ejemplo: Season season = Season.WINTER; System.out.println(season ); // prints WINTER season = Season.valueOf("SPRING"); // sets season to Season.SPRING
9 Ventajas de enum Enums ofrecen chequeos en tiempo de compilaciónImplementar enum con interfaces e ints no proporciona chequeo de tipos: season = 43; Enums ofrecen un espacio de nombres coherente para cada tipo enumerado (Season.WINTER) Enums son robustos If añades, eliminas, o reordenas constantes, debes recompilar Como los enum son objetos, los puedes guardar en colecciones. Y puedes añadirles campos y métodos
10 Enums son clases public enum Coin { private final int value;Coin(int value) { this.value = value; } PENNY(1), NICKEL(5), DIME(10), QUARTER(25); public int value() { return value; } }
11 Otras características de los enumsvalues() devuelve un array de tipos enumerados Season[] seasonValues = Season.values(); switch funciona sobre enumerados switch (thisSeason) { case SUMMER: ...; default: ...} Debes poner case SUMMER:, y no case Season.SUMMER:
12 varargs Puedes crear métodos y constructores con un número indeterminado de parámetros public void foo(int count, String... cards) { body } El “...” quiere decir cero o más argumentos La llamada podría ser foo(13, "ace", "deuce", "trey"); Solo el último parámetro puede ser vararg Para iterar sobre los argumentos se utiliza el nuevo iterador for: for (String card : cards) { loop body }
13 Static import Ya no es necesario poner: Physics.AVOGADROS_NUMBERimport static org.iso.Physics.*; class Guacamole { public static void main(String[] args) { double molecules = AVOGADROS_NUMBER * moles; } } Ya no es necesario poner: Physics.AVOGADROS_NUMBER Otro ejemplo: import static java.lang.System.out; out.println(something);
14 Polimorfismo paramétrico: GenericsPermite parametrizar tipos Ejemplo de Colecciones: List
15 Ejemplo Antes: Despues: List granja = new ArrayList();granja.add(perro); Animal a = (Animal)granja.get(0); granja.add(“hola”); Animal a = (Animal)granja.get(1); // ERROR !!! Despues: List
16 Simplemente te ahorra castings ?Chequeo en tiempo de compilación Si introducimos otro tipo nos avisa, no falla con ClassCastException en tiempo de ejecución Refuerza las relaciones entre clases Ahora sabemos que un banco tiene una lista de Cuentas. Es más legible y obliga al programador.
17 Clases genéricas class Cosa
18 Usando clases genéricasCosa
19 Métodos genéricos class Bicho {public
20 Polimorfismo paramétrico restringidoTambién llamado bounded polimorfism Permite restringir el tipo T mediante la herencia
21 Ejemplo: class Cosa2
22 Ejemplo Cosa2
23 Restringiendo métodosclass Bicho { public
24 Tipos encadenados (Nested types)Podríamos decir: class Cosa
25 Cuidado con T No podemos instanciar tipos genéricos:T elem = new T(); No podemos instanciar un array de T T lista[] = new T[5]; Si podemos instanciar una colección de T dentro de una clase o método genérico List
26 Wildcards ( ? ) Cosa
27 Ejemplos public static
28 Ejemplos public static void main( String args[] ) {Collection
29 Ejemplos public static
30 Ejemplos public static
31 + Ejemplos (Bounded Wildcards)public static
32 Y + Ejemplos public static void main(String[] args) {Animal a = new Animal(3,3); Gato g = new Gato(1,2); LoroMutante lM = new LoroMutante(3,3); LinkedList
33 Lower Bounded Wildcards super T> Representa un tipo que es una superclase de T o es T Lo contrario de extends Sirve para organizar pasos de parámetros
34 Multiples límites:
35 java.util Interface Collection
36 Interface Iterator
37 java.util Interface Map
38 java.util Interface Comparator
39 Erasure- Borrado de tiposA diferencia de C++, el compilador Java elimina la información de tipos parametrizados por compatibilidad con versiones anteriores. El polimorfismo paramétrico es una característica que solo existe en tiempo de compilación, Java hace el trabajo sucio entre bambalinas (castings, T -> Object, …). Las instancias de objetos no tienen información de tipos parametrizados en tiempo de ejecución List
40 Ejemplo: Tiempo de compilación: public String loophole(Integer x) {List
41 Ejemplo del Map public interface Imap
42 public class Mayusculas implements Imap
43 int lista[] = {1,2,3,4,5}; String lista2[] = {"pedro","lenguajes","programacion","Java","haskell"}; LinkedList
44 Diferencias con el map de 1.4 ?System.out.println("lista de cuadrados:"); List