El lado cool de
                 Java




Leo Soto M.
@leosoto

Java Day INACAP Osorno, Junio 2010
¡Vamos a ir rápido!
1. Collections
2. Generics
3. Misceláneos: autoboxing, varargs
4. Reflection API
5. Annotations
6. Java Compiler API
7. Scripting API
1. Collections
Array? Vector? Hashtable?
Nope.
Implementaciones

List
visitas
=
new
ArrayList();
Set
alumnos
=
new
HashSet();
Map
notasPorAlumno
=
new
HashMap();
Queue
pendientes
=
new
LinkedList();
Algoritmos
Collections.sort(visitas);
Collections.binarySearch(visitas,
v);
Collections.shuffle(alumnos);
Collections.max(notasPorAlumno.get(a));
Collections.reverse(pendientes);
2. Generics
¿Recuerdan?

List
visitas
=
new
ArrayList();
Set
alumnos
=
new
HashSet();
Map
notasPorAlumno
=
new
HashMap();
Queue
pendientes
=
new
LinkedList();
¡Con Generics!
List<Visita>
visitas
=

 new
ArrayList<Visita>();

Set<Alumno>
alumnos
=

 new
HashSet<Alumno>();

Map<Alumno,
List<Integer>>
notas
=

 new
HashMap<Alumno,
List<Integer>();

Queue<Runnable>
pendientes
=



new
LinkedList<Runnable>();
¿Y qué diablos ganamos?
Type Safety

alumnos.add(“esto
arroja
error”);
String
foo
=
alumnos.get(0);
//
Esto
tb
Legibilidad

Alumno
primero
=
(Alumno)alumnos.get(0);
Legibilidad

Alumno
primero
=
alumnos.get(0);
3. Misceláneos: autoboxing, varargs
Autoboxing

Integer
boxed
=
new
Integer(1);
int
unboxed
=
boxed.intValue();
Autoboxing

Integer
boxed
=
1;
int
unboxed
=
boxed;
Autoboxing

Integer
boxed
=
null;
int
unboxed
=
boxed;
//
Oops
Autoboxing

List<Integer>
notas;
notas.add(4);
notas.add(7);
int
suma
=
notas.get(0)
+
notas.get(1);
Varargs

public
void
saludar(String[]
nombres)
{


for(String
nombre:
nombres)
{




System.out.printf(“Hola
%s”,
nombre)


}
}
Varargs


saludar(new
String[]
{“Pedro”,
“Juan”});
Varargs


saludar(“Pedro”,
“Juan”);
Varargs

public
void
saludar(String[]
nombres)
{


for(String
nombre:
nombres)
{




System.out.printf(“Hola
%s”,
nombre)


}
}
Varargs

public
void
saludar(String...
nombres)
{


for(String
nombre:
nombres)
{




System.out.printf(“Hola
%s”,
nombre)


}
}
4. Reflection API
¿Metaprogramación?
Uhm, no exactamente
¡Java dinámico!
Algo así
Demo

https://github.com/leosoto/demos_javaday/tree/master/reflection/
Sin reflection Java no sería lo que es
A veces para bien y otras veces para mal
Hint: Si usa XML, probablemente es para mal ;)
5. Annotations
Metadatos para el código
Annotations

@Deprecated
public
void
metodoAntiguo()
{


//
blah
blah
}
Pero también se pueden definir nuevas
Annotations

@Beta
public
class
UntestedPlugin
{
}
Annotations


public
@interface
Beta
{};
Annotations
Class
pluginClass
=
loadPlugin();
if
(pluginClass.isAnnotationPresent(


Beta.class
))
{



//
Alertar
al
usuario
que
esta
usando


//
un
plugin
beta
}
Y las anotaciones también pueden tener atributos
Annotations

public
@interface
Plugin
{


String
author()
default
“unknown”;


boolean
beta()
default
false;
};
Annotations

@Plugin(author=“Leo”,
beta=true)
public
class
UntestedPlugin
{
}
6. Java Compiler API
Demo

https://github.com/leosoto/demos_javaday/tree/master/compiler/
Ugh
7. Scripting API
Demo

https://github.com/leosoto/demos_javaday/tree/master/scripting/
¿Con gusto a poco?

8. Ejercicio para el auditor: ClassLoaders
¡Muchas gracias!


       @leosoto
http://blog.leosoto.com
¿Preguntas?


       @leosoto
http://blog.leosoto.com

El Lado Cool de Java