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