Post on 01-Apr-2020
CDI
Java
Introducción
Java
Este repaso a Java no esni completoni exhaustivoni suficiente
para programar en Java.Debe servir solamente para refrescar conocimiento yaadquerido y para animar de profundizar el estudio del lenguajecon otras fuentes, por ejemplo, con la bibliografía añadida y losmanuales correspondientes.
CDI
Java
Introducción
Java
Se destacan ciertas diferencias con C++ (otro lenguaje deprogramación orientado a objetos importante).Se comentan ciertos detalles del lenguaje que muchasveces no se perciben a primera vista.Se introducen los conceptos ya instrínsicos de Java parala programación concurrente.
CDI
Java
Hola mundo
hola mundo
El famoso hola mundo se programa en Java así:
class Hello {public static void main(String[] args) {System.out.println("Hello world");
}}
El programa principal se llama main() y tiene que serdeclarado público y estático. No devuelve ningún valor (por esose declara como void). Los parámetros de la línea decomando se pasan como un vector de cadenas de letras(String).
CDI
Java
Comentarios
¿Qué se comenta?
Existen varias posibilidades de escribir comentarios:
// comentario de línea/// ... comentario de documentación/* ... */ comentario de bloque/** ... */ comentario de documentación
Se usa doxygen o javadoc para generar automáticamentela documentación. Ambos tienen unos comandos paraaumentar la documentación.Se documenta sobre todo lo que no es obvio y lasinterfaceses decir: respuestas a preguntas del ¿Cómo? y del ¿Porqué?.
CDI
Java
Programación orientada a objetos
objetos
Java usa (con la excepción de variables de tipos simples)exclusivamente objetos.Un tal objeto se define como una clase (class), y sepuede crear varias instancias de objetos de tal clase.Es decir, la clase define el tipo del objeto, y la instancia esuna variable que representa un objeto.
CDI
Java
Programación orientada a objetos
clases
Una clase contiene como mucho tres tipos de miembros:
instancias de objetos (o de tipos simples)métodos (funciones)otras clases
No existen variables globales (como en C++) y el programaprincipal no es nada más que un método de una clase.
CDI
Java
Programación orientada a objetos
inicialización
Los objetos en Java siempre tienen valores conocidos, esdecir, los objetos (y también las variables de tipos simples)siempre están inicializados (menos variables locales).Si el programa no da una inicialización explícita, Javaasigna el valor cero, es decir, 0, 0.0, \u0000, false onull dependiendo del tipo de la variable.Variables locales hay que inicializar antes de usarlas, elcódigo se ejecuta cuando la ejecución llega a este punto.
CDI
Java
Programación orientada a objetos
Java, C++, C#
Java y C++ (o C#) son hasta cierto punto bastanteparecidos. (por ejemplo, en su síntaxis y gran parte de susmetodologías), aunque también existen grandesdiferencias (por ejemplo, en su no–uso o uso de punterosy la gestión de memoria).Se resaltará algunos de las diferencias principales entreJava y C++.
CDI
Java
Programación orientada a objetos
tipos
Java exige una disciplina estricta con sus tipos,es decir, el compilador controla siempre cuando pueda silas operaciones usadas están permitidas con los tiposinvolucrados.Si la comprobación no se puede realizar durante el tiempode compilación, se pospone hasta el tiempo de ejecución,es decir, se pueden provocar excepciones que puedenprovocar fallos durante la ejecución.
CDI
Java
Clases, tipos y modificadores
modificadores de clases I
Se pueden declarar clases con uno o varios de los siguientesmodificadores para especificar ciertas propiedades (no existenen C++):
public la clase es visible desde fuera del ficheroabstract la clase todavía no está completa, es decir, nose puede instanciar objetos antes de que se hayanimplementado en una clase derivada los métodos quefaltanfinal no se puede extender la clasestrictfp obliga a la máquina virtual a cumplir elestándar de IEEE para los números flotantes
CDI
Java
Clases, tipos y modificadores
modificadores de clases II
Casi todos los entornos de desarrollo para Java permitensolamente una clase pública dentro del mismo fichero.Obviamente una clase no puede ser al mismo tiempo finaly abstracta.Tampoco está permitida una clase abstracta constrictfp.
CDI
Java
Clases, tipos y modificadores
tipos simples I
boolean o bien true o bien falsechar 16 bit Unicode letrabyte 8 bit número entero con signoshort 16 bit número entero con signoint 32 bit número entero con signolong 64 bit número entero con signofloat 32 bit número flotantedouble 64 bit número flotante
CDI
Java
Clases, tipos y modificadores
tipos simples II
Solo float y double son igual como en C++.No existen enteros sin signos en Java (pero si en C++).Los tipos simples no son clases, pero existen para todoslos tipos simples clases que implementan elcomportamiento de ellos.Desde Java 5 la conversión de tipos simples a sus objetoscorrespondientes (y vice versa) es automático.Sólo hace falta escribirles con mayúscula (con laexcepción de Integer).Las clases para los tipos simples proporcionan tambiénvarias constantes para trabajar con los números (porejemplo, NEGATIVE_INFINITY etc.).
CDI
Java
Clases, tipos y modificadores
enumeraciones I
hasta Java 1.4 se realizó enumeraciones así:public final int MONDAY=0;public final int TUESDAY=1;public final int ...;
a partir de Java 5 también así:enum Weekdays { MONDAY, TUESDAY, ... }
enum es una clase y automáticamente public, static yfinal (vemos en seguida)tienen toString() y valueOf()
CDI
Java
Clases, tipos y modificadores
enumeraciones II
enum es una clase, es decir, se pueden añadir miembros ymétodos
enum Coin {UN(1), DOS(2), CINCO(5), ...private final int value;Coin(int value) { this.value=value; }public int value() { return value; }
}
CDI
Java
Clases, tipos y modificadores
enumeraciones III
values() devuelve un vector de los tipos del enumeradolos enum se pueden usar en switch
Coin coin=...;switch(coin) {case UN:case DOS:...
}
CDI
Java
Clases, tipos y modificadores
modificadores de acceso
private: accesible solamente desde la propia clasepackage: (o ningún modificador) accesible solamentedesde la propia clase o dentro del mismo paqueteprotected: accesible solamente desde la propia clase,dentro del mismo paquete, o desde clases derivadaspublic: accesible siempre cuando la clase es visible
(En C++, por defecto, los miembros son privados, mientras enJava los miembros son, por defecto, del paquete.)
CDI
Java
Clases, tipos y modificadores
modificadores de miembros I
Modificadores de miembros siendo instancias de objetos:
final: declara constantes si está delante de tipos simples(diferencia a C++ donde se declara constantes conconst), aunque las constantes no se pueden modificar enel transcurso del programa, pueden ser calculadas durantesus construcciónes; las variables finales, aún declaradassin inicialización, tienen que obtener sus valores comomuy tarde en la fase de construcción de un objeto de laclase
CDI
Java
Clases, tipos y modificadores
modificadores de miembros II
static: declara miembros de la clase que pertenecen ala clase y no a instancias de objetos, es decir, todos losobjetos de la clase acceden a la misma cosa
transient: excluye un miembro del proceso deconversión en un flujo de bytes si el objeto se salva aldisco o se transmite por una conexión (no hay en C++)
CDI
Java
Clases, tipos y modificadores
modificadores de miembros III
volatile: ordena a la máquina virtual de Java que nouse ningún tipo de cache para el miembro, así es másprobable (aunque no garantizado) que varios hilos vean elmismo valor de una variable; declarando variables del tipolong o double como volatile aseguramos que lasoperaciones básicas sean atómicas (este tema veremosmás adelante más en detalle)
CDI
Java
Clases, tipos y modificadores
modificadores de métodos I
Modificadores de miembros siendo métodos:
abstract: el método todavía no está completo, es decir,no se puede instanciar objetos antes de que se hayaimplementado el método en una clase derivada (parecidoa los métodos puros de C++)
static: el método pertenece a la clase y no a un objetode la clase, un método estático puede acceder solamentemiembros estáticos
final: no se puede sobreescribir el método en una clasederivada (no hay en C++)
CDI
Java
Clases, tipos y modificadores
modificadores de métodos II
synchronized: el método pertenece a una región críticadel objeto (no hay en C++)
native: propone una interfaz para llamar a métodosescritos en otros lenguajes, su uso depende de laimplementación de la máquina virtual de Java (no hay enC++, ahí se realiza durante el linkage)
strictfp: obliga a la máquina virtual a cumplir elestándar de IEEE para los números flotantes (no hay enC++, ahí depende de las opciones del compilador)
CDI
Java
Clases, tipos y modificadores
modificadores de métodos III
Un método abstracto no puede ser al mismo tiempo nifinal, ni estático, ni sincronizado, ni nativo, ni estricto.Un método nativo no puede ser al mismo tiempo niabstracto ni estricto.Nota que el uso de final y private puede mejorar lasposibilidades de optimización del compilador, es decir, suuso deriva en programas más eficientes.
CDI
Java
Estructuras de control y operadores
estructuras de control
Las estructuras de control son casi iguales a las de C++ (notala extensión del for desde Java 5):
if(cond) then block
if(cond) then block else block
while(cond) block
do block while (cond);
for(expr; expr; expr) block
for(type var: array) block
for(type var: collection) block
switch(expr) { case const: ... default: }
Igual que en C++ se puede declarar una variable en laexpresión condicional o dentro de la expresión de inicio delbucle for.
CDI
Java
Estructuras de control y operadores
marcas I
Adicionalmente Java proporciona break con una marca quese puede usar para salir en un salto de varios bucles anidados.
mark:while(...) {for(...) {break mark;
}}
CDI
Java
Estructuras de control y operadores
marcas II
También existe un continue con marca que permitesaltar al principio de un bucle más alla del actual.No existe el goto (pero es una palabra reservada), su usohabitual en C++ se puede emular (mejor) con los breaks ycontinues y con las secuencias try-catch-finally.
CDI
Java
Estructuras de control y operadores
operadores I
Java usa los mismos operadores que C++ con las siguientesexcepciones:
existe adicionalmente >>> como desplazamiento a laderecha llenando con ceros a la izquierdaexiste el instanceof para comparar tipos (C++ tiene unconcepto parecido con typeid)los operadores de C++ relacionados a punteros no existenno existe el delete de C++no existe el sizeof de C++
CDI
Java
Estructuras de control y operadores
operadores II
La prioridad y la asociatividad son las mismas que en C++.Hay pequeñas diferencias entre Java y C++ si ciertossímbolos están tratados como operadores o no (porejemplo, los []).Además Java no proporciona la posibilidad de sobrecargaroperadores.
CDI
Java
Estructuras de control y operadores
palabras reservadas I
Las siguientes palabras están reservadas en Java:
abstract default if private thisboolean do implements protected throwbreak double import public throwsbyte else instanceof return transientcase extends int short trycatch final interface static voidchar finally long strictfp volatileclass float native super whileconst for new switchcontinue goto package synchronized
CDI
Java
Estructuras de control y operadores
palabras reservadas II
Además las palabras null, false y true que sirvencomo constantes no se pueden usar como nombres.Aunque goto y const aparecen en la lista arriba, no seusan en el lenguaje.
CDI
Java
Clases, objetos y variables
objetos y referencias a objetos
No se pueden declarar instancias de clases usando elnombre de la clase y un nombre para el objeto (como sehace en C++).La declaración
ClassName ObjectNamecrea solamente una referencia a un objeto de dicho tipo.Para crear un objeto dinámico en el montón se usa eloperador new con el constructor del objeto deseado. Eloperador devuelve una referencia al objeto creado.
ClassName ObjectReference = new ClassName(...)
CDI
Java
Clases, objetos y variables
construcción por defecto
Sólo si una clase no contiene ningún constructor Javapropone un constructor por defecto que tiene el mismomodificador de acceso que la clase.Constructores pueden lanzar excepciones como cualquierotro método.
CDI
Java
Clases, objetos y variables
constructores
Para facilitar la construcción de objetos aún más, esposible usar bloques de código sin que pertenezcan aconstructores.Esos bloques están prepuestos (en su orden de aparencia)delante de los códigos de todos los constructores.El mismo mecanismo se puede usar para inicializarmiembros estáticos poniendo un static delante delbloque de código.Inicializaciones estáticas no pueden lanzar excepciones.
CDI
Java
Clases, objetos y variables
inicialización estática
class ... {...static int[] powertwo=new int[10];static {powertwo[0]=1;for(int i=1; i<powertwo.length; i++)
powertwo[i]=powertwo[i-1]<<1;}...
}
CDI
Java
Clases, objetos y variables
inicialización cruzada
Si una clase, por ejemplo, X, construye un miembroestático de otra clase, por ejemplo, Y, y al revés, el bloquede inicialización de X está ejecutado solamente hasta laaparencia de Y cuyos bloques de inicialización recurren alX construido a medias.Nota que todas las variables en Java siempre están encero si todavía no están inicializadas explícitamente.
CDI
Java
Clases, objetos y variables
recolector de memoria
No existe un operador para eliminar objetos del montón,eso es tarea del recolector de memoria incorporado enJava (diferencia con C++ donde se tiene que liberarmemoria con delete explícitamente).Para dar pistas de ayuda al recolector se puede asignarnull a una referencia indicando al recolector que no se vaa referenciar dicho objeto nunca jamás.Las referencias que todavía no acceden a ningún objetotienen el valor null.Antes de ser destruido se exejuta el método finalize()del objeto (por defecto no hace nada).
CDI
Java
Clases, objetos y variables
reinterpretación de tipos
Está permitida la conversión explícita de un tipo a otromediante la reinterpretación del tipo (“cast”) con todas susposibles consecuencias.El “cast” es importante especialmente en su variante del“downcast”, es decir, cuando se sabe que algún objeto esde cierto tipo derivado pero se tiene solamente unareferencia a una de sus superclases.Se puede comprobar el tipo actual de una referencia conel operador instanceof.
if( refX instanceof refY ) { ... }
CDI
Java
Métodos y parámetros
paso de parámetros I
Se pueden pasar objetos como parámetros a métodos.La lista de parámetros junto con el nombre del métodocompone la signatura del método.Pueden existir varias funciones con el mismo nombre,siempre y cuando se distingan en sus signaturas. Latécnica se llama sobrecarga de métodos.
CDI
Java
Métodos y parámetros
paso de parámetros II
Hasta Java 1.4 la lista de parámetros siempre era fija, noexistía el concepto de listas de parámetros variables deC/C++.desde Java 5 si existe tal posibilidad.Java pasa parámetros exclusivamente por valor.Eso significa en caso de objetos que siempre se pasa unareferencia al objeto con la consecuencia de que el métodollamado puede modificar el objeto.
CDI
Java
Métodos y parámetros
paso de parámetros III
Desde Java 5 existen listas de parámetros variablesvoid func(int fixed, String... names) {...}
Los tres puntos ... significan 0 o más parámetros.Solo el último parámetro puede ser variable.Se accede con el nuevo iterador for:for(String name : names) {...}
CDI
Java
Métodos y parámetros
parámetros no modificables no existen
No se puede evitar posibles modificaciones de unparámetro (que sí se puede evitar en C++ declarando elparámetro como const-referencia).Declarando el parámetro como final solamente protegela propia referencia (paso por valor).Entonces, no se pueden cambiar los valores de variablesde tipos simples llamando a métodos y pasarles comoparámetros variables de tipos simples (como es posible enC++ con referencias).La declaración se puede usar como indicación al usuarioque se pretende no cambiar el objeto (aunque elcompilador no lo garantiza).
CDI
Java
Métodos y parámetros
valores de retorno
Un método termina su ejecución en tres ocaciones:
se ha llegado al final de su códigose ha encontrado una sentencia return
se ha producido una excepción no tratada en el mismométodo
Un return con parámetro (cuyo tipo tiene que coincidir con eltipo del método) devuelve una referencia a una variable dedicho tipo (o el valor en caso de tipos simples).
CDI
Java
Vectores (arrays)
vectores
Los vectores se declaran solamente con su límite súperiordado que el límite ínferior siempre es cero (0).El código
int[] vector = new int[15]crea un vector de números enteros de longitud 15.
CDI
Java
Vectores (arrays)
control de acceso
Java comprueba si los accesos a vectores con índicesquedan dentro de los límites permitidos (diferencia conC++ donde no hay una comprobación).Si se detecta un acceso fuera de los límites se produceuna excepción IndexOutOfBoundsException.Dependiendo de las capacidades del compilador esopuede resultar en una pérdida de rendimiento.
CDI
Java
Vectores (arrays)
vectores son objetos
Los vectores son objetos implícitos que siempre conocensus propias longitudes (values.length) (diferencia conC++ donde un vector no es nada más que un puntero) yque se comportan como clases finales.No se pueden declarar los elementos de un vector comoconstantes (como es posible en C++), es decir, elcontenido de los componentes siempre se puede modificaren un programa en Java.
CDI
Java
Construcción, extención, interfaces, herencia
this and super
Cada objeto tiene por defecto una referencia llamadathis que proporciona acceso al propio objeto (diferenciaa C++ donde this es un puntero).Obviamente, la referencia this no existe en métodosestáticos.Cada objeto (menos la clase object) tiene una referenciaa su clase súperior llamada super (diferencia a C++donde no existe, se tiene acceso a las clases superiorespor otros medios).this y super se pueden usar especialmente paraacceder a variables y métodos que están escondidos pornombres locales.
CDI
Java
Construcción, extención, interfaces, herencia
más sobre constructores
Para facilitar las definiciones de constructores, unconstructor puede llamar en su primer sentencia
o bien a otro constructor con this(...)o bien a un constructor de su superclase con super(...)(ambos no exiten en C++).
El constructor de la superclase sin parámetros estállamado en todos los casos al final de la posible cadena dellamadas a constructores this() en caso que no hayauna llamada explícita.
CDI
Java
Construcción, extención, interfaces, herencia
orden de construcción
La construcción de objetos sigue siempre el siguiente orden:
construcción de la superclase, nota que no se llamaningún constructor por defecto que no sea el constructorsin parámetrosejecución de todos los bloques de inicializaciónejecución del código del constructor
CDI
Java
Construcción, extención, interfaces, herencia
extender clases I
Se puede crear nuevas clases a partir de la extención declases ya existentes (en caso que no sean finales). Lasnuevas clases se suelen llamar subclases o clasesextendidas.Una subclase heredará todas las propriedades de la clasesúperior, aunque se tiene solamente acceso directo a laspartes de la superclase declaradas por lo menosprotected.
CDI
Java
Construcción, extención, interfaces, herencia
extender clases II
No se puede extender al mismo tiempo de más de unaclase súperior (diferencia a C++ donde se puede derivarde más de una clase).Se pueden sobreescribir métodos de la superclase.Si se ha sobreescrito una cierta función, las demásfunciones con el mismo nombre (pero diferente signatura)siguen visibles desde la clase derivada (en C++ eso no esel caso).Dicho último aspecto puede provocar sorpresas...¿Cuáles?
CDI
Java
Construcción, extención, interfaces, herencia
acceso a métodos sobreescritos
Si se quiere ejecutar dentro de un método sobreescrito elcódigo de la superclase, se puede acceder el métodooriginal con la referencia super.Se puede como mucho extender la accesibilidad demétodos sobreescritos.Se pueden cambiar los modificadores del método.También se puede cambiar si los parámetros del métodoson finales o no, es decir, final no forma parte de lasignatura (diferencia a C++ donde const forma parte dela signatura).
CDI
Java
Construcción, extención, interfaces, herencia
sobreescritura y excepciones
Los tipos de las excepciones que lanza un métodosobreescrito tienen que ser un subconjunto de los tipos delas excepciones que lanza el método de la superclase.Dicho subconjunto puede ser el conjunto vacio.Si se llama a un método dentro de una jerarquia de clases,se ejecuta siempre la versión del método que correspondeal objeto creado (y no necesariamente al tipo de referenciadado) respetando su accesibilidad.Está técnica se llama polimorfismo.
CDI
Java
Construcción, extención, interfaces, herencia
clases dentro de clases
Se pueden declarar clases dentro de otras clases.Sin embargo, dichas clases no pueden tener miembrosestáticos no–finales.Todos los miembros de la clase contenedora están visiblesdesde la clase interior (diferencia a C++ donde hay quedeclarar la clase interior como friend para obtener dichoefecto).
CDI
Java
Construcción, extención, interfaces, herencia
clases locales
Dentro de cada bloque de código se pueden declarar claseslocales que son visibles solamente dentro de dicho bloque.
CDI
Java
Construcción, extención, interfaces, herencia
la clase Object I
Todos los objetos de Java son extensiones de la clase Object.Los métodos públicos y protegidos de esta clase son
public boolean equals(Object obj)compara si dos objetos son iguales, por defecto un objetoes igual solamente a si mismopublic int hashCode() devuelve (con altaprobabilidad) un valor distinto para cada objetoprotected Object clone() throwsCloneNotSuportedException devuelve una copiabinaria del objeto (incluyendo sus referencias)
CDI
Java
Construcción, extención, interfaces, herencia
la clase Object II
public final Class getClass() devuelve el objetodel tipo Class que representa dicha clase durante laejecuciónprotected void finalize() throws Throwablese usa para finalizar el objeto, es decir, se avisa aladministrador de la memoria que ya no se usa dichoobjeto, y se puede ejecutar código especial antes de quese libere la memoriapublic String toString() devuelvo una cadenadescribiendo el objeto
Las clases derivadas deben sobreecribir los métodosadecuadamente, por ejemplo el método equals, si se requiereuna comparación binaria.
CDI
Java
Construcción, extención, interfaces, herencia
interfaces
Usando interface en vez de class se define unainterfaz a una clase sin especificar el código de losmétodos.Una interfaz no es nada más que una especificación decómo algo debe ser implementado para que se puedausar en otro código.Una interfaz solo puede tener declaraciones de objetosque son constantes (final) y estáticos (static).En otras palabras, todas las declaraciones de objetosdentro de interfaces automáticamente son finales yestáticos, aunque no se haya descrito explícitamente.
CDI
Java
Construcción, extención, interfaces, herencia
interfaces y herencia
Igual que las clases, las interfaces pueden incorporar otrasclases o interfaces.También se pueden extender interfaces.Nota que es posible extender una interfaz a partir de másde una interfaz:
interface ThisOne extends ThatOne, OtherOne { ... }
CDI
Java
Construcción, extención, interfaces, herencia
métodos de interfaces
Todos los métodos de una interfaz son implícitamentepúblicos y abstractos, aunque no se haya descrito nipublic ni abstract explícitamente (y eso es laconvención).Los demás modificadores no están permitidos paramétodos en interfaces.Para generar un programa todas las interfaces usadastienen que tener sus clases que las implementen.
CDI
Java
Construcción, extención, interfaces, herencia
implementación de interfaces
Una clase puede implementar varias interfaces al mismotiempo (aunque una clase puede extender como muchouna clase).Se identifican las interfaces implementadas conimplements después de una posible extensión(extends) de la clase.
CDI
Java
Construcción, extención, interfaces, herencia
implementación
public interface Comparable {int compareTo(Object o);
}
class Something extends Anythingimplements Comparable
{ ...public int compareTo(Object o) {
// cast to get a correct object// may throw exception ClassCastException
Something s = (Something)o;... // code to compare to somethings
}}
CDI
Java
Construcción, extención, interfaces, herencia
resumen: interfaces
Las interfaces se comportan como clases totalmenteabstractas, es decir,
no tienen miembros no–estáticos,nada diferente a público,y ningún código no–estático.
CDI
Java
Polimorfismo paramétrico
tipos como variables
Como ya existía en C++, se introdujo la posibilidad de usartipos como variables en la definición de clases y métodos.Se realiza con una sintaxis parecida:List<Animal> farm=new ArrayList<Animal>();
Con eso se evita las muchas transformaciones explícitasde tipos que antes su usaba sobre todo para agruparobjetos en colecciones.Es decir, se puede disenar estructuras de datos sinespecificar antemano con que tipo se trabrajá en concreto.Cuando se usa el compilador garantiza que el tipoconcreto proporciona las propiedades necesarias.
CDI
Java
Polimorfismo paramétrico
clases genéricas
class Something<T> {T something;public Something(T something) {this.something=something;
}public void set(T something) {this.something=something;
}public T get() {return something;
}}
CDI
Java
Polimorfismo paramétrico
uso de clase genérica
Usamos la clase Something con cadenas.Construcción:
Something<String> w=new Something<String>("word");
Leer el “contenido”:String s=w.get();
Escribir el “contenido”:w.set(new Double(10.0));
producerá un fallo de compilación, hay que usar unacadena como parámetro.
CDI
Java
Polimorfismo paramétrico
métodos genéricos
class Anything {public <T> T get(T something) {return something;
}public static <T> void write(T something) {out.println(something);
}}
Con métodos genéricos se pueden implementarfuncionalidades que se quieren realizar con cualquier tipo deinterés.
CDI
Java
Polimorfismo paramétrico
polimorfismo paramétrico restringido
Se puede declarar el tipo que se usa para especificar untipo genérico asumiendo cierta herencia:
List<T extends Animal>
Así en el uso del tipo T ya se sabe algo sobre susfuncionalidades (y el compilador lo comprueba).
CDI
Java
Polimorfismo paramétrico
polimorfismo paramétrico anidado/encadenado
Se puede expresar también que el tipo genérico seheredera de otro tipo genérico:
List<T extends Animal<E>>
o que el tipo genérico ya viene dado por otro tipo genéricoLinkedList<LinkedList<T>>
CDI
Java
Polimorfismo paramétrico
limitaciones del polimorfismo paramétrico
No se puede instanciar un objeto de un tipo genérico, sinoes dentro de una clase o método del mismo, es decir,T e=new T(); está prohibidoList<T> L= new LinkedList<T>(); está permitido.
CDI
Java
Polimorfismo paramétrico
polimorfismo paramétrico con comodín I
Observa: List<Object> no es superclase deList<String>.Entonces, para escribir métodos (y clases) que trabajencon cualquier tipo genérico necesitamos una notaciónnueva:List<?>
sirve para implementar por ejemplovoid write(List<?> L) {for(Object e : L) out.println(e);
}
CDI
Java
Polimorfismo paramétrico
polimorfismo paramétrico con comodín II
Los comodines adquieren forma en su construcción:Collection<?> C = new ArrayList<String>();
ahora la colección C contiene cadenas.Solo null se puede asignar a una variable del tipocomodín, siempre.Eso no funciona para pasar parámetros:
<T> void add(Set<T> s, T t) {...}no se puede usar con un conjunto construidogenéricamenteadd(new Set<String>(), new String("hi"));
CDI
Java
Polimorfismo paramétrico
polimorfismo paramétrico con comodín III
Los comodines se pueden usar también para expresar lapropia cadena de herencia que se quiere mantener:Collection<? extends Shape> C= new ArrayList<Circle>();
donde Circle tiene que ser un tipo cuya superclase esShape.Dicho concepto se llama comodín limitado.Pero ya no existe la posibilidad de escribir (la relación noes reflexiva)Collection<? extends Shape> C= new ArrayList<Shape>();
CDI
Java
Polimorfismo paramétrico
polimorfismo paramétrico con comodín IV
También se puede limitar el comodín desde abajo:Collection<? super Circle> C= new ArrayList<Shape>();
Aquí sí se puede escribirCollection<? super Circle> C= new ArrayList<Circle>();
dado que la relación es reflexiva.
CDI
Java
Polimorfismo paramétrico
polimorfismo paramétrico con comodín V
Los tipos genéricos (tanto comodín o no-comodín) setransforman en tipos simples antes de la ejecución.Por eso no se tiene acceso a la variable del tipo, con laconsecuencia queList<String> S=new ArrayList<String>();List<Integer> I=new ArrayList<Integer>();out.println(S.getClass()==I.getClass());
imprime true.Tampoco se puede averiguar el tipo, el siguiente código nocompila:Collection<String> S=new ArrayList<String>();if(S instanceof Collection<String>) \{...\}
CDI
Java
Polimorfismo paramétrico
polimorfismo paramétrico con comodín VI
Hay que tomarse muy en serio posibles mensajes de avisocuando se usa tipos genéricos y cambiar el código hastaque no aparezca ninguno.Sino, puede ocurrir una simple excepción de fallo enconversión de tipo en algún momento de la ejecución cuyarazón será difícil de localizar.
CDI
Java
Excepciones
try’n’catch
Para facilitar la programación de casos excepcionales Javausa el concepto de lanzar excepciones.Una excepción es una clase predefinida y se accede conla sentencia
try { ... }catch (SomeExceptionObject e) { ... }catch (AnotherExceptionObject e) { ... }finally { ... }
CDI
Java
Excepciones
orden de ejecución I
El bloque try contiene el código normal por ejecutar.Un bloque catch(ExceptionObject) contiene elcódigo excepcional por ejecutar en caso de que durante laejecución del código normal (que contiene el bloque try)se produzca la excepción del tipo adecuado.Pueden existir más de un (o ningún) bloque catch parareaccionar directamente a más de un (ningún) tipo deexcepción.Hay que tener cuidado en ordenar las excepcionescorrectamente, es decir, las más específicas antes de lasmás generales.
CDI
Java
Excepciones
orden de ejecución II
El bloque finally se ejecuta siempre una vez terminadoo bien el bloque try o bien un bloque catch o bien unaexcepción no tratada o bien antes de seguir un break, uncontinue o un return hacia fuera de la sentenciatry-catch-finally.
CDI
Java
Excepciones
construcción de clases de excepción
Normalmente se extiende la clase Exception paraimplementar clases propias de excepciones, aún también sepuede derivar directamente de la clase Throwable que es lasuperclase (interfaz) de Exception o de la claseRuntimeException.
class MyException extends Exception {public MyException() { super(); }public MyException(String s) { super(s); }
}
CDI
Java
Excepciones
declaración de excepciones lanzables
Entonces, una excepción no es nada más que un objetoque se crea en el caso de aparición del caso excepcional.La clase principal de una excepción es la interfazThrowable que incluye un String para mostrar unalínea de error legíble.Para que un método pueda lanzar excepciones con lassentencias try-catch-finally, es imprecindibledeclarar las excepciones posibles antes del bloque decódigo del método con throws ....
public void myfunc(...) throws MyException {...}
En C++ es al revés, se declara lo que se puede lanzarcomo mucho.
CDI
Java
Excepciones
propagación de excepciones
Durante la ejecución de un programa se propagan lasexcepciones desde su punto de aparición subiendo lasinvocaciones de los métodos hasta que se hayaencontrado un bloque catch que se ocupa de tratar laexcepción.En el caso de que no haya ningún bloque responsable, laexcepción será tratada por la máquina virtual con elposible resultado de abortar el programa.
CDI
Java
Excepciones
lanzar excepciones
Se pueden lanzar excepciones directamente con lapalabra throw y la creación de un nuevo objeto deexcepción, por ejemplo:
throw new MyException(“eso es una excepcion”);
También los constructores pueden lanzar excepciones quetienen que ser tratados en los métodos que usan dichosobjetos construidos.
CDI
Java
Excepciones
excepciones de ejecución
Además de las excepciones así declaradas existensiempre excepciones que pueden ocurrir en qualquiermomento de la ejecución del programa, por ejemplo,RuntimeException o Error oIndexOutOfBoundException.La ocurrencia de dichas excepciones refleja normalmenteun flujo de control erróneo del programa que se debecorrigir antes de distribuir el programa a posibles usuarios.Se usan excepciones solamente para casosexcepcionales, es decir, si pasa algo no esperado.
CDI
Java
Paquetes
agrupación de objetos I
Siempre existe la posibilidad de que diferentes fuentesusen el mismo nombre para una clase.Para producir nombres únicos se agrupa los objetos enpaquetes.El nombre del paquete sirve como prefijo del nombre de laclase con la consecuencia de que cuando se diferencianlos nombres de los paquetes también se diferencian losnombres de las clases.
CDI
Java
Paquetes
agrupación de objetos II
Por convención se usa como prefijo el dominio en interneten orden inverso para los paquetes.Hay que tener cuidado en distinguir los puntos en elnombre del paquete con los puntos que separan losmiembros de una clase.La pertenencia de una clase a un paquete se indica en laprimera sentencia de un fichero fuente conpackage Pack.Name;
CDI
Java
Paquetes
agrupación de objetos III
Java viene con una amplia gama de clases y paquetespredefinidos.Se accede a los paquetes con import.Se accede a los componentes de los paquetes conclasificadores, p.ej., System.out.println(...)(desde Java 5 ya no hace falta clasificar, se importa comoimport static java.lang.System.*).Cuidado: Java no está disponible siempre en todas lasplataformas en su última versión y eso puede derivar enaplicaciones no portables.
CDI
Java
Reflexión
acceso a si mismo
Java proporciona para cada clase un objeto de tipo Classque se puede usar para obtener información sobre lapropia clase y todos sus miembros.Así por ejemplo se puede averiguar todos los métodos ymodificadores, cual es su clase súperior y mucho más.
CDI
Java
Hilos
objetivos
Se usan los hilos para ejecutar varias secuencias deinstrucciones de modo cuasi–paralelo.
CDI
Java
Hilos
creación de un hilo (para empezar)
Se crea un hilo conThread worker = new Thread()
Después se inicializa el hilo y se define sucomportamiento.Se lanza el hilo con
worker.start()
Pero en esta versión simple no hace nada. Hace faltasobreescribir el método run() especificando algún códigoútil.
CDI
Java
Hilos
la interfaz Runnable
A veces no es conveniente extender la clase Threadporque se pierde la posibilidad de extender otro objeto.Es una de las razones por que existe la interfaz Runnableque declara nada más que el método public voidrun() y que se puede usar fácilmente para crear hilostrabajadores.
CDI
Java
Hilos
pingPONG I
class RunPingPONG implements Runnable {private String word;private int delay;
RunPingPONG(String whatToSay, int delayTime) {word =whatToSay;delay=delayTime;
}
CDI
Java
Hilos
pingPONG II
public void run() {try {
for(;;) {System.out.print(word+" ");Thread.sleep(delay);
}}catch(InterruptedException e) {return;
}}
CDI
Java
Hilos
pingPONG III
public static void main(String[] args) {Runnable ping = new RunPingPONG("ping", 40);Runnable PONG = new RunPingPONG("PONG", 50);new Thread(ping).start();new Thread(PONG).start();
}}
CDI
Java
Hilos
construcción de Runnables
Existen cuatro constructores para crear hilos usando la interfazRunnable.
public Thread(Runnable target)así lo usamos en el ejemplo arriba, se pasa solamente laimplementación de la interfaz Runnablepublic Thread(Runnable target, String name)se pasa adicionalmente un nombre para el hilopublic Thread(ThreadGroup group, Runnabletarget)construye un hilo dentro de un grupo de hilospublic Thread(ThreadGroup group, Runnabletarget, String name)construye un hilo con nombre dentro de un grupo de hilos
CDI
Java
Hilos
implementación de Runnable
La interfaz Runnable exige solamente el método run(),sin embargo, normalmente se implementan más métodospara crear un servicio completo que este hilo debe cumplir.Aunque no hemos guardado las referencias de los hilos enunas variables, los hilos no caen en las manos delrecolector de memoria: siempre se mantiene unareferencia al hilo en su grupo al cual pertenece.El método run() es público y en muchos casos,implementando algún tipo de servicio, no se quiere darpermiso a otros ejecutar directamente el método run().Para evitar eso se puede recurrir a la siguienteconstrucción:
CDI
Java
Hilos
run() no-público
class Service {private Queue requests = new Queue();public Service() {
Runnable service = new Runnable() {public void run() {
for(;;) realService((Job)requests.take());}
};new Thread(service).start();
}public void AddJob(Job job) {
requests.add(job);}private void realService(Job job) {
// do the real work}
}
CDI
Java
Hilos
explicación del ejemplo
Crear el servicio con Service() lanza un nuevo hilo queactua sobre una cola para realizar su trabajo con cadatarea que encuentra ahí.El trabajo por hacer se encuentra en el método privadorealService().Una nueva tarea se puede añadir a la cola conAddJob(...).Nota: la construcción arriba usa el concepto de clasesanónimas de Java, es decir, sabiendo que no se va a usarla clase en otro sitio que no sea que en su punto deconstrucción, se declara directamente donde se usa.
CDI
Java
Hilos y concurrencia
sincronización
En Java es posible forzar la ejecución del código en unbloque en modo sincronizado, es decir, como mucho unhilo puede ejecutar algún código dentro de dicho bloque almismo tiempo.
synchronized (obj) { ... }
La expresión entre paréntesis obj tiene que evaluar a unareferencia a un objeto o a un vector.Declarando un método con el modificador synchronizedgarantiza que dicho método se ejecutaininterrumpidamente por un sólo hilo.La máquina virtual instala un cerrojo (mejor dicho, unmonitor, ya veremos dicho concepto más adelante) que secierra de forma atómica antes de entrar en la región críticay que se abre antes de salir.
CDI
Java
Hilos y concurrencia
métodos syncronizados
Declarar un método comosynchronized void f() { ... }
es equivalente a usar un bloque sincronizado en suinterior:void f() { synchronized(this) { ... } }
Los monitores permiten que el mismo hilo puede accedera otros métodos o bloques sincronizados del mismo objetosin problema.Se libera el cerrojo sea el modo que sea que termine elmétodo.Los constructores no se pueden declarar synchronized.
CDI
Java
Hilos y concurrencia
syncronización y herencia
No hace falta mantener el modo sincronizadosobreescribiendo métodos síncronos mientras se extiendeuna clase. (No se puede forzar un método sincronizada enuna interfaz.)Sin embargo, una llamada al método de la clase súperior(con super.) sigue funcionando de modo síncrono.Los métodos estáticos también pueden ser declaradossynchronized garantizando su ejecución de maneraexclusiva entre varios hilos.
CDI
Java
Hilos y concurrencia
protección de miembros estáticos
En ciertos casos se tiene que proteger el acceso a miembrosestáticos con un cerrojo. Para conseguir eso es posiblesincronizar con un cerrojo de la clase, por ejemplo:
class MyClass {static private int nextID;...MyClass() {synchronized(MyClass.class) {
idNum=nextID++;}
}...
}
CDI
Java
Hilos y concurrencia
¡Ojo con el concepto!
Declarar un bloque o un método como síncrono solo preveeque ningún otro hilo pueda ejecutar al mismo tiempo dicharegión crítica, sin embargo, cualquier otro código asíncronopuede ser ejecutado mientras tanto y su acceso a variablescríticas puede dar como resultado fallos en el programa.
CDI
Java
Hilos y concurrencia
objetos síncronos
Se obtienen objetos totalmente sincronizados siguiendo lasreglas:
todos los métodos son synchronized,no hay miembros/atributos públicos,todos los métodos son final,se inicializa siempre todo bien,el estado del objeto se mantiene siempre consistenteincluyiendo los casos de excepciones.
CDI
Java
Hilos y concurrencia
páginas del manual
Se recomienda estudiar detenidamente las páginas del manualde Java que estén relacionados con el concepto de hilo.
CDI
Java
Hilos y concurrencia
atomicidad en Java
Solo las asignaciónes a variables de tipos simples de 32bits son atómicas.long y double no son simples en este contexto porqueson de 64 bits, hay que declararlas volatile paraobtener acceso atómico.
CDI
Java
Hilos y concurrencia
limitaciones para la programación concurrente
no se puede interrumpir la espera a un cerrojo (una vezllegado a un synchronized no hay vuelta atrás)no se puede influir mucho en la política del cerrojo(distinguir entre lectores y escritores, diferentes justicias,etc.)no se puede confinar el uso de los cerrojos (en cualquierlínea se puede escribir un bloque sincronizado decualquier objeto)no se puede adquirir/liberar un cerrojo en diferentes sitios,se está obligado a un estructura de bloques
CDI
Java
Hilos y concurrencia
paquete especial para la programación concurrente
Por eso se ha introducido desde Java 5 un paqueteespecial para la programación concurrente.
java.util.concurrent
Hay que leer todo su manual.
CDI
Java
Hilos y concurrencia
resumen respecto a concurrencia
(transient)volatilesynchronizedtry-catch-finallyfinalizeThread, Runnablejava.util.concurrentjava.util.concurrent.atomic