Download Transparencias de elementos de java
Document related concepts
no text concepts found
Transcript
Elementos de Java LSUB, GSYC, URJC Thursday, January 31, 13 Elementos de Java • Los tipos básicos y las construcciones los estamos viendo conforme aprendemos otras cosas, pero... • Además de las construcciones clásicas de Java tenemos ahora algunas novedades que merece la pena conocer Thursday, January 31, 13 Arrays e iteradores int[] arry = new int[10]; int[] arry2 = {10, 3, 5}; Rect[] rs = new Rect[10]; for(Rect r: rs) System.out.println("rect:" + r); Thursday, January 31, 13 Listas de argumentos Thursday, January 31, 13 public int sumar(int... args) { int tot = 0; for(int e: args) tot += e; return tot; } Paquetes • Módulos que empaquetan clases • Como un directorio para el código de la aplicación • Útiles para contener implementaciones y exportar sólo parte al resto • Parecen jerárquicos pero no lo son Thursday, January 31, 13 Paquetes package org.lsub.figuras; public interface Figura { public Punto pos(); public void mover(int dx, int dy); public String toString(); } Thursday, January 31, 13 Paquetes package org.lsub.figuras; public class Elipse extends FiguraSimple { int rx; int ry; public Elipse(Punto en, int radx, int rady) { super(en); rx = radx; ry = rady; } public String toString() { return "elipse:" + pos.toString() + ":" + rx + ":" + ry; } } Thursday, January 31, 13 Paquetes • Nombres jerárquicos (pero no lo son) • Normalmente en un directorio por paquete • con un fichero por clase/interfaz Thursday, January 31, 13 Paquetes • Visibilidad: • Clases: • public: puede usarse desde fuera • <nada>: sólo dentro del paquete Thursday, January 31, 13 Paquetes • Visibilidad: • Miembros: • public: todos pueden usarlo • private: sólo dentro de la clase • protected: clase y derivadas • <nada>: todos en el paquete Thursday, January 31, 13 Paquetes org.lsub.figuras.Elipse fig = new org.lsub.figuras.Elipse(); Thursday, January 31, 13 Paquetes import org.lsub.figuras.Elipse; Elipse fig = new Elipse(); Thursday, January 31, 13 Paquetes import org.lsub.figuras.*; Elipse fig = new Elipse(); Thursday, January 31, 13 Enums public enum DiaSem { Lun, Mar, Mie, Jue, Vie, Sab, Dom; public int comoInt() { switch(this) { case Lun: return 1; case Mar: return 2; case Mie: return 3; case Jue: return 4; case Vie: return 5; case Sab: return 6; default: return 7; } } } Thursday, January 31, 13 Enums • Son una clase • Podemos poner constructores, • Métodos, • Controlar la visibilidad, etc. Thursday, January 31, 13 Enums DiaSem d = DiaSem.Dom; for(DiaSem d: DiaSem.values()) { System.err.println(d); } Thursday, January 31, 13 Clases internas • Podemos definir clases dentro de otras • Para ocultarlas a otros • Aunque podemos declararlas en el fichero de la “externa” y no hacerla pública (y el resto del paquete la ve) Thursday, January 31, 13 Clases internas • Muy útiles como “closures” • Están dentro y pueden ver miembros de la clase externa • Hay clases internas anónimas • Imaginemos que tenemos que implementar Runnable... Thursday, January 31, 13 Clases internas public class Servidor { public void atender() { final Socket sk; // ... aceptar llamada en sk ... new Thread() { public void run() { servirCliente(sk); } }; new Thread() { public void run() { responderCliente(sk); } }; } protected void servirCliente(Socket sk) { // ... } protected void responderCliente(Socket sk) { // ... } } Thursday, January 31, 13 Genéricos public class Par<T1, T2> { public T1 el1; public T2 el2; Par(T1 e1, T2 e2){ el1 = e1; el2 = e2; } } Par<Long, String> par = new Par<Long, String>(32L, "hola"); Thursday, January 31, 13 Genéricos • Podemos exigir que un parámetro del tipo al menos derive de una clase o implemente un interfaz. class ListaItems<T extends Item> ... void foo(Class<? extends Other> arg) Thursday, January 31, 13 Genéricos • El compilador borra los tipos de datos después de compilar • No están en tiempo de ejecución (por ejemplo instanceof de un valor de retorno genérico) • Puede resultar confuso Thursday, January 31, 13 Genéricos • ¿Es una lista genérica de Rectángulos una lista genérica de Figuras? • No, y mejor no complicarse tanto. Thursday, January 31, 13 Referencias • Strong references • Las de toda la vida • El recolector de basura no elimina objetos referenciados por una Thursday, January 31, 13 Referencias • Soft references • Más débiles que las “strong”. • El recolector de basura elimina objetos referenciados por ellas si no hay referencias “strong” tras N ciclos del recolector. Thursday, January 31, 13 Referencias • Weak references • Más débiles que las “soft”. • El recolector de basura elimina objetos referenciados por ellas si no hay referencias “strong”. • La primera vez que lo detecta, y no tras N ciclos. Thursday, January 31, 13 Referencias • Phantom references • Igual que una “weak reference” • Pero ni siquiera podemos obtener el objeto referenciado • Es útil para ver cuándo se ha liberado el objeto referenciado Thursday, January 31, 13 Referencias • Ej. de “soft reference” • Para objetos que guardo en una cache • Se liberan (algunos) si me quedo sin memoria • Es una válvula de escape Thursday, January 31, 13 Referencias public class Cache<K, T> { Map<K, SoftReference<T>> entradas; } Thursday, January 31, 13 public void put(K key, T el) { entradas.put(key, new SoftReference<T>(el)); } public T lookup(K key) { WeakReference<T> ref = entradas.get(key); if(ref == null) return null; // esto puede devolver null, o una strong ref.: return ref.get(); } Referencias • Ej. de “weak reference” • No quiero afectar la recolección • Pero quiero referirme al objeto mientras siga vivo por el resto de referencias Thursday, January 31, 13 Referencias class Record { ... }; // Elementos del pool class Pool { private final int SZ = 8192; private final ReferenceQueue<Record> q = new ReferenceQueue<Record>(); private final HashMap<Reference<Record>, byte[]> m = new HashMap<Reference<Record>, byte[]>(); } public synchronized Record alloc() { byte[] b; Reference<Record> ref = (Reference<Record>)q.poll(); if(ref != null) { b = m.remove(ref); }else { b = new byte[SZ]; } Record buf = new Record(b); Reference<Record> r = new WeakReference<Record>(buf, q); m.put(r, b); return buf; } Thursday, January 31, 13 Referencias • Claves del pool de “weak references”: • Las refs. que mantiene el pool no afectan a la recolección • Utilizamos una ReferenceQueue para detectar cuándo no hay referencias a un record del pool. Thursday, January 31, 13 Referencias • Ejemplo de “phantom references”: • Cuando no necesitemos siquiera dereferenciar. • Ej. para asociar otros elementos a records del pool. • Pero... : Basta usar Weak refs. • Así que no hay ejemplo de esto. Thursday, January 31, 13 Javadoc • Literate programming para Java • Documentamos en comentarios • Hay herramientas que generan docs • Muy bueno si se usa con moderación • Ej. para miembros y clases públicas Thursday, January 31, 13 Javadoc package-info.java /** * This package provides logging facilities for data bases. * <p> * Run Logger.App if all you want is to start the logger application. * <ul> * <li> Logger.Zoo: A zookeper base façade for the package. Provides a * log launcher and manager that acts upon configuration taken from zookeeper. * <li> Logger.Srv: log servers, or loggers. * </ul> * <p> */ package lsub.org.Logger; Thursday, January 31, 13 Javadoc Cfg.java /** * Configurable parameters. * Should perhaps be properties but it's easier for * the user not to have properties to configure. */ public class Cfg { /** * Universal constants. */ public static final int INTSZ = 4; // byes per int public static final int LONGSZ = 8; // byes per long public static final int KiB = 1024; } Thursday, January 31, 13 Javadoc Thursday, January 31, 13 Junit • Clases que implementan pruebas unitarias • No son pruebas de integración • Son básicas para mantener el código Thursday, January 31, 13 Junit LogFileTest.java public class LogFileTest { } Thursday, January 31, 13 @Test(timeout = 1000) public void testCreateRemove() { LogFile lf = new LogFile(TESTF); lf.remove(); File f = new File(TESTF); if(f.exists()) fail("remove failed"); } ... Junit LogFileTest.java Thursday, January 31, 13 @Test(timeout = 1000) public void testOpenFails() { try { LogFile lf = new LogFile("/this/does/not/exist"); lf.remove(); fail("could open a log that does not exist"); }catch(Exception e) { // ok } } Junit LogFileTest.java Thursday, January 31, 13 @Test(timeout = 2000) public void testCloseClosedLog() { LogFile lf = new LogFile(TESTF); lf.write(data1); assertEquals("len does not match", 1, lf.length()); lf.write(data2); assertEquals("len does not match", 2, lf.length()); lf.close(); lf.close(); lf.remove(); } Junit Otras anotaciones de JUnit: • @Before / @After: se invoca el método antes/después de cada prueba. • @BeforeClass / @AfterClass: se invoca el método una vez antes/después de todas las pruebas. El método tiene que ser static. Thursday, January 31, 13