lemus.webs.upv.es• • java lenguaje java 5. campos y variables: simples o complejos utilizaremos...

147
Lenguaje Java Sesión 1: Introducción al Lenguaje Java

Upload: others

Post on 08-May-2020

12 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Lenguaje Java

Sesión 1: Introducción al Lenguaje Java

Page 2: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Índice

Java Lenguaje Java 2

• Introducción a Java• Conceptos de POO• Elementos de un programa Java• Herencia, interfaces, polimorfismo• Hilos• Clases útiles

Page 3: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Java

Java Lenguaje Java 3

• Java es un lenguaje OO creado por Sun Microsystems para poder funcionar en distintos tipos de procesadores y máquinas.

• Similar a C o C++, pero con algunas características propias (gestión de hilos, ejecución remota, etc)

• Independiente de la plataforma, gracias a la JVM(Java Virtual Machine), que interpreta los ficherosobjeto

• Se dispone de antemano de la API (Application Programming Interface) de clases de Java.

Page 4: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Clases

Java Lenguaje Java 4

• Clases: con la palabra class y el nombre de la clase

•••

Como nombre utilizaremos un sustantivo Puede estar formado por varias palabrasCada palabra comenzará con mayúscula, el resto se dejará en minúscula

•• Por ejemplo: DataInputStream

Si la clase contiene un conjunto de métodos estáticos o constantes relacionadas pondremos el nombre en plural

• Por ejemplo: Resources

class MiClase

{

...

}

Page 5: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

••

Java Lenguaje Java 5

Campos y variables: simples o complejos Utilizaremos sustantivos como nombres

Puede estar formado por varias palabras, con la primera en minúsculas y el resto comenzando por mayúsculas y el resto en minúsculas

• Por ejemplo: numVidasEn caso de tratarse de una colección de elementos, utilizaremos plural

• Por ejemplo: clientesPara variables temporales podemos utilizar nombres cortos, como las iniciales de la clase a la que pertenezca, o un carácter correspondiente al tipo de dato

Campos y variables

Properties propiedades;

File ficheroEntrada;

int numVidas;

int i;

Vector v;

DataInputStream dis;

Page 6: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Constantes

Java Lenguaje Java 6

• Constantes: Se declarán como final y static

• El nombre puede contener varias palabras• Las palabras se separan con ‘_’

• Todo el nombre estará en mayúsculas• Por ejemplo: MAX_MENSAJES

final static String TITULO_MENU = “Menu”;

final static int ANCHO_VENTANA = 640;

final static double PI = 3.1416;

Page 7: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Métodos

Java Lenguaje Java 7

• Métodos: con el tipo devuelto, nombre y parámetros

••

Los nombres de los métodos serán verboPuede estar formados por varias palabras, con la primera en minúsculas y el resto comenzando por mayúsculas y el resto en minúsculas

• Por ejemplo: imprimirDatos

void imprimir(String mensaje)

{

...// Codigo del método

}

Vector insertarVector(Object elemento, int posicion)

{

...// Codigo del método

}

Page 8: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Constructores

Java Lenguaje Java 8

• Constructores: se llaman igual que la clase, y se ejecutan con el operador new para reservar memoria

No hace falta destructor, de eso se encarga el garbage collectorConstructor superclase: super(…)

MiClase()

{...// Codigo del constructor

}

MiClase(int valorA, Vector valorV)

{...// Codigo del otro constructor

}

Page 9: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Paquetes•

Paquetes: organizan las clases en una jerarquía de paquetes y subpaquetesPara indicar que una clase pertenece a un paquete o subpaquete se utiliza la palabra package al principio de la clase

• Para utilizar clases de un paquete en otro, se colocan al principio sentencias import con los paquetes necesarios:

package paquete1.subpaquete1;

class MiClase {

package otropaquete;import paquete1.subpaquete1.MiClase;

import java.util.*;

class MiOtraClase {

Java Lenguaje Java 9

Page 10: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Paquetes• Si no utilizamos sentencias import, deberemos

escribir el nombre completo de cada clase del paquete no importado (incluyendo subpaquetes)

• Los paquetes se estructuran en directorios en el disco duro, siguiendo la misma jerarquía de paquetes y subpaquetes

class MiOtraClase {paquete1.subpaquete1.MiClase a = ...; // Sin import

MiClase a = ...; // Con import

Java Lenguaje Java 10

./paquete1/subpaquete1/MiClase.java

Page 11: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Paquetes

Java Lenguaje Java 11

• Siempre se deben incluir las clases creadas en un paquete• Si no se especifica un nombre de paquete la clase

pertenecerá a un paquete “sin nombre”• No podemos importar clases de paquetes “sin

nombre”, las clases creadas de esta forma no serán accesibles desde otros paquetes

• Sólo utilizaremos paquetes “sin nombre” para hacer una prueba rápida, nunca en otro caso

Page 12: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Convenciones de paquetes

Java Lenguaje Java 12

• El nombre de un paquete deberá constar de una serie de palabras simples siempre en minúsculas

• Se recomienda usar el nombre de nuestra DNS al revésespecialistajee.org ◊ org.especialistajee.prueba

• Colocar las clases interdependientes, o que suelan usarse juntas, en un mismo paqueteSeparar clases volátiles y estables en paquetes diferentesHacer que un paquete sólo dependa de paquetes más estables que élSi creamos una nueva versión de un paquete, daremos el mismo nombre a la nueva versión sólo si es compatible con la anterior

Page 13: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipo enumerado

Java Lenguaje Java 13

enum EstadoCivil {soltero, casado, divorciado};

EstadoCivil ec = EstadoCivil.casado;

ec = EstadoCivil.soltero;

switch(ec) {

case soltero:

System.out.println("Es soltero"); break;

case casado:

System.out.println("Es casado"); break;

case divorciado:

System.out.println("Es divorciado"); break;

}

Page 14: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Otras características

Java Lenguaje Java 14

• Imports estáticosimport static java.lang.Math;…

double raiz = sqrt(1252.2);

• Argumentos variablespublic void miFunc(String param, int... args) {

for(int i: args) { … }}

• Anotaciones (metainformación)• P.ej., @deprecated

Page 15: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Convenciones generales

Java Lenguaje Java 15

••••

Indentar el código uniformementeLimitar la anchura de las líneas de código (para impresión) Utilizar líneas en blanco para separar bloques de códigoUtilizar espacios para separar ciertos elementos en una líneaDocumentación:• Utilizar /*... */ para esconder código sin borrarlo• Utilizar // ... para detalles de la implementación• Utilizar javadoc para describir la interfaz de

programación

Page 16: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Modificadores de acceso

Java Lenguaje Java 16

• Las clases y sus elementos admiten unos modificadores de acceso:

• privado: el elemento es accesible sólo desde la clase en que se encuentra

• protegido: el elemento es accesible desde la propia clase, desde sus subclases, y desde clases del mismo paquete

• público: el elemento es accesible desde cualquier clase

• paquete: el elemento es accesible desde la propia clase, o desde clases del mismo paquete.

Page 17: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Modificadores de acceso

Java Lenguaje Java 17

• private se utiliza para elementos PRIVADOS• protected se utiliza para elementos

PROTEGIDOS• public se utiliza para elementos PUBLICOS• No se especifica nada para elementos PAQUETE

• Todo fichero Java debe tener una y solo una clase pública, llamada igual que el fichero (más otras clases internas que pueda tener)

public class MiClase {

private int n;

protected void metodo() { ... }

Page 18: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Modificadores de acceso

Java Lenguaje Java 18

La misma Cualquier Subclase de Cualquierclase clase del otro paquete clase de otro

mismo paquetepaquete

publicsí sí sí sí

protectedsí sí sí

defaultsí sí sí

privatesí

Page 19: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Otros modificadores

Java Lenguaje Java 19

••

abstract: para definir clases y métodos abstractosstatic: para definir elementos compartidos por todos los objetos que se creen de la misma clase

••

miembros que no pertenecen al objeto en si, sino a la clasedentro de un método estático sólo podemos utilizar elementosestáticos, o elementos que hayamos creado dentro del propiométodo

• final: para definir elementos no modificables ni heredables

public abstract class MiClase {

public static final int n = 20;

public abstract void metodo();

...

Page 20: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Otros modificadores

Java Lenguaje Java 20

• volatile y synchronized: para elementos a los que no sepuede acceder al mismo tiempo desde distintos hilos deejecución– volatile no proporciona atomicidad pero es más eficientevolatile int contador;

contador++; //puede causar problemas, son 3 operaciones diferentes

– synchronized se usa sobre bloques de código y métodossynchronized(this){

contador++;

}

Page 21: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Otros modificadores

Java Lenguaje Java 21

native: para métodos que están escritos en otro lenguaje, por ejemplo en C++, utilizando JNI (Java Native Interface)transient: para atributos que no forman parte de la persistencia de objeto, para evitar que se serialicenstrictfp: evitar que se utilice toda la precisión de punto flotante que proporcione la arquitectura. Usar el estándar del IEEE para float y double. No es aconsejable a menos que sea necesario.

Page 22: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Herencia y polimorfismo

Java Lenguaje Java 22

• Herencia: definir una clase a partir de otra existente• La nueva clase “hereda” todos los campos y métodos

de la clase a partir de la que se crea, y aparte puede tener los suyos propios

• Ejemplo: a partir de una clase Animal podemos definir otras más concretas como Pato, Elefante…

Polimorfismo: si tenemos un método en cualquier clase que sea dibuja (Animal a), podemos pasarle como parámetro tanto un objeto Animal como cualquier subtipo que herede directa o indirectamente de él (Elefante, Pato…)

Page 23: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Clases abstractas e interfaces

Java Lenguaje Java 23

• Una clase abstracta es una clase que deja algunos métodos sin código, para que los rellenen las subclases que hereden de ella

• Un interfaz es un elemento que sólo define la cabecera de sus métodos, para que las clases que implementen dicha interfaz rellenen el código según sus necesidades.

• Asignaremos un nombre a los interfaces de forma similar a las clases, pudiendo ser en este caso adjetivos o sustantivos.

public abstract class MiClase {

public abstract void metodo1();

public void metodo2() {...

}

}

public interface Runnable {

public void run();

}

Page 24: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Herencia e interfaces

Java Lenguaje Java 24

• Herencia••

Definimos una clase a partir de otra que ya existeUtilizamos la palabra extends para decir que una clase hereda de otra (Pato hereda de Animal):

•• Relación “es”: Un pato ES un animal

Interfaces• Utilizamos la palabra implements para decir que una clase

implementa los métodos de una interfaz

• Relación “actúa como”: MiHilo ACTÚA COMO ejecutable

class Pato extends Animal

class MiHilo implements Runnable {

public void run() {

... // Codigo del método

}

Page 25: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Polimorfismo

Java Lenguaje Java 25

• Si una variable es del tipo de la superclase, podemos asignarle también un objeto de la clase hija

• Si una variable es del tipo de una interfaz implementada por nuestra clase, podemos asignarle también un objeto de esta clase

• Sólo se puede heredar de una clase, pero se pueden implementar múltiples interfaces:class Pato extends Animal implements Runnable, ActionListener

Runnable r = new MiHilo();

Animal a = new Pato();

Page 26: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

• this se utiliza para hacer referencia a los elementos de la propia clase:

• super se utiliza para llamar al mismo método en la superclase:

Punteros this y super

class MiClase {

int i;

MiClase(int i) {

this.i = i;

Java Lenguaje Java 26

// i de la clase = i del parámetro

class MiClase extends OtraClase{

MiClase(int i) {

super(i); // Constructor de OtraClase(...)

Page 27: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Object

Java Lenguaje Java 27

• Clase base de todas las demás• Todas las clases heredan en última instancia de ella

• Es importante saber las dependencias (herencias, interfaces, etc) de una clase para saber las diferentes formas de instanciarla o referenciarla (polimorfismo)

Page 28: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Ejemplo de polimorfismo• Por ejemplo, si tenemos:

public class MiClase extends Thread

implements List

• Podremos referenciar un objeto MiClase de estas formas:MiClase mc = new MiClase();Thread t = new MiClase();List l = new MiClase();Object o = new MiClase();

Java Lenguaje Java 28

Page 29: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Object: objetos diferentes

Java Lenguaje Java 29

• También es importante distinguir entre entidades independientes y referencias:MiClase mc1 = new MiClase(); MiClase mc2 = mc1;// Es distinto a:MiClase mc2 = (MiClase)(mc1.clone());

• El método clone de cada objeto sirve para obtener una copia en memoria de un objeto con los mismos datos, pero con su propio espacio• No realiza una copia en profundidad• Si queremos hacer copias de los objetos que tenga

como campos debe sobrescribir este método

Page 30: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Object: comparar objetos

Java Lenguaje Java 30

• Cuando queremos comparar dos objetos entre sí (por ejemplo, de la clase MiClase), no se hace así: if (mc1 == mc2)

• Sino con su método equals: if (mc1.equals(mc2))

• Deberemos redefinir este método en las clasesdonde lo vayamos a usar, para asegurarnos deque los objetos se comparan bien• Notar que la clase String, es un subtipo de Object por

lo que para comparar cadenas...:if (cadena == “Hola”) ... // NO if (cadena.equals(“Hola”)) ... // SI

Page 31: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Object: representar en cadenas

Java Lenguaje Java 31

• Muchas veces queremos imprimir un objeto como cadena. Por ejemplo, si es un punto geométrico, sacar su coordenada X, una coma, y su coordenada YLa clase Object proporciona un método toString para definir cómo queremos que se imprima un objeto.Podremos redefinirlo a nuestro gustopublic class Punto2D {

...public String toString(){

return “(“ + x + ”,” + y + ”)”;}

}...Punto2D p = ...;System.out.println(p); // Imprimirá (x, y) del punto

Page 32: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Properties• Esta clase es un tipo de tabla hash que almacena

una serie de propiedades, cada una con un valor asociado

• Además, permite cargarlas o guardarlas en algún dispositivo (fichero)

• Algunos métodos interesantes:Object setProperty(Object clave, Object valor)Object getProperty(Object clave)Object getProperty(Object clave, Object default)

void load(InputStream entrada)void store(OutputStream salida, String cabecera)

Java Lenguaje Java 32

Page 33: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

System

Java Lenguaje Java 33

• Ofrece métodos y campos útiles del sistema, como el ya conocido System.out.println

• Otros métodos interesantes de esta clase (todos estáticos):

void exit(int estado) void gc()long currentTimeMillis()void arrayCopy(Object fuente, int pos_fuente,

Object destino, int pos_destino, int numElementos)

Page 34: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Otras clases

Java Lenguaje Java 34

• La clase Math proporciona una serie de métodos (estáticos) útiles para diferentes operaciones matemáticas (logaritmos, potencias, exponenciales, máximos, mínimos, etc)

• Otras clases útiles son la clase Calendar (para trabajar con fechas y horas), la clase Currency (para monedas), y la clase Locale (para situarnos en las características de fecha, hora y moneda de una región del mundo)

Page 35: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Transfer Objects

Java Lenguaje Java 35

• Encapsulan datos con los que normalmente se trabaja de forma conjunta

• Nos permiten transferir estos datos entre las diferentes capas de la aplicación

public class Usuario {

private String login;

private String password;

private boolean administrador;

}

Page 36: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Getters y Setters

Java Lenguaje Java 36

• Es buena práctica de programación declarar todos los campos de las clases privados

• Para acceder a ellos utilizaremos métodos• Getters para obtener el valor del campo• Setters para modificar el valor del campo

• Estos métodos tendrán prefijo get y set respectivamente, seguido del nombre del campo al que acceden, pero comenzando por mayúscula• Por ejemplo: getLogin(), setLogin(String login)

• El getter para campos booleanos tendrá prefijo isen lugar de get• Por ejemplo: isAdministrador()

Page 37: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

BeanUtils

Java Lenguaje Java 37

• Utilidades de la biblioteca commons-beanutils de Apache.

• BeanUtils.copyProperties(objDestino, objOrigen)• Copia los campos comunes entre los dos objetos• Los reconoce usando la API de Reflection• La identificación está basada en los nombres de

los getters y los setters y en su tipo de dato.• Ejemplo: int origen.getNombreCampo( ), e

void destino.setNombreCampo(int n).

Page 38: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

BeanUtils

Java Lenguaje Java 38

• Ejemplo: proyección de un punto3D en un punto2D.

• En lugar de copiar todos los campos uno a uno:

• usamos copyProperties:

public class Punto2D { private int x; private int y;private String descripcion;

public String getDescripcion() {return descripcion;

}public void setDescripcion(String descripcion) {

this.descripcion = descripcion;}

public int getX() {

return x;}public void setX(int x) {

this.x = x;}

public int getY() {return y;

}public void setY(int y) {

this.y = y;}

}

public class Punto3D { private int x; private int y; private int z;private String descripcion;/* ...y los getters y setters para los cuatro campos */}

punto2D.setX(punto3D.getX()); punto2D.setY(punto3D.getY()); punto2D.setDescripcion(punto3D.getDescripcion());

BeanUtils.copyProperties(punto2D, punto3D);

Page 39: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Lenguaje Java

Sesión 2: Colecciones de datos

Page 40: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Índice

Java Colecciones -40

• Introducción• Colecciones• Enumeraciones e iteradores• Polimorfismo e interfaces• Wrappers de tipos básicos

Page 41: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Introducción

Java Colecciones -41

• Java proporciona un amplio conjunto de clases útiles para desarrollar aplicaciones

• En esta sesión veremos algunos grupos de ellas:• Clases útiles para crear y gestionar diferentes tipos de

colecciones• Clases para recorrer, ordenar y manipular las

colecciones• Clases para encapsular nuestros tipos de datos

Page 42: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Colecciones

Java Colecciones -42

•••

En el paquete java.utilRepresentan grupos de objetos, llamados elementosPodemos encontrar de distintos tipos, según si sus elementos están ordenados, si permiten repetir elementos, etcLa interfaz Collection define el esqueleto que deben tener todos los tipos de coleccionesPor tanto, todos tendrán métodos generales como:

••••••••

boolean add(Object o) boolean remove(Object o) boolean contains(Object o) void clear()boolean isEmpty() Iterator iterator() int size()Object[] toArray()

Page 43: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Listas de elementos

Java Colecciones -43

• La interfaz List hereda de Collection• Operaciones propias de una colección tipo lista• Los elementos tienen un orden (posición en la lista)

• Así, tendremos otros nuevos métodos, además de los de Collection:

•••••

void add(int posicion, Object o)

Object get(int indice)

int indexOf(Object o)

Object remove(int indice)

Object set(int indice, Object o)

Page 44: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipos de listas

Java Colecciones -44

• ArrayList: implementa una lista de elementos mediante un array de tamaño variable• NO sincronizado

• Vector: existe desde las primeras versiones de Java, después se acomodó al marco de colecciones implementando la interfaz List.• Similar a ArrayList, pero SINCRONIZADO. Tiene métodos

anteriores a la interfaz List:• void addElement(Object o) / boolean removeElement(Object o)• void insertElementAt(Object o, int posicion)• void removeElementAt(Object o, int posicion)• Object elementAt(int posicion)• void setElementAt(Object o, int posicion)• int size()

• LinkedList: lista doblemente enlazada. Útil para simular pilas o colas

•••

void addFirst(Object o) / void addLast(Object o) Object getFirst() / Object getLast()Object removeFirst() / Object removeLast()

Page 45: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Conjuntos

Java Colecciones -45

• Grupos de elementos donde no hay repetidos• Consideramos dos objetos de una clase iguales

si su método equals los da como iguales• o1.equals(o2) es true

• Los conjuntos se definen en la interfaz Set, que, como List, también hereda de Collection

• El método add definido en Collection devolvía un booleano, que en este caso permitirá saber si se insertó el elemento en el conjunto, o no (porque ya existía)

Page 46: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipos de conjuntos

Java Colecciones -46

• HashSet: los objetos del conjunto se almacenan en una tabla hash.• El coste de inserción, borrado y modificación suele ser

constante• La iteración es más costosa, y el orden puede diferir

del orden de inserciónLinkedHashSet: como la anterior, pero la tabla hashtiene los elementos enlazados, lo que facilita la iteraciónTreeSet: guarda los elementos en un árbol• El coste de las operaciones es logarítmico

Page 47: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Mapas

Java Colecciones -47

• No forman parte del marco de colecciones• Se definen en la interfaz Map, y sirven para

relacionar un conjunto de claves (keys) con sus respectivos valores

• Tanto la clave como el valor pueden ser cualquier objeto

•••••

Object get(Object clave)Object put(Object clave, Object valor)

Object remove(Object clave)

Set keySet()

int size()

Page 48: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipos de mapas

Java Colecciones - 48

• HashMap: Utiliza una tabla hash para almacenar los paresclave=valor.• Las operaciones básicas (get y put) se harán en tiempo

constante si la dispersión es adecuada• La iteración es más costosa, y el orden puede diferir del orden de

inserción• Hashtable: como la anterior, pero SINCRONIZADA.

Como Vector, está desde las primeras versiones de Java• Enumeration keys()

• TreeMap: utiliza un árbol para implementar el mapa••

El coste de las operaciones es logarítmicoLos elementos están ordenados ascendentemente por clave

Page 49: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Genéricos

Java Colecciones - 49

• Colecciones de tipos concretos de datos• A partir de JDK 1.5• Aseguran que se utiliza el tipo de datos

correcto

ArrayList<String> a = new ArrayList<String>();

a.add("Hola");

String s = a.get(0);

• Podemos utilizar genéricos en nuestras propias clases

Page 50: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Enumeraciones e iteradores

Java Colecciones - 50

• Las enumeraciones y los iteradores no son tipos de datos en sí, sino objetos útiles a la hora de recorrer diferentes tipos de colecciones

• Con las enumeraciones podremos recorrer secuencialmente los elementos de una colección, para sacar sus valores, modificarlos, etc

• Con los iteradores podremos, además de lo anterior, eliminar elementos de una colección, con los métodos que proporciona para ello.

Page 51: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Enumeraciones

Java Colecciones - 51

• La interfaz Enumeration permite consultar secuencialmente los elementos de una colección

• Para recorrer secuencialmente los elementos de la colección utilizaremos su método nextElement:Object item = enum.nextElement();

• Para comprobar si quedan más elementos que recorrer, utilizamos el método hasMoreElements:

if (enum.hasMoreElements()) ...

Page 52: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Enumeraciones

• Con lo anterior, un bucle completo típico para recorrer una colección utilizando su enumeración de elementos sería:

// Obtener la enumeracion

Enumeration enum = coleccion.elements(); while (enum.hasMoreElements()){

Object item = enum.nextElement();...// Convertir item al objeto adecuado y

// hacer con el lo que convenga}

Java Colecciones - 52

Page 53: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Iteradores

Java Colecciones - 53

• La interfaz Iterator permite iterar secuencialmente sobre los elementos de una colección

• Para recorrer secuencialmente los elementos de la colección utilizaremos su método next:Object item = iter.next();

• Para comprobar si quedan más elementos que recorrer, utilizamos el método hasNext:if (iter.hasNext()) ...

• Para eliminar el elemento de la posición actual del iterador, utilizamos su método remove:iter.remove();

Page 54: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Iteradores

• Con lo anterior, un bucle completo típico para recorrer una colección utilizando su iterador sería:

// Obtener el iterador

Iterator iter = coleccion.iterator(); while (iter.hasNext()){

Object item = iter.next();...// Convertir item al objeto adecuado y

// hacer con el lo que convenga, por ejemplo iter.remove();

}

Java Colecciones - 54

Page 55: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Bucles sin iteradores

Java Colecciones - 55

• Nueva versión del for en JDK 1.5• Permite recorrer tanto arrays como colecciones• Previene salirse del rango de forma segura

List<String> lista = obtenerLista();

for(String cadena: lista)System.out.println (cadena);

Page 56: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Polimorfismo e interfaces

Java Colecciones - 56

• Hacer referencia siempre mediante la interfaz• Permite cambiar la implementación sin afectar al

resto del programa

public class Cliente { List<Cuenta> cuentas; public Cliente() {this.cuentas = new ArrayList<Cuenta>();

}public List<Cuenta> getCuentas() { return cuentas;

}}

Page 57: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Ejemplo: Algoritmos

Java Colecciones - 57

• La clase Collections dispone de una serie de métodos útiles para operaciones tediosas, como ordenar una colección, hacer una búsqueda binaria, sacar su valor máximo, etc

••••

static void sort(List lista)static int binarySearch(List lista, Object objeto)

static Object max(Collection col)

...

• Sirven para cualquier implementación de List

Page 58: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Comparación de objetos

Java Colecciones - 58

••

Los objetos deben ser correctamente comparables para ser compatibles con las estructuras de datos y algoritmos.Comparación de igualdad: equals( )Comparación de mayor o menor: clase Comparator o interfaz Comparable

Page 59: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Sobrecarga de Equals

Java Colecciones - 59

• Object.equals(Object o)

public class MiClase {...@Overridepublic boolean equals(Object o) {

// return true o false, según un criterio}

}

Page 60: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Evitar la sobrecarga de Equals si:

Java Colecciones - 60

Cada instancia es intrínsecamente única. Por ejemplo, instancias de hilos, que representan entidades activas, y no tan sólo un conjunto de valores.Cuando no es necesaria una comparación lógica. Por ejemplo, dos números aleatorios, donde la igualdad puede ocurrir pero su comprobación no es necesaria.Una superclase ya sobrecarga equals, y el comportamiento de éste es apropiado para la clase actual.

Page 61: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Propiedades que debe cumplir

Simetría: para cualquier par de instancias no nulas, x.equals(y) devuelve verdadero si y sólo si y.equals(x) también devuelve verdadero.Transitividad: si x.equals(y)==true y y.equals(z)==true, entonces x.equals(z) también será verdadero, para cualesquiera instancias no nulas.

Page 62: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Sobrecargar hashCode( )Cuando hashCode es invocado varias veces para el mismo objeto, debe devolver consistentemente el mismo entero, siempre que no se haya modificado ninguna información que afecte al resultado de equals. Esta consistencia debe mantenerse entre distintas ejecuciones de la misma aplicación.Si dos objetos son iguales según equals, entonces los métodos hashCode de ambos deben devolver el mismo entero.

Page 63: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Comparar implementando Comparable

Java Colecciones - 63

••

Permite establecer un orden entre objetosSe necesita decidir qué características del objeto establecen dicho orden

public class Persona implements Comparable<Persona> {public int id;public String apellido;...@Overridepublic int compareTo(Persona p) {

return this.id - p.id;}

}

Page 64: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Comparador externo: Comparator

Java Colecciones - 64

• Puede extenderse o bien desde una clase externa, o bien desde la propia clase cuyos objetos deben ser comparados

public class ComparaPersonaPorNombre implementsComparator<Persona>{

public int compare(Persona p1, Persona p2) {return p1.apellido.compareToIgnoreCase(p2.apellido);

}}...

List personas = new ArrayList<Persona>(); personas.add(p1); personas.add(p2); personas.add(p3); //...

Collections.sort(personas); //Comparable.compareTo Collections.sort(personas, new ComparaPersonaPorNombre());//Comparator.compare

Page 65: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Ejemplo: Wrappers de colecciones

Java Colecciones - 65

• Objetos que envuelven la instancia de una colección existente

• Implementa la misma interfaz (p.ej List)• No conocemos la clase concreta del wrapper

• Cambia el comportamiento de algunos métodos• Sincronizar acceso a la colección

List Collections.synchronizedList(List l)

• Hacerla de sólo lectura

List Collections.unmodifiableList(List l)

Page 66: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Wrappers

Java © 2012-2013 Depto. Ciencia de la Computación e IA Colecciones - 66

• Los tipos simples (int, char, float, double, etc) no pueden incluirse directamente en colecciones, ya que éstas esperan subtipos de Object en sus métodos

• Para poderlos incluir, se tienen unas clases auxiliares, llamadas wrappers, para cada tipo básico, que lo convierten en objeto complejo

• Estas clases son, respectivamente, Integer, Character, Float, Double, etc.

• Encapsulan al tipo simple y ofrecen métodos útiles para poder trabajar con ellos

Page 67: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Wrappers

Java © 2012-2013 Depto. Ciencia de la Computación e IA Colecciones - 67

• Si quisiéramos incluir un entero en unArrayList, lo podríamos hacer así:

int a;ArrayList al = new ArrayList(); al.add(new Integer(a));

• Si quisiéramos recuperar un entero de unArrayList, lo podríamos hacer así:

Integer entero = (Integer)(al.get(posicion)); int a = entero.intValue();

Page 68: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Autoboxing

Java © 2012-2013 Depto. Ciencia de la Computación e IA Colecciones - 68

• Conversiones automáticas entre tipos básicos y sus wrappers

Integer n = 10;

int num = n;

List<Integer> lista= new ArrayList<Integer>();

lista.add(10);

int elem = lista.get(0);

Page 69: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Lenguaje Java

Sesión 3: Tratamiento de errores

Page 70: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Índice• Excepciones• Captura de excepciones• Propagación de excepciones• Nested exceptions• Errores en tiempo de compilación• Tipos genéricos

Page 71: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tratamiento de errores en tiempo de ejecución• Excepción: Evento que sucede durante la ejecución del programa y que hace que éste salga de su flujo normal de ejecución• Se lanzan cuando sucede un error• Se pueden capturar para tratar el error

• Son una forma elegante para tratar los errores en Java• Separa el código normal del programa del código para

tratar errores.

Page 72: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Jerarquía

Page 73: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipos de excepciones• Checked: Derivadas de Exception

••

Es obligatorio capturarlas o declarar que pueden serlanzadasSe utilizan normalmente para errores que pueden ocurrir durante la ejecución de un programa, normalmente debidos a factores externosP.ej. Formato de fichero incorrecto, error leyendo disco, etc

• Unchecked: Derivadas de RuntimeException

••

• Excepciones que pueden ocurrir en cualquier fragmento de códigoNo hace falta capturarlas (es opcional)Se utilizan normalmente para errores graves en la lógica de un programa, que no deberían ocurrirP.ej. Puntero a null, fuera de los límites de un array,etc

Page 74: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Creación de excepciones• Podemos crear cualquier nueva excepción

creando una clase que herede de Exception (checked), RuntimeException (unchecked) o de cualquier subclase de las anteriores.

public class MiExcepcion extends Exception { public MiExcepcion (String mensaje) {

super(mensaje);

}

}

Page 75: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

try {// Código regular del programa

// Puede producir excepciones

} catch(TipoDeExcepcion1 e1) {// Código que trata las excepciones de tipo

// TipoDeExcepcion1 o subclases de ella.

// Los datos sobre la excepción los encontraremos

// en el objeto e1.

...

} catch(TipoDeExcepcionN eN) {// Código que trata las excepciones de tipo

// TipoDeExcepcionN o subclases de ella.

} finally {// Código de finalización (opcional)

}

try-catch-finally

Page 76: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Ejemplos

int [] hist = leeHistograma();

try {for(int i=1;;i++) hist[i] += hist[i-1];

} catch(ArrayOutOfBoundsException e) { System.out.println(“Error: “ + e.getMessage());

}

int [] hist = leeHistograma();try {

for(int i=1;;i++) hist[i] += hist[i-1];} catch(Exception e) {

System.out.println(“Error: “ + e.getMessage());}

Sólo captura ArrayOutOfBoundsException

Captura cualquier excepción

Page 77: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

• Mensaje de errorString msg = e.getMessage();

• Trazae.printStackTrace();

• Cada tipo concreto de excepción ofrece información especializada para el error que representa

• P.ej. ParseException ofrece el número de la línea del fichero donde ha encontrado el error

Información sobre la excepción

Page 78: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

• Para lanzar una excepción debemos• Crear el objeto correspondiente a la excepción

Exception e = new ParseException(mensaje,linea);

• Lanzar la excepción con una instrucción throw

throw e;

• Si la excepción es checked, declarar que el método puede lanzarla con throws

public void leeFichero() throws ParseException {

...

throw new ParseException(mensaje, linea);

...

}

Lanzar una excepción

Page 79: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Capturar o propagar• Si un método lanza una excepción checked deberemos

• Declarar que puede ser lanzada para propagarla al método llamador

public void init() throws ParseException { leeFichero();

}

• O capturarla para que deje de propagarse

try { leeFichero();

} catch(ParseException e) {System.out.println(“Error en linea “ + e.getOffset() +

“: “ + e.getMessage());}

• Si es unchecked•••

Se propaga al método llamante sin declarar que puede ser lanzada Parará de propagarse cuando sea capturadaSi ningún método la captura, la aplicación terminará automáticamente mostrándose la traza del error producido

Page 80: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Nested exceptions••

Captura excepción causante Lanza excepción propia

try {

...

} catch(IOException e) {

throw new MiExcepcion("Mensaje de error", e);

}

•••

Encadena errores producidos. Facilita depuración. Información detallada del error concreto.Aislar al llamador de la implementación concreta.

Page 81: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Errores en tiempo de compilación••

Son preferibles a los de ejecuciónErrores de sintaxis: ej, falta un punto ycoma, referencia a nombre de variableinexistenteErrores semánticos: de más alto nivel, ej.intentar usar el valor de una variable quenunca se ha inicializado.Errores en cascada: confunden al compilador y no se localiza correctamente la causa del error. Ej, cuando falta el cierre de una llave.

Page 82: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Errores en cascada• Ejemplo:

found

fo ( int i = 0; i < 4; i++ ){}

Prueba.java:24: '.class' expected fo ( int i = 0; i < 4; i++ )

^ Prueba.java:24: ')' expected

fo ( int i = 0; i < 4; i++ )^

Prueba.java:24: not a statementfo ( int i = 0; i < 4; i++ )

^ Pueba.java:24: ';' expected

fo ( int i = 0; i < 4; i++ )^

Prueba.java:24: unexpected type required: value

: classfo ( int i = 0; i < 4; i++ )

^Prueba.java:24: cannot resolve symbol symbol : variable ilocation: class Prueba

fo ( int i = 0; i < 4; i++ )^

6 errors

Page 83: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Warnings• Ayudan a mejorar el estilo y la corrección

del código

• Eclipse: permite aumentar niveles de warning

Page 84: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Herramientas de análisis• Herramientas (externas) de análisis de código

fuente• Detecta código

duplicado,código inalcanzable, código subóptimo, expresiones complicadas,y otras posibles fuentes de bugs

• Plugin para Eclipse

Page 85: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Comprobación de tipos: genéricos

Java © 2012-2013 Depto. Ciencia de la Computación e IA Errores - 85

• Antes de Java 1.5:

• Con tipos genéricos:

List v = new ArrayList(); v.add("test");Integer i = (Integer)v.get(0); // Error en tiempo de ejecución

List<String> v = new ArrayList<String>(); v.add("test");String s = v.get(0); // Correcto (sin necesidad de cast explícito) Integer i = v.get(0); // Error en tiempo ce compilación

Page 86: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Definición de genéricos• Interfaces / Clases

• Uso

public interface List<E> { void add(E x); Iterator<E> iterator();

}

public interface Iterator<E> { E next();boolean hasNext();

}

public class Entry<K, V> {

private final K key;private final V value;

public Entry(K k,V v) { key = k;value = v;

}

public K getKey() {return key;

}

public V getValue() {return value;

}

public String toString() {return "(" + key + ",

" + value + ")";}

}

Entry<String, String> grade440 =new Entry<String, String>("mike", "A");

Entry<String, Integer> marks440 =new Entry<String, Integer>("mike", 100);

System.out.println("grade: " + grade440); System.out.println("marks: " + marks440);

Page 87: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Métodos genéricos• También los métodos se pueden

parametrizar con tipos genéricos

public staticreturn new

<T> Entry<T,T> twice(T value) {SimpleImmutableEntry<T,T>(value, value);

}

Entry<String, String> pair = this.<String>twice("Hello"); // DeclaradoEntry<String, String> pair = twice("Hello"); // Inferido

Page 88: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Subtipos y comodines•

ArrayList<Hija> no es subtipo de ArrayList<Padre>Para flexibilizar el tipo podemos utilizar el comodín: <?>Para acotar el comodín en la jerarquía de herencia usamos super y extendsPermitir clases derivadas: ArrayList<? extends Padre>Permitir superclases (clases padre): ArrayList<? super Padre>

Page 89: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipos genéricos y excepciones• Es posible indicar a un método o una clase

qué excepción debe lanzar, a través de genéricos

public <T extends Throwable> void metodo() throws T{throw new T();

}

// O bien

public class Clase<T extends Throwable>public void metodo() throws T {throw new T();

}}

Page 90: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipos genéricos y excepciones• No es posible es crear excepciones con

tipos genéricos, debido al “borrado de tipos”

• Ejemplo, no se puede hacer:public class MiExcepcion<T extends Object> extends Exception {private T someObject;

public MiExcepcion(T someObject) {this.someObject = someObject;

}

public T getSomeObject() {return someObject;

}}

Page 91: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Borrado de tipos• porque durante la compilación, tras

comprobar que los tipos están bien, éstos se eliminan, el siguiente código pasa a ser:

try {//Código que lanza o bien//MiExcepcion<String>, o bien//MiExcepcion<Integer>

}catch(MiExcepcion<String> ex) {// A

}catch(MiExcepcion<Integer> ex) {// B

}

try {//Código que lanza o bien//MiExcepcion<String>, o bien//MiExcepcion<Integer>

}catch(MiExcepcion ex) {// A

}catch(MiExcepcion ex) {// B

}

Page 92: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Lenguaje Java Avanzado

Sesión 4: Serialización de datos

Page 93: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Índice• Introducción a los flujos de E/S• Entrada y salida estándar• Acceso a ficheros• Acceso a recursos• Acceso a URLs• Codificación de datos• Serialización de objetos

Page 94: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Flujos de E/S• Las aplicaciones muchas veces necesitan

enviar datos a un determinado destino o leerlos de una determinada fuente• Ficheros en disco, red, memoria, otras aplicaciones,

etc• Esto es lo que se conoce como E/S

• Esta E/S en Java se hace mediante flujos (streams)• Los datos se envían en serie a través del flujo• Se puede trabajar de la misma forma con todos los

flujos, independientemente de su fuente o destino

Page 95: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipos de flujos según el tipo de datos• Según el tipo de datos que transportan,

distinguimos• Flujos de bytes (con sufijos InputStream yOutputStream)

• Flujos de caracteres (con sufijos Reader y Writer)• Superclases

Bytes Caracteres

EntradaInputStream

Reader

SalidaOutputStream

Writer

Page 96: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Tipos de flujos según su propósito• Distinguimos:

• Canales de datosSimplemente llevan datos de una fuente a un destino

Ficheros: FileInputStream, FileReader,

FileOutputStream, FileWriter

Memoria: ByteArrayInputStream,CharArrayReader, ...

Tuberías: PipedInputStream, PipedReader, PipedWriter, ...

• Flujos de procesamientoRealizan algún procesamiento con los datos

Impresión: PrintWriter, PrintStream Conversores de datos: DataOutputStream,

DataInputStreamBufferes: BufferedReader

Page 97: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Acceso a los flujos• Todos los flujos tienen una serie de métodos básicos

• Los flujos de procesamiento••

Se construyen a partir de flujos canales de datosLos extienden proporcionando métodos de más alto nivel, p.ej:

FlujosInputStream, Reader

OutputStream, Writer

Métodosread, reset, close

write, flush, close

FlujosBufferedReader

DataOutputStream

PrintStream, PrintWriter

MétodosreadLine

writeInt, writeUTF,...

print, println

Page 98: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Objetos de la E/S estándar• En Java también podemos acceder a la entrada, salida

y salida de error estándar• Accedemos a esta E/S mediante flujos• Estos flujos se encuentran como propiedades estáticas

de la clase System

Tipo de flujoInputStream

PropiedadSystem.in

PrintStream System.out

Entrada

Salida

Salida de error PrintStream System.err

Page 99: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Salida estándar• La salida estándar se ofrece como flujo de

procesamiento PrintStream

• Con un OutputStream a bajo nivel seríademasiado incómoda la escritura

• Este flujo ofrece los métodos print y println que permiten imprimir cualquier tipo de datos básico• En la salida estándar

System.out.println(“Hola mundo”);

• En la salida de errorSystem.err.println(“Error”);

Page 100: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Flujos de ficheros• Canales de datos para acceder a ficheros

• Se puede acceder a bajo nivel directamente de la misma forma que para cualquier flujo

• Podemos construir sobre ellos flujos de procesamiento para facilitar el acceso de estos flujos

EntradaFileReader

SalidaFileWriterCaracteres

Binarios FileInputStream FileOutputStream

Page 101: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Lectura y escritura de ficherospublic void copia_fichero() {

int c;try {FileReader in = new FileReader("fuente.txt"); FileWriter out = new FileWriter("destino.txt"); while( (c = in.read()) != -1){out.write(c);

}in.close();out.close();

} catch(FileNotFoundException e1) { System.err.println("Error: No se encuentra el fichero");

} catch(IOException e2) {System.err.println("Error leyendo/escribiendo fichero");

}}

Page 102: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Uso de flujos de procesamiento

public void escribe_fichero() { FileWriter out = null; PrintWriter p_out = null; try {

out = new FileWriter("result.txt"); p_out = new PrintWriter(out);p_out.println("Este texto será escrito en el fichero");

} catch(IOException e) {System.err.println("Error al escribir en el fichero");

} finally {p_out.close();

}}

Page 103: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Sistema de ficheros• La clase File contiene utilidades para trabajar

con el sistema de ficheros• Constantes para indicar los separadores de directorios

(‘/’ ó ‘\’)Hace las aplicaciones independientes de la plataforma

• Crear, borrar o renombrar ficheros y directorios• Listar los ficheros de un directorio• Comprobar y establecer los permisos sobre ficheros• Obtener la ruta de un fichero• Obtener datos sobre ficheros (tamaño, fecha, etc)• Etc...

Page 104: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Acceso a recursos• Los recursos incluidos en un JAR no se

encuentran directamente en el sistema de ficheros• No podremos utilizar los objetos anteriores para

acceder a ellos• Accedemos a un recurso en el JAR con

getClass().getResourceAsStream(“/datos.txt”);

• Anteponiendo ‘/’ se busca de forma relativa al raíz del JAR

• Si no, buscará de forma relativa al directorio correspondiente al paquete de la clase actual

Page 105: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

URLs• URL = Uniform Resource Locator

• Cadena para localizar los recursos en Internet

• Se compone deprotocolo://servidor[:puerto]/recurso

• P.ej. http://www.ua.es/es/index.htmlSe conecta al servidor www.ua.esA través del puerto por defecto (puerto 80) Utilizando protocolo HTTP para comunicarse Solicita el recurso /es/index.html

Page 106: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

URLs en Java• Se encapsulan en la clase URL

URL url = new URL("http://www.ua.es/es/index.html");

• Es obligatorio especificar el protocolo• P.ej. www.ua.es es una URL mal formada

• Si la URL está mal formada se producirá una excepción MalformedURLException

try {

URL url = new URL("http://www.ua.es/es/index.html");} catch(MalformedURLException e) {

System.err.println("Error: URL mal construida");

}

Page 107: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

• Podemos leer el contenido de la URL abriendo un flujo de entrada con

InputStream in = url.openStream();

• Leeremos de este flujo de la misma forma que con cualquier otro flujo• Con los métodos a bajo nivel (byte a byte)• O utilizando un flujo de procesamiento

• P.ej, si la URL corresponde a un documentoHTML obtendremos el código fuente de estedocumento

Lectura del contenido

Page 108: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Codificación• Podemos codificar de forma sencilla los datos

para enviarlos a través de un flujo de bytes (en serie)

• Utilizaremos un flujo DataOutputStreamString nombre = "Jose"; int edad = 25;

ByteArrayOutputStream baos = new ByteArrayOutputStream();

DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(nombre);dos.writeInt(edad);

dos.close();baos.close();

Page 109: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Descodificación• Para descodificar estos datos del flujo

realizaremos el proceso inverso• Utilizamos un flujo DataInputStream

ByteArrayInputStream bais = new ByteArrayInputStream(datos); DataInputStream dis = new DataInputStream(bais);

String nombre = dis.readUTF(); int edad = dis.readInt();

dis.close();bais.close();

Page 110: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Experto Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles

Entrada/Salida de objetos

Java © 2012-2013 Depto. Ciencia de la Computación e IA Serialización-110

• Si queremos enviar un objeto a través de un flujo deberemos convertirlo a una secuencia de bytes

• Esto es lo que se conoce como serialización

• Java serializa automáticamente los objetos• Obtiene una codificación del objeto en forma de

array de bytes• En este array se almacenarán los valores actuales

de todos los campos del objeto serializado

Page 111: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Objetos serializables• Para que un objeto sea serializable debe

cumplir:1. Implementar la interfaz Serializable

public MiClase implements Serializable {

...

}

Esta interfaz no obliga a definir ningún método, sólo marca el objeto como serializable

1. Todos los campos deben ser

Datos elementales o Objetos serializables

Page 112: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Flujos de objetos• Para enviar o recibir objetos tendremos los flujos

de procesamientoObjectInputStream ObjectOutputStream

• Estos flujos proporcionan respectivamente los métodosreadObject writeObject

• Con los que escribir o leer objetos del flujo• Utilizan la serialización de Java para codificarlos y

descodificarlos

Page 113: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Lenguaje Java

Sesión 5: Hilos

Page 114: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Índice• Creación de hilos y ciclo de vida• Sincronización de hilos• Bloques vigilados• Interbloqueos• Interfaz Lock• Variables atómicas y colecciones• Ejecutores y pools

Page 115: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Hilos•

••

Cada hilo es un flujo de ejecución independiente• Tiene su propio contador de programa

Todos acceden al mismo espacio de memoriaNecesidad de sincronizar cuando se accede concurrentemente a los recursosExisten estructuras de datos sincronizadas (ej, Vector) y sin sincronizar (ej, ArrayList)

Page 116: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Creación de Hilos•

Se pueden crear de dos formas:• Heredando de Thread

• Problema: No hay herencia múltiple en Java• Implementando Runnable

Debemos crear sólo los hilos necesarios•

Dar respuesta a más de un evento simultáneamentePermitir que la aplicación responda mientras está ocupadaAprovechar máquinas con varios procesadores

Page 117: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Heredar de Thread• Heredar de Thread y sobrecargar run( )public class MiHilo extends Thread { public

void run() {// Codigo de la tarea a ejecutar en el hilo

}}

• Instanciar el hiloThread t = new Thread(new MiHilo());

t.start();

Page 118: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Implementar Runnable• Implementar Runnablepublic class MiHilo implements Runnable { public

void run() {// Codigo de la tarea a ejecutar en el hilo

}}

• Instanciar el hiloThread t = new Thread(new MiHilo());

t.start();

Page 119: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Ciclo de vida de los hilos

♠El hilo será no ejecutable cuando:• Se encuentre durmiendo (llamando a sleep)• Se encuentre bloqueado (con wait)• Se encuentre bloqueado en una petición de E/S

Page 120: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Scheduler♠El scheduler decide qué hilo ejecutable ocupa

el procesador en cada instante♠Se sacará un hilo del procesador cuando:

•••

Se fuerce la salida (llamando a yield)Un hilo de mayor prioridad se haga ejecutable Se agote el quantum del hilo

♠Establecemos la prioridad cont.setPriority(prioridad);

• La prioridad es un valor entero entreThread.MIN_PRIORITY y Thread.MAX_PRIORITY

Page 121: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Concurrencia y sección crítica♠ Cuando varios hilos acceden a un mismo recurso

pueden producirse problemas de concurrencia♠ Sección crítica: Trozo del código que puede

producir problemas de concurrencia♠ Debemos sincronizar el acceso a estos recursos

• Este código no debe ser ejecutado por más de un hilo simultáneamente

♠ Todo objeto Java (Object) tiene una variable cerrojo que se utiliza para indicar si ya hay un hilo en la sección crítica

• Los bloques de código synchronized utilizarán este cerrojo para evitar que los ejecute más de un hilo

Page 122: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Bloques sincronizados•

Para sincronizar un bloque de código podemos indicarle el objeto cuyo cerrojo utilizaremos.El cerrojo (lock) se adquiere al inicio de la sección crítica y se libera al final de éstaOtro hilo no podrá adquirir ese mismo cerrojo al mismo tiemposynchronized(algun_objeto){

// Código sección crítica}

Page 123: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Métodos sincronizados• Sincronzar un método o una sección de

códigopublic synchronized void seccion_critica() {

// Codigo

}

• Se utiliza el cerrojo del objeto en el que se definen (cerrojo implícito)• Se podrán ejecutar por un sólo hilo en un

instante dado.

Page 124: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Uso de la sincronización♠Deberemos utilizar la sincronización sólo

cuando sea necesario, ya que reduce la eficiencia

♠No sincronizar métodos que contienen un gran número de operaciones que no necesitan sincronización

• Reorganizar en varios métodos♠No sincronizar clases que proporcionen datos

fundamentales• Dejar que el usuario decida cuando

sincronizarlas en sus propias clases

Page 125: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Sincronización reentranteLa sincronización en Java es “reentrante” porque

un lock puede ser adquirido varias veces por un mismo hilo. Es decir, en el mismo hilo, una sección sincronizada puede contener a otra y esto no produce un bloqueo a pesar de que las dos adquieren el lock del objeto this:class Reentrant {

public synchronized void a() { b();System.out.println(" estoy en a() ");

}public synchronized void b() {

System.out.println(" estoy en b() ");}

}

Page 126: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Dependencia de hilos

• Podemos esperar a que un hilo haya acabado de ejecutarse para poder continuar otro hiloPara ello bloquearemos el hilo actual que debe esperar a otro hilo t con:

t.join();

Page 127: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Bloqueo de hilos

• Si el hilo va a esperar a que suceda un evento (por ejemplo, terminar una E/S), hay que bloquearlo para que no ocupe el procesador:

wait();

Cuando suceda el evento debemos desbloquearlo desde otro hilo con:

notify();

Ambos métodos deben ser invocados desde métodos sincronizados

Page 128: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Bloques vigilados•

En lugar de esperar iterativamente (que ocupa la CPU):

public void bloqueVigilado() {// No hacerlo así!

while(!condicion) {} // Se detiene aquí,//comprobando iterativamente la condición

System.out.println("La condición se ha cumplido");

}

Bloquear el hilo y esperar una notificación por parte de otro.

public synchronized bloqueVigilado() {while(!condicion) {

try {wait(); // desocupa la CPU

} catch (InterruptedException e) {}

}System.out.println("La condición se ha cumplido");

}

Page 129: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Ejemplo: productor/consumidor•

El productor produce si el buffer no está lleno, y si no debe esperarEl consumidor consume si el buffer no está vacío, y si no debe esperar

Page 130: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Productor import java.util.Random;

public class Producer implements Runnable {private Drop drop;

public Producer(Drop drop) {this.drop = drop;

}

public void run() {String importantInfo[] = {

"Mares eat oats", "Does eat oats", "Little lambs eat ivy","A kid will eat ivy too"

};Random random = new Random();

for (int i = 0;i < importantInfo.length; i++) {drop.put(importantInfo[i]);try {

Thread.sleep(random.nextInt(5000));} catch (InterruptedException e) {}

}drop.put("DONE");

}}

Page 131: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Consumidor import java.util.Random;

public class Producer implements Runnable {private Drop drop;

public Producer(Drop drop) {this.drop = drop;

}

public void run() {String importantInfo[] = {

"Mares eat oats", "Does eat oats", "Little lambs eat ivy","A kid will eat ivy too"

};Random random = new Random();

for (int i = 0;i < importantInfo.length; i++) {drop.put(importantInfo[i]);try {

Thread.sleep(random.nextInt(5000));} catch (InterruptedException e) {}

}drop.put("DONE");

}}

Page 132: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Recursopublic class Drop {// Message sent from producer// to consumer.private String message;// True if consumer should wait// for producer to send message,// false if producer should wait for// consumer to retrieve message.private boolean empty = true;

public synchronized String take() {// Wait until message is// available.while (empty) {

try {wait();

} catch (InterruptedException e) {}}

// Toggle status. empty = true;// Notify producer that// status has changed. notifyAll();return message;

}

// ...

// ...public synchronized void put(String message) {

// Wait until message has// been retrieved.while (!empty) {

try {wait();

} catch (InterruptedException e) {}}// Toggle status. empty = false;// Store message.this.message = message;// Notify consumer that status// has changed. notifyAll();

}

}

//Main class:

public class ProducerConsumerExample {

public static void main(String[] args) { Drop drop = new Drop();(new Thread(new Producer(drop))).start(); (new Thread(new Consumer(drop))).start();

}}

Page 133: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Interbloqueos•

Deadlock: hilo A queda a la espera de que B lo desbloquee, a la vez que B queda a la espera de que A lo desbloquee: se interbloquean sin usar CPULivelock: hilo A realiza acción que causa que B realice otra acción que a su vez vuelve a causar la acción de A: se interbloquean ocupando la CPUStravation (inanición): otros hilos “hambrientos” ocupan el recurso (o CPU) que nuestro hilo necesita para seguir funcionando

Page 134: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Mecanismos de alto nivel• Implementaciones que proporciona Java para

facilitar la programación con concurrencia– Interfaz Lock– Colecciones concurrentes– Variables atómicas– Ejecutores y pools– Otros muchos en el paquete java.util.concurrent

Page 135: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

La interfaz Lock•

En lugar de synchronized:synchronized(this){// acceder al recurso

}

Adquirir un objeto Lock y después liberarloLock l = ...;l.lock();try {

// acceder al recurso protegido por l} finally {

l.unlock();}

Page 136: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

La interfaz Lock• Añade algunos métodos más versátiles

– tryLock( ) : rechaza darnos el lock si éste no está disponible en el instante o bien tras un tiempo de espera especificado. Permite evitar deadlocks.

– lockInterruptibly( ) : rechaza darnos el lock siotro hilo envía una interrupción antes de queel lock haya sido adquirido

– Da soporte a un mecanismo de wait/notify a través de objetos Condition que dejarían el hilo a la espera de que se cumpla la condición

Page 137: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Lock y Conditionclass BufferLimitado {

final Lock lock = new ReentrantLock();//Dos condiciones para notificar sólo a los hilos//que deban hacer put o take, respectivamente final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition();

final Object[] items = new Object[100];int putptr, takeptr, count;

public void put(Object x) throws InterruptedException { lock.lock();try {

while (count == items.length) notFull.await();

items[putptr] = x;if (++putptr == items.length) putptr = 0;++count; notEmpty.signal();

} finally { lock.unlock();

}}

public Object take() throws InterruptedException { lock.lock();try {

while (count == 0) notEmpty.await();

Object x = items[takeptr];if (++takeptr == items.length) takeptr = 0;--count; notFull.signal(); return x;

} finally { lock.unlock();

}}

}

Page 138: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Colecciones concurrentes••

La colección Vector garantiza el acceso sincronizadoEl paquete java.util.concurrent contiene colecciones con un soporte más avanzado para concurrencia

– BlockingQueue: FIFO con tiempo de espera máximo cuando añadimos y no cabe, o quitamos y no hay.

– ConcurrentMap: subinterfaz de Map quedefine operaciones atómicas útiles (quitaruna clave valor sólo si la clave estápresente, etc).

– ConcurrentNavigableMap para coincidencias aproximadas

Page 139: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Variables atómicas• Para no tener que sincronizar el acceso a variables,

contamos con versiones atómicas de éstas:––––––––––––

AtomicBoolean AtomicInteger AtomicIntegerArrayAtomicIntegerFieldUpdater<T> AtomicLongAtomicLongArrayAtomicLongFieldUpdater<T> AtomicMarkableReference<V> AtomicReference<V> AtomicReferenceArray<E> AtomicReferenceFieldUpdater<T,V> AtomicStampedReference<V>

Page 140: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Variables atómicas• Ejemplo: synchronized / variable atómicaclass ContadorSincronizado {

private int c = 0;

public synchronized void increment() { c++;

}

public synchronized void decrement() { c--;

}

public synchronized int value() {return c;

}

}

import java.util.concurrent.atomic.AtomicInteger;

class ContadorAtomic {private AtomicInteger c = new AtomicInteger(0);

public void increment() { c.incrementAndGet();

}

public void decrement() { c.decrementAndGet();

}

public int value() {return c.get();

}

}

Page 141: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Ejecutores•

Se separa la gestión de la ejecución de los hilos en clases especializadasInterfaz Executor: obliga a implementar el método execute(Runnable r)En lugar de iniciar el hilo con

(new Thread(r)).start( );lo iniciaremos con

e.execute(r);teniendo: Runnable r; Executor e;

Page 142: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

ExecutorService••

Subinterfaz de ExecutorAñade el método Future submit( objeto ) que acepta objetos Runnable y Callable, que permiten devolver un valor al finalizar la tarea.submit( ) devuelve objetos Future que permiten obtener el estado de la tarea a ejecutar y devuelven un resultado en el caso de Callable.

Page 143: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

ScheduledExecutorService••

Subinterfaz de ExecutorServiceAñade el método schedule( ) que ejecuta un Runnable o Callable después de un tiempo especificadoTambién añade scheduleAtFixedRate( ) y scheduleWithFixedDelay( ) para tareas periódicas

Page 144: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Pools de hilos•

Uno o varios “worker thread” ejecutan los métodos run( ) de distintos Runnable / Callable, pero en el mismo hilo.Se ahorra la sobrecarga de creación y destrucción de hilos en la que interviene reserva y liberación de memoriaCreación del pool – distintas maneras:

– Método estático newFixedThreadPool(n)– Instancia de ThreadPoolExecutor o

de ScheduledThreadPoolExecutor.

Page 145: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Instancia de ThreadPoolExecutor//Al principio del fichero://import java.util.concurrent.*;//import java.util.*;

int poolSize = 2;int maxPoolSize = 2;long keepAliveTime = 10;

final ArrayBlockingQueue<Runnable> queue =new ArrayBlockingQueue<Runnable>(5);

ThreadPoolExecutor threadPool =new ThreadPoolExecutor(poolSize,

maxPoolSize, keepAliveTime,TimeUnit.SECONDS, queue);

Runnable myTasks[3] = ....;// y le asignamos tareas

//Poner a ejecutar dos tareas y una que quedará en cola:for(int i=0; i<3; i++){

threadPool.execute(task); System.out.println("Tareas:" + queue.size());

}

//Encolar otra tarea más que declaramos aquí mismo: threadPool.execute( new Runnable() {

public void run() {for (int i = 0; i < 10; i++) {

try {System.out.println("i = " + i); Thread.sleep(1000);

} catch (InterruptedException ie){ }}

}});

//Ejecuta las tareas que queden pero ya no acepta nuevas: threadPool.shutdown();

Page 146: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Sobrecarga de ThreadPoolExecutorclass PausableThreadPoolExecutor

extends ThreadPoolExecutor {

private boolean isPaused;private ReentrantLock pauseLock = new ReentrantLock();private Condition unpaused = pauseLock.newCondition();

//Sobrecargamos el método:protected void beforeExecute(Thread t, Runnable r) {super.beforeExecute(t, r); pauseLock.lock(); //Sección sincronizada try {while (isPaused) unpaused.await(); //Bloquearlo

} catch (InterruptedException ie) { t.interrupt();

} finally { pauseLock.unlock();

}}

//Nota: para pausar cada hilo el programador debe//implementar la lógica necesaria

//Método nuevo:public void pause() { pauseLock.lock();//Sección sincronizadatry {isPaused = true;

} finally { pauseLock.unlock();

}}

//Método nuevo:public void resume() { pauseLock.lock();//Sección sincronizadatry {isPaused = false; unpaused.signalAll();//Desbloquea hilos bloqueados

} finally { pauseLock.unlock();

}}

}

Page 147: lemus.webs.upv.es• • Java Lenguaje Java 5. Campos y variables: simples o complejos Utilizaremos sustantivos como nombres • • • Puede estar formado por varias palabras, con

Lenguaje Java

FIN