Subido por Alexander

Material+del+curso+de+Java

Anuncio
Conceptos básicos
Compilación y ejecución
Tipos de datos
Compi l ac i ón
Ti po
Tamaño
javac Nombr eDel Ar c hi v o. j av a
boolean
byte
short
char
int
float
long
double
no det er mi nado
1 by t e
2 by t es
2 by t es
4 by t es
4 by t es
8 by t es
8 by t es
Ej ec uc i ón
java Nombr eDel Ar c hi v o
Pas o de par ámet r os
java Nombr eDel Ar c hi v o ar g1 ar g2
Sentencia if
if (ex pr es i ón bool eana) {
//Acción en caso verdadero
} else {
//Acción en caso falso
}
if (ex pr es i ón bool eana) {
//Acción en caso verdadero
} else if (ex pr es i ón bool eana) {
/**
* Acción en caso de que la segunda
condición sea verdadera
**/
} else {
/**
* Acción en caso de que ninguna
condición se cumpla
**/
}
Loop while
while (ex pr es i ón bool eana ) {
//Sentencias a repetir
At aj os
a + b
a - b
a * b
a / b
a %b
a ++
a -++ a
-- a
/*
* Sentencias a repetir, se ejecuta al
menos una vez
*/
} while (true);
For loop
for (i ni c i al i z ac i ón;
ev al uac i ón;i nc r ement o / dec r ement o
/ ac c i ón) {
// Sentencias a repetir
}
for (int i = 0; i < 10; i++) {
// Sentencias a repetir
}
c ont i nue: Dej a de ej ec ut ar l a
i t er ac i ón ac t ual y s al t a a l a
s i gui ent e.
a - =1 Dec r ement a a en 1
Operadores de comparación
private
Mi s ma c l as e
default
Mi s mo paquet e
protected
Di f er ent e paquet e a
t r av és de her enc i a
public
Des de c ual qui er
l ugar
a = t r ue
AND
OR
NOT
a
a
a
a
a
a
<
>
<=
>=
==
!=
b
b
b
b
b
b
t i po de dat o nombr e = v al or
a && b = f al s e
a | | b = t r ue
a ! = f al s e
En c as o de que no s e des ee es e
c ompor t ami ent o y s e qui er an
ej ec ut ar ambos , es pos i bl e
ut i l i z ar & y | .
Sentencia switch
switch (e) {
Perro roscko=new Perro();
Operador ternario
( ex pr es i ón bool eana ) ?
v al or s i es v er dader o :
v al or s i es f al s o
Ej empl o
int x = 0 ;
boolean permitirPaso = (edad > 18)
? true : false;
[ modi f i c ador de ac c es o] [ t i po de
dat o] [ nombr e de v ar i abl e] = v al or ;
Definición de métodos
[ modi f i c ador de ac c es o] v al or de
r et or no nombr e del mét odo
( par ámet r os ) {
/ / Sent enc i as
}
Ej empl o
public String getName(){
return "Alex";
}
/*
* sentencias en caso de que e sea
igual a 'a'
nombr e de
*/
default:
/*
* sentencias en caso de que e no
sea ninguna de las anteriores
*/
Oper ador OR
public Perro(String name) {
System.out.print("Se creó " + name);
}
[ modi f i c ador de ac c es o] class
Nombr eDeLaCl as e {
/ / At r i but os
/ / Cons t r uc t or es
/ / Mét odos
}
En una c l as e : Hac e que no
s e pueda her edar de el l a.
En un mét odo : Hac e que no
s e pueda s obr ees c r i bi r .
En una v ar i abl e pr i mi t i v a:
No s e puede c ambi ar s u
v al or .
En una r ef er enc i a : El
obj et o s e puede c ambi ar
per o no s e puede apunt ar a
ot r o.
public class Perro {
private String nombre;
public Perro() {
}
public void ladrar() {
System.out.print("WOW");
}
}
}
www. t wi t t er . com/ devs4j
www. f acebook. com/ devs4j
|
Oper ador XOR ^
Ej empl o
break;
break;
Cor r i mi ent o a l a i z qui er da
<<
Palabra reservada
final
Definición de una clase
/*
* sentencias en caso de que e sea
igual a 'b'
Operadores a nivel
de bits
Oper ador AND &
break;
case 'b':
boolean res=a instanceof Perro;
Cor r i mi ent o a l a der ec ha
>>
Definición de constructores
[ modi f i c ador de ac c es o]
l a c l as e ( par ámet r os ) {
/ / Sent enc i as
}
Operador instanceof
Dev uel v e v er dader o s i a es
una i ns t anc i a c r eada a
par t i r de l a c l as e Per r o
ej empl o
public int edad=18;
Ej empl o
case 'a':
for (int temp : array) {
}
Ej empl o
Ej empl o
b=f al s e
Not a: && y | | s e l es c onoc e
c omo de cor t o ci r cui t o de t al
modo que, s i c on ev al uar el
pr i mer el ement o es s uf i c i ent e
par a det er mi nar el r es ul t ado,
el s egundo el ement o no s e
ev al úa.
For each loop
// Sentencias a repetir
[ Ref er enc i a] nombr e=new
Cons t r uc t or ( par ámet r os ) ;
Definición de variables
*/
outer: for (int i = 0; i <= 10; i++) {
for (int j = 0; j <= 10; j++) {
if (i == 5) {
break outer;
}
}
}
Comentarios de una
sola línea
// Comentario
Comentarios de multiples
líneas
/*
Comentario
de múltiples
líneas
*/
Creación de objetos
Definición de atributos
menor que
may or que
menor o i gual
may or o i gual
I gual
Di f er ent e
br eak : Rompe el c i c l o ac t ual .
Es pos i bl e ut i l i z ar t ags par a
det er mi nar c ual de l os dos c i c l os
s e des ea r omper .
0
0
0
' \ u0000'
0
0. 0f
0
0. 0d
Niveles de acceso
de as i gnac i ón
Operadores lógicos
do {
Def aul t
a +=1; I nc r ement a a en 1
}
Loop do while
Ej empl o
t r ue / f al s e
128
32, 767
' a'
212, 345
1234. 12F
123948573L
1247593. 1739
Operadores aritméticos
Suma
Res t a
Mul t i pl i c ac i ón
Di v i s i ón
Módul o
I nc r ement o
Dec r ement o
Pr e i nc r ement o
Pr e dec r ement o
Comentarios
www. devs4j . com
Programación orientada a objetos
Nombre de la
clase
Figura
+ color:String
Atributos
Persona
Modificador de acceso:
+ calcularArea() : double
- calcularPerimetro() : double
Métodos
+ nombre:String
+ fechaDeNacimiento:String
+ Public
+ dormir() : void
+ respirar() : void
+ comer() : void
- Private
# Protected
Circulo
Cuadrado
Estudiante
+ radio:double
+ lado:double
+ calcularArea() : double
- calcularPerimetro() : double
+ calcularArea() : double
- calcularPerimetro() : double
Herencia
Circulo c=new Circulo();
double area=c.calcularArea();
Cada clase que herede de Figura puede crear
su propia implementación de los métodos
calcularArea() y calcularPerimetro().
Estudiante e=new Estudiante();
e.dormir();
e.respirar();
e.aprobar();
Es posible asignar un objeto de tipo Circulo a
una referencia de tipo Figura gracias al
polimorfismo.
Persona e=new Estudiante();
e.dormir();
e.respirar();
Es posible asignar un objeto de tipo
Estuidiante a una referencia de tipo Persona
gracias al polimorfismo.
IS A
Para poder determinar si una clase hereda de
otra debe pasar el test IS A (ES UN), veamos
algunos ejemplos:
Libro is a Cuaderno
-No cumple
Coche is a Vehiculo
-Cumple
+ aprobar() : void
+ reprobar() : void
+presentarExamen
(ExamenNormal e) : float
+presentarExamen
(ExamenExtraordinario e) : float
+ trabajar() : void
+ cobrar() : void
Motor
+avanzar():void
Figura c=new Circulo();
double area=c.calcularArea();
-Cumple
+ sueldo:float
- motor:Motor
Polimorfismo
Perro is an Animal
+ numeroDeCuenta:int
Coche
Estudiante hereda de Persona, por esto es
posible invocar a los métodos definidos en ella
sin tener que re escribirlos.
Si cumple la relación significa que podemos
utilizar herencia entre las dos clases, en caso
contrario no podemos hacerlo.
HAS A
HAS A (Tiene un ) es una relación también
conocida como composición e indica que una
clase tiene como atributo a un objeto de otra
clase el cual puede utilizar para invocar a sus
métodos, por ejemplo la clase Coche tiene un
Motor y puede invocar a su método encender.
www. t wi t t er . com/ devs4j
Empleado
+encender():void
Encapsulamiento
El encapsulamiento permite ocultar parte de nuestro
código y exponer solo lo que deseamos, en la clase
Examen podemos acceder al valor de la calificación,
pero solo a través de métodos getter y setter.
Examen
- calificacion:float
- numeroDePreguntas: int
+ getCalificacion() : float
+ setCalificacion(float calif) :
float
- float sumaAciertos() : float
- float generaPromedio() :
float
Examen e=new Examen();
float calificacion = e.getCalificacion();
Si se quiere acceder directamente a la calificación
sin utilizar el método getCalificación del siguiente
modo:
Examen e=new Examen();
e.calificacion;
Obtenremos el siguiente error de compilcación:
The field Examen.calificacion is not visible
De igual modo el encapsulamiento nos permite
ocultar métodos que son utilizados internamente por
nuestra clase para no exponerlos a otras clases, un
ejemplo de esto son los métodos:
private float sumarAciertos()
private float generarPromedio()
Sobreescritura
La sobreescritura de métodos permite cambiar el
comportamiento de un método heredado de una
clase padre.
Como se puede ver la clase Figura define el método
calcularArea() , pero una figura por si misma no
puede calcular un área, quien sabe como hacerlo
son las clases Circulo y Cuadrado, por esto
sobreescriben el método, a continuación algunas
reglas:
-Los argumentos del método deben ser
exactamente los mismos del que va a sobreescribir
-El valor de retorno debe ser el mismo o un
subtipo del que se desea sobreescribir
-El nivel de acceso no puede ser más restrictivo
que el que se va a sobreescribir
-Los métodos final no se pueden sobreescribir
www. f acebook. com/ devs4j
Sobrecarga
La sobrecarga de métodos permite tener 2 métodos
con el mismo nombre, la única regla es que deben
recibir parámetros diferentes, un ejemplo de esto son
los métodos :
public float presentarExamen(ExamenNormal e )
public float presentarExamen(ExamenExtraordinario
e)
Los dos métodos se encuentran en la clase
Estudiante y ambos reciben parámetros distintos.
La sobrecarga se puede aplicar también a
constructores, permitiendo crear nuestros objetos
de diferentes formas de acuerdo al problema, a
continuación se presentan algunas reglas:
-Los métodos deben tener el mismo nombre
-Los métodos deben recibir diferentes parámetros
-Los métodos pueden tener diferentes valores de
retorno
-Los métodos pueden arrojar diferentes
excepciones
Constructores
Constructores, static, interfaces, etc.
Los obj et os s e c r ean a t r av és de
c ons t r uc t or es , es t os t i enen l as
s i gui ent es c ar ac t er í s t i c as :
- No t i enen v al or de r et or no
- Su nombr e es el mi s mo de l a c l as e
- Es pos i bl e t ener mul t i pl es c ons t r uc t or es
s i empr e y c uando es t én s obr ec ar gados .
- Pueden t ener c ual qui er modi f i c ador de
ac c es o.
- Si no s e dec l ar a un c ons t r uc t or J av a
c r ear á uno por def ec t o
- El c ons t r uc t or por def ec t o no r ec i be
par ámet r os
- Si s e dec l ar a un c ons t r uc t or , s e
r enunc i ar á al c ons t r uc t or por def ec t o
Static
La pal abr a r es er v ada s t at i c s e ut i l i z a
par a c r ear v ar i abl es y mét odos que
ex i s t i r án i ndependi ent ement e de s i ex i s t e
o no una i ns t anc i a( obj et o) de una c l as e.
Ex i s t i r á s ol o una c opi a de un mét odo /
at r i but o s t at i c s i n i mpor t ar el númer o de
obj et os que t enga l a c l as e.
Variables static
Cuando s e t i ene una v ar i abl e s t at i c s e
t endr á s ol o una c opi a de es t a par a t odas
l as i ns t anc i as , v eamos el s i gui ent e
ej empl o:
Métodos static
Es pos i bl e ej ec ut ar un mét odo s t at i c s i n
nec es i dad de c r ear un obj et o, v eamos el
s i gui ent e ej empl o:
public class Calculadora {
static int suma(int x, int y) {
return x + y;
}
Ej empl o:
public class Perro {
private String nombre;
private String raza;
public Perro() {
}
public Perro(String n, String r) {
nombre = n;
raza = r;
}
......
}
La c l as e ant er i or t i ene 2 c ons t r uc t or es ,
uno que no r ec i be par ámet r os y el ot r o
que r ec i be c omo par ámet r o el nombr e y l a
r az a del per r o. Las s i gui ent es s on f or mas
v ál i das par a c r ear un obj et o de t i po
Per r o:
Perro p=new Perro();
Perro p2=new Perro("Roscko","Terrier escocés");
Invocación de un
constructor desde otro
Es pos i bl e i nv oc ar un c ons t r uc t or des de
ot r o, par a hac er l o, s e hac e us o de l a
pal abr a r es er v ada t hi s, v eamos l a c l as e
Per r o modi f i c ada:
public class Perro {
private String nombre;
private String raza;
public class Humano {
static int numeroDeHumanos = 0;
public Humano() {
numeroDeHumanos++;
}
public static void main(String[] args) {
new Humano();
new Humano();
new Humano();
System.out.println(numeroDeHumanos);
}
}
Sal i da : 3
Del c ódi go ant er i or podemos v er l o
s i gui ent e:
- La v ar i abl e numer oDeHumanos ex i s t e
s i n i mpor t ar s i hay obj et os o no c r eados ,
i ni c i al ment e t i ene un v al or de c er o.
- Cada que s e c r ea un obj et o Humano s e
aument a en uno
- Es pos i bl e ac c eder a el l a s i n
nec es i dad de c r ear un obj et o
- Su v al or es c ompar t i do por t odos l os
obj et os
- Puedes ac c eder a una v ar i abl e s t at i c
que s e enc uent r a en ot r a c l as e del
s i gui ent e modo Nombr eCl as e. v ar i abl e.
Uso de la palabra
reservada this
La pal abr a r es er v ada this s e ut i l i z a par a
r ef er enc i ar al obj et o ac t ual , v eamos el
s i gui ent e ej empl o :
public class Perro {
private String nombre;
private String raza;
public Perro() {
public Perro(String nombre, String raza) {
nombre = nombre;
raza = raza;
}
......
this("NombrePorDefecto","RazaPorDefecto");
}
public Perro(String n, String r) {
nombre = n;
raza = r;
}
......
}
En el ejemplo anterior el constructor que no recibe
parámetros invoca al que si recibe y asígna un nombre
y una raza por defecto, cuando se hace uso de la
palabra reservada this para invocar a otro constructor,
esta debe ser la primera línea de código.
}
En es t e ej empl o l as as i gnac i ones no
f unc i onan dado que l os par ámet r os s e
as i gnan a s i mi s mos y no a l os at r i but os
de l a c l as e, par a i ndi c ar que s e des ea
as i gnar a l os at r i but os de l a c l as e
ut i l i z ar emos l a pal abr a r es er v ada t hi s
del s i gui ent e modo:
public class Perro {
private String nombre;
private String raza;
public Perro(String nombre, String raza) {
this.nombre = nombre;
this.raza = raza;
}
Invocación a un constructor
de la clase padre
Todos l os c ons t r uc t or es ej ec ut an al
c ons t r uc t or de s u c l as e padr e ant es de
ej ec ut ar s e, i nc l us o s i nos ot r os no l o
def i ni mos en el c ódi go t endr emos una
l l amada c omo l a s i gui ent e:
......
}
Cohesión
public Perro() {
super();
}
super( ) al i gual que this( ) s e ut i l i z a par a
ej ec ut ar un c ons t r uc t or , l a di f er enc i a
ent r o uno y ot r o es que t hi s ej ec ut a uno
en l a c l as e ac t ual y s uper uno en l a
c l as e padr e.
www. t wi t t er . com/ devs4j
El t ér mi no c ohes i ón es ut i l i z ado par a
i ndi c ar el gr ado en el que una c l as e
t i ene un s ol o pr opos i t o bi en def i ni do.
Una c l as e bi en enf oc ada t endr á al t a
c ohes i ón, mi ent r as más c ohes i ón t engamos
nues t r as c l as es s er án más f ác i l es de
mant ener .
www. f acebook. com/ devs4j
static int resta(int x, int y) {
return x - y;
}
public static void main(String[] args) {
System.out.println(suma(10, 20));
}
}
Podemos ver que desde el método main se invoca al
método suma sin necesidad de crear un objeto de la
clase Calculadora,
Interfaces
Cuando i mpl ement as una i nt er f az ac ept as
el c ont r at o de i mpl ement ar s us mét odos .
Una i nt er f az def i ne mét odos s i n
i mpl ement ac i ón , c ons t ant es y mét odos
def aul t , v eamos el s i gui ent e ej empl o:
public interface Dibujable {
void dibujar();
}
Las i nt er f ac es deben s er adj et i v os ,
v eamos al gunas i mpl ement ac i ones de l a
i nt er f az Di buj abl e:
public class Rectangulo implements Dibujable{
@Override
public void dibujar() {
System.out.println("Dibujando rectangulo");
}
}
public class Pared implements Dibujable {
@Override
public void dibujar() {
System.out.println("Dibujando en la pared");
}
}
Las c l as es Rec t angul o y Par ed i mpl ement an
l a i nt er f az di buj abl e, por es t o deben
s obr e es c r i bi r el mét odo di buj ar .
A par t i r de
ut i l i z ar def
per mi t en def
i nt er f ac es ,
l a v er s i ón J av a 8
aul t met hods , l os
i ni r una i mpl ement
v eamos el s i gui ent
es pos i bl e
c ual es
ac i ón en
e ej empl o:
interface A{
default void foo(){
System.out.println("Método default");
}
void bar();
}
En el ejemplo anterior tenemos 2 métodos, foo() es un
método default, por tanto la clase que implemente la
interfaz A no esta obligada a implementarlo, mientras
que bar() debe ser implementado.
Acoplamiento
Ac opl ami ent o es el gr ado en el que una
c l as e c onoc e s obr e ot r a. Una c l as e A que
depende de una c l as e B par a f unc i onar
t i ene un al t o ac opl ami ent o.
El al t o ac opl ami ent o c ompl i c a el
mant eni mi ent o de l as apl i c ac i ones , por
es t o s i empr e bus c ar emos r educ i r l o
www. devs4j . com
Ar r egl os, cl ases abst r act as y enumer aci ones
Clases abstractas
Arreglos
La def i ni c i ón de un mét odo s i n
i mpl ement ac i ón s e c onoc e c omo mét odo
abs t r ac t o. Una c l as e abs t r ac t a es una
c l as e que puede c ont ener mét odos
abs t r ac t os y mét odos c onc r et os :
En J av a l os ar r egl os s on obj et os que
al mac enan mul t i pl es v al or es del mi s mo
t i po, una v ez def i ni do el t amaño es t e no
puede c ambi ar , v eamos al gunos punt os a
c ons i der ar :
public abstract class Figura {
private String material;
- Pueden al mac enar pr i mi t i v os y
obj et os .
- Ex i s t en ar r egl os uni di mens i onal es y
mul t i di mens i onal es
public String getMaterial() {
return material;
}
public void setMaterial(String material) {
this.material = material;
}
public abstract double calcularArea();
}
public class Circulo extends Figura {
private double radio;
@Override
public double calcularArea() {
return Math.PI * Math.pow(radio, 2);
}
//Getters y setters de radio
}
public class Cuadro extends Figura {
private double lado;
@Override
public double calcularArea() {
return lado*lado;
}
//Getters y setters de lado
}
Dado que l a f i gur a por s i s ol a no s abe
c omo r eal i z ar un c ál c ul o de ár ea el
mét odo c al c ul ar Ar ea es def i ni do c omo
abs t r ac t o, l a i mpl ement ac i ón debe
i mpl ement ar es e mét odo.
Regl as i mpor t ant es :
- Una c l as e abs t r ac t a no puede s er
f i nal .
- Los mét odos abs t r ac t os deben s er
i mpl ement ados por l as s ubc l as es
- No s e pueden c r ear obj et os de una
c l as e abs t r ac t a
- Es pos i bl e def i ni r c ons t r uc t or es y
mét odos s t at i c en l a c l as e abs t r ac t a.
- Puede t ener mét odos f i nal par a
ev i t ar que l as i mpl ement ac i ones l os
c ambi en.
- Un mét odo abs t r ac t o no puede s er
def i ni do c omo f i nal .
- Si una c l as e abs t r ac t a i mpl ement a
una i nt er f az , puede no i mpl ement ar s us
mét odos , per o l a c l as e que her ede de el l a
debe i mpl ement ar l os .
- Los mét odos abs t r ac t os no pueden s er
s t at i c .
- Una i nt er f az es una c l as e 100%
abs t r ac t a.
Identificadores
Un i dent i f i c ador es el nombr e que
as i gnamos a l as c os as en J av a, es t os
deben s egui r l as s i gui ent es r egl as :
- Pueden i ni c i ar c on una l et r a, gui ón
baj o o s í mbol o de moneda.
- Des pués del pr i mer c ar ac t er s e
pueden i nc l ui r númer os.
- Pueden t ener c ual qui er l ongi t ud.
- No s e pueden ut i l i z ar pal abr as
r es er v adas c omo i dent i f i c ador es .
- Los i dent i f i c ador es s on c as e
s ens i t i v e, FOO y f oo s on 2
i dent i f i c ador es di f er ent es .
Java beans standards
- Si s e des ea obt ener un v al or el mét odo
debe t ener el pr ef i j o get , por ej empl o
get Name( ) ;
- Si s e des ea obt ener un v al or bool ean
t ambi én es v ál i do ut i l i z ar el pr ef i j o i s ,
por ej empl o i s Al i v e( ) ;
- Si s e des ea as i gnar un v al or s e debe
ut i l i z ar el pr ef i j o s et , por ej empl o
s et Name( St r i ng name) ;
- Los mét odos get t er / s et t er deben s er
públ i c os
www. t wi t t er . com/ devs4j
Iterando sobre un arreglo
Es pos i bl e i t er ar a c ada el ement o de un
ar r egl o c on el s i gui ent e c ódi go:
int numeros[] = { 10, 11, 2, 12, 3, 34, 2, 12 };
for (int i = 0; i < numeros.length; i++) {
System.out.println(numeros[i]);
}
Es pos i bl e hac er l o de l a mi s ma f or ma c on
un c i c l o whi l e y do whi l e per o ex i s t e un
t i po de c i l o f or es pec i al l l amado
f or Eac h, a c ont i nuac i ón un ej empl o:
int numeros[] = { 10, 11, 2, 12, 3, 34, 2, 12 };
for (int numero : numeros) {
System.out.println(numero);
}
Es t e t i po de c i c l o f unc i ona a t r av és de
una v ar i abl e t empor al que v a t omando el
v al or de c ada el ement o del ar r egl o,
f or Eac h es una opc i ón c uando:
- No nec es i t amos modi f i c ar el ar r egl o
- No nec es i t amos i ndi c es
Arreglos de objetos
Es pos i bl e t ener t ant o ar r egl os de t i pos
pr i mi t i v os c omo de obj et os , a
c ont i nuac i ón un ej empl o:
public class Taco {
private String sabor;
private float precio;
private boolean cebolla;
private boolean cilantro;
public Taco(String sabor, float precio, boolean
cebolla, boolean cilantro) {
this.sabor = sabor;
this.precio = precio;
this.cebolla = cebolla;
this.cilantro = cilantro;
}
//Getters y setters
}
public class Taqueria {
public static void main(String[] args) {
Taco orden1[] = new Taco[3];
orden1[0] = new Taco("Pastor", 10.5f, true,
true);
orden1[1] = new Taco("Suadero", 20.5f, false,
true);
orden1[2] = new Taco("Bistec", 30.0f, true,
true);
float precioTotal = 0.0f;
for (Taco taco : orden1) {
precioTotal += taco.getPrecio();
}
System.out.println("El precio de la orden es
de : " + precioTotal);
}
}
Arreglos multidimensionales
Los ar r egl os pueden t ener mul t i pl es
di mens i ones a c ont i nuac i ón un ej empl o:
public static void main(String[] args) {
int arrays[][] = { { 2, 2 }, { 4, 4 }, { 5, 5 } };
for (int[] array : arrays) {
for (int value : array) {
System.out.print("\t " + value);
}
System.out.println();
}
}
www. f acebook. com/ devs4j
Declaración de arreglos
Es pos i bl e dec l ar ar una r ef er nc i a a un ar r ay de
c ual qui er a de l as s i gui ent es f or mas :
Ar r egl os de pr i mi t i v os
- int arr [];
- int [] arr;
Ar r egl os de obj et os
- String arr[];
- String []arr;
Inicialización de arreglos
Ex i s t en di f er ent es f or mas de c r ear l os ar r egl os ,
v eamos l as s i gui ent es :
- For ma i mpl í c i t a
String nombres[] = { "Alex", "Pedro", "Juan" }
- For ma ex pl í c i t a
String nombres[] =new String [3];
nombres[0]="Alex";
nombres[1]="Pedro";
nombres[2]="Juan";
- For ma anóni ma
String nombres[] = new String[] { "Alex", "Pedro", "Juan" };
Acceso a arreglos
Par a ac c eder a l os el ement os de un ar r agl o l o
har emos a t r av és de s u i ndi c e, v eamos el s i gui ent e
ej empl o:
String nombres[] = { "Alex", "Pedro", "Juan" }
System.out.println(nombres[0]);
Imprimirá : Alex
Enumeraciones
Una enumer ac i ón es un t i po es pec i al de c l as e que
r epr es ent a un gr upo de c ons t ant es , es t as
c ons t ant es deber án es t ar en may ús c ul as :
public enum SaborPalomitas {
CHILE, MANTEQUILLA, QUESO, CARAMELO;
}
Par a ac c eder al v al or de l a enumer ac i ón s e
r eal i z ar á del s i gui ent e modo:
SaborPalomitas.CARAMELO
Es pos i bl e as i gnar l e v al or es a l as enumer ac i ones ,
v eamos el s i gui ent e
public enum TamanioDePalomitas {
CHICA(20.5f), MEDIANA(30.1f), GRANDE(50.0f);
private float precio;
private TamanioDePalomitas(float precio) {
this.precio = precio;
}
public float getPrecio() {
return precio;
}
}
Par a ac c eder a un v al or de l a enumer ac i ón s e
r eal i z ar á del s i gui ent e modo:
TamanioDePalomitas tamanioMediano =
TamanioDePalomitas.MEDIANA;
System.out.println(tamanioMediano.getPrecio());
Al ej ec ut ar l o ant er i or t endr emos l a s i gui ent e
s al i da: 30. 1
www. devs4j . com
Wrapper classes
Java - Colecciones
Las wr apper c l as es en J av a t i enen 2
pr i nc i pal es pr opós i t os :
- Pr ov eer un mec aní s mo par a env ol v er
v al or es pr i mi t i v os en obj et os y as í s er
i nc l ui dos en ac t i v i dades ex c l us i v as par a
obj et os .
- Pr ov eer una gr an v ar i edad de
ut i l i dades , muc has de el l as es t án
r el ac i onadas c on l a c onv er s i ón.
Equivalencias de wrapper classes
con primitivos
Ex i s t e una wr apper c l as s par a c ada uno de
l os t i pos pr i mi t i v os :
- bool ean- by t e
- c har
- doubl e - f l oat
- i nt
- l ong
- s hor t
-
Bool ean
By t e
Char ac t er
Doubl e
Fl oat
I nt eger
Long
Shor t
Todas l as wr apper c l as s es ex c ept o
Char ac t er pr ov een 2 c ons t r uc t or es , uno
que t oma el v al or pr i mi t i v o y ot r o que
t oma l a r epr es ent ac i ón en St r i ng.
Métodos de conversión
Ex i s t en di f er ent es mét odos que nos
per mi t en r eal i z ar ac t i v i dades de
c onv er s i ón, a c ont i nuac i ón s e mues t r an
al gunos de l os más ut i l i z ados :
- x x x Val ue( ) : Se ut i l i z a c uando
nec es i t as obt ener el v al or pr i mi t i v o par a
un v al or dado:
Integer val=new Integer(11);
double doubleValue = val.doubleValue();
System.out.println(doubleValue);
<<i nt er f ac e>>
Li s t
Ar r ay Li s t
Col l ec t i ons
<<i nt er f ac e>>
Col l ec t i on
<<i nt er f ac e>>
Compar abl e
<<i nt er f ac e>>
Compar at or
<<i nt er f ac e>>
Queue
<<i nt er f ac e>>
Set
<<i nt er f ac e>>
Map
Pr i or i t y Queue
Li nk edLi s t
Has hSet
Has hMap
Tr eeSet
Tr eeMap
Vec t or
Colecciones en Java
Las c ol ec c i ones en J av a s on un f r amewor k que
per mi t e al mac enar un gr upo de obj et os , a
di f er enc i a de l os ar r egl os l as c ol ec c i ones
pueden c r ec er , v eamos un r es umen de l as
i nt er f ac es pr i nc i pal es :
- Col l ec t i on : Todas l as c ol ec c i ones a
ex c epc i ón de l as que pr ov i enen de l a i nt er f az
Map pr ov i nen de l a i nt er f az Col l ec t i on.
- Li s t : Per mi t e gener ar l i s t as s i mpl es de
obj et os
- Set : Per mi t e al mac enar obj et os úni c os
- Map : Per mi t en al mac enar obj et os en par es
l l av e y v al or , l as l l av es deben de s er úni c as
- Queue : Per mi t en al mac enar obj et os de
ac uer do al or den de i ns er c i ón o a r egl as
def i ni das
HashSet
Col ec c i ón ut i l i z ada c uando nec es i t as un
c onj unt o de dat os s i n el ement os
dupl i c ados y no t e i mpor t e el or den de
l os dat os .
HashSet<String> set = new HashSet<>();
- par s eXXX( ) : Conv i er t e un St r i ng a
un t i po pr i mi t i v o:
int intValue = Integer.parseInt("11");
System.out.println(intValue);
-valueOf() : Recibe un String y devuelve un
Wrapper del tipo invocado:
Double doubleValue2 = Double.valueOf("3.14");
System.out.println(doubleValue2);
Autoboxing y Auto-unboxing
A par t i r de l a v er s i ón 5 de J av a ex i s t en
l as s i gui ent es c ar ac t er í s t i c as :
- Aut obox i ng : Es l a c onv er s i ón que
hac e el c ompi l ador de J av a de el t i po
pr i mi t i v o o a s u c or r es pondi ent e wr apper
c l as s :
Integer x=10;
- Aut o- unbox i ng : Es l a c onv er s i ón que
hac e el c ompi l ador de J av a de l a wr apper
c l as s al t i po de dat o pr i mi t i v o:
Integer x=10;
int y=x;
== , equals()
if (i1 != i2) {
System.out.println("Objetos diferentes");
}
if (i1.equals(i2)) {
System.out.println("Objetos equivalentes");
}
Produce la salida:
Objetos diferentes
Objetos equivalentes
Recordemos que == validan si ambas referencias
apuntan al mismo objeto, mientras que equals verifica si
los objetos son equivalentes.
www. t wi t t er . com/ devs4j
ArrayList
Col ec c i ón bas ada en ar r egl os que puede c r ec er ,
c uando es i ns t anc i ada t i ene una c apac i dad
def aul t de 10 el ement os , c onf or me s e v an
agr egando v al or es l a c apac i dad s e v a
i nc r ement ando.
Ar r ay Li s t t i ene una v el oc i dad c ons t ant e al
agr egar y al obt ener el ement os .
TreeSet
Tr eeSet es una de l as c ol ec c i ones
or denadas e i mpl ement a una es t r uc t ur a de
t i po ár bol r oj o- negr o y gar ant i z a que l os
el ement os s er án úni c os y es t ar án
or denados de f or ma as c endent e de ac uer do
a un or den nat ur al .
TreeSet<String> set = new TreeSet<>();
Ar r ay Li s t no es muy ef i c i ent e c uando s e t i ene
que agr egar en una pos i c i ón es pec í f i c a o r emov er
un el ement o.
ArrayList<String> lista = new ArrayList<>();
LinkedList
HashMap
Ut i l i z a Has hMap c uando r equi er as una
c ol ec c i ón que c ont enga par es ,
l l av e- v al or , l as l l av es pueden c ont ener
nul l per o s ol o un el ement o. Has hMap no
per mi t e l l av es dupl i c adas .
Li nk edLi s t es una i mpl ement ac i ón de una l i s t a
dobl ement e l i gada, s u per f or manc e es mej or a un
Ar r ay Li s t c uando s e t i ene que agr egar o r emov er
un el ement o, per o es peor c uando s e qui er e
obt ener o modi f i c ar un el ement o.
El ac c es o a l os dat os s e bas a en el
has hCode, ent r e mej or s ea l a
i mpl ement ac i ón de has hCode, mej or s er á el
per f or manc e.
Li nk edLi s t i mpl ement a t ambi én l a i nt er f az Queue
as í que s e puede ut i l i z ar al mi s mo t i empo c omo
una es t r uc t ur a de t i po FI FO.
HashMap<Integer,String> map = new HashMap<>();
LinkedList<String> lista = new LinkedList<>();
Tr eeMap es una de l as c ol ec c i ones
or denadas al i gual que Tr eeSet , s ol o que
el or den l o def i ni r án l as l l av es y no l os
v al or es .
Vector
Vec t or j unt o c on Has hTabl e s on l as c ol ec c i ones
i ni c i al es agr egadas en l a v er s i ón 1. 2, s u
c ompor t ami ent o es s i mi l ar al de un Ar r ay Li s t a
di f er enc i a que Vec t or es t hr ead s af e.
Vector<String> lista = new Vector<>();
PriorityQueue
Es t a c l as e f ue agr egada en J av a 5, c omo
Li nk edLi s t s opor t a el c ompor t ami ent o def aul t de
una es t r uc t ur a FI FO, Pr i or i t y Queue or dena l os
el ement os de ac uer do a una pr i or i dad, de es t e
modo podemos ac c eder pr i mer o a l os el ement os que
t i enen una may or pr i or i dad.
TreeMap
TreeMap<Integer,String> map = new TreeMap<>();
Comparable /
Comparator
Se ut i l i z a Compar abl e y c ompar at or par a
def i ni r el or den en c ol ec c i ones c omo
Tr eeSet y Tr eeMap.
Collections
La c l as e j av a. ut i l . Col l ec t i ons c ont i ene
un c onj unt o de mét odos s t at i c út i l es par a
t r abaj ar c on c ol ec c i ones .
PriorityQueue<String> queue = new PriorityQueue<>();
www. f acebook. com/ devs4j
www. devs4j . com
Java - Manejo de Errores
c hec k ed
Par a c ons t r ui r t u pr opi o r ec ur s o que puede s er
manej ado por t r y - wi t h- r es our c es debes c r ear
una c l as e que i mpl ement e Cl os abl e o
Aut oc l os abl e y s obr e es c r i bi r s u mét odo c l os e
c omo s e mues t r a:
Throwable
unc hec k ed
Error
Creación de tu propio
Autoclosable
c hec k ed
Exception
ExceptionInitializerError
IOException
RuntimeException
unc hec k ed
StackOverflowError
FileNotFoundException
NullPointerException
FileSystemException
IllegalStateException
OutOfMemoryError
public class MiRecurso implements AutoCloseable {
public void imprimirMensaje() {
System.out.println("Esta es una acción");
}
@Override
public void close() throws Exception {
System.out.println("Se esta cerrando mi recurso");
}
}
Una vez hecho esto podrás utilizarlo del siguiente modo:
try(MiRecurso recurso=new MiRecurso()){
recurso.imprimirMensaje();
} catch (Exception e) {
//Manejo de la excepción
}
Creación de tu propia
Excepción
SecurityException
El di agr ama ant er i or mues t r a al gunas de l as c l as es más i mpor t ant es al moment o de manej ar
er r or es :
- Thr owabl e : Es l a c l as e padr e de t odos l os pr obl emas que enc ont r ar emos al des ar r ol l ar
apl i c ac i ones J av a.
- Er r or : Se ut i l i z a par a r epr es ent ar s i t uac i ones i nus ual es de l as que l as apl i c ac i ones
no s e pueden r ec uper ar .
- Ex c ept i on : Son er r or es en t i empo de ej ec uc i ón de nues t r os pr ogr amas y s e pueden
c l as i f i c ar de ac uer do a l o s i gui ent e:
- Chec k ed : Son ex c epc i ones que el c ompi l ador r equi er e que manej emos , l as ut i l i z amos
c uando qui en l l ama a nues t r o mét odo s e puede r ec uper ar de es a s i t uac i ón.
- Unc hec k ed : Son ex c epc i ones que el c ompi l ador no r equi er e que manej emos , t odas l as
ex c epc i ones que her eden de Runt i meEx c ept i on s er án c ons i der adas c omo unc hec k ed. Las
ut i l i z ar emos par a r epr es ent ar pr obl emas que r es ul t an de er r or es de pr ogr amac i ón.
try - catch -finally
Reglas al utilizar try-catch-finally
A c ont i nuac i ón s e mues t r a un ej empl o s obr e
el us o de t r y - c at c h- f i nal l y :
A c ont i nuac i ón s e mues t r an al gunas r egl as
al ut i l i z ar t r y - c at c h- f i nal l y :
try {
/**
* Código que puede generar excepciones
*/
} catch (Exception e) {
/**
* Código a ejecutar en caso de que
se genere una excepción
*/
} finally {
/**
* Código a ejecutar sin importar si se
* generó o no una excepción
*/
}
- Sol o el bl oque t r y es obl i gat or i o.
- Es pos i bl e def i ni r un bl oque c on s ol o
un t r y y un c at c h del s i gui ent e modo:
try{
Union catch block
Per mi t e t ener un s ol o c at c h par a múl t i pl es
ex c epc i ones :
try {
/**
* Código que puede generar una excepción
*/
} catch (FileNotFoundException |
FileAlreadyExistsException e) {
/**
* Código que se ejecuta en caso de que se genere una
* FileNotFoundException o FileAlreadyExistsException
*/
}catch (IOException e){
/**
* Código que se ejecuta en caso de que se genere una
* IOException
*/
}
try with resources
Tr y wi t h r es our c es s e i nc l uy ó en J av a 7 y
nos per mi t en dec l ar ar r ec ur s os que s e
ut i l i z ar án en un bl oque t r y c on l a
s egur i dad de que s er án c er r ados des pués de
l a ej ec uc i ón del bl oque, Los r ec ur s os
dec l ar ados deben i mpl ment ar l a i nt er f az
Aut oCl os abl e.
www. t wi t t er . com/ devs4j
}catch(Exception e){
}
- Es pos i bl e def i ni r un bl oque c on s ol o
un t r y y un f i nal l y del s i gui ent e modo:
Si l as ex c epc i ones que pr opor c i ona J av a no
r epr es ent an el er r or que nec es i t as , es pos i bl e
c r ear t u pr opi a Ex c epc i ón, par a es t o deber ás
de c r ear una c l as e que her ede de Ex c ept i on o
de Runt i meEx c ept i on dependi endo s i qui er es que
t u ex c epc i ón s ea c hec k ed o unc hec k ed:
class MiExcepcionNoChecada extends RuntimeException {
}
class MiExcepcionChecada extends Exception {
}
Lanzamiento de excepciones
Si ex i s t e una par t e en t u c ódi go donde des eas
l anz ar una ex c epc i ón s e ut i l i z ar á l a pal abr a
r es er v ada t r ow c omo s e mues t r a a c ont i nuac i ón:
class MenorDeEdadException extends Exception{
}
public void validarEdad(int edad) throws
MenorDeEdadException {
if (edad < 18) {
throw new MenorDeEdadException();
}
}
Uso de la palabra reservada
throws
Se ut i l i z a l a pal abr a r es er v ada t hr ows par a
i ndi c ar que en c as o de que s e gener e una
ex c epc i ón es t a no s er á manej ada por el mét odo
ac t ual s i no por el que l o mando l l amar :
try{
}finally{
}
- Un t r y puede t ener muc hos c at c h per o
s ol o uno s e ej ec ut ar á.
- Se deben c ol oc ar l os c at c h de l a
ex c epc i ón más es pec í f i c a a l a más gener al .
- El bl oque f i nal l y s e ej ec ut ar á
i nc l us o s i en el c at c h s e t i ene una
s ent enc i a r et ur n.
- La úni c a f or ma de ev i t ar que s e
ej ec ut e un bl oque f i nal l y es dec l ar ando un
Sy s t em. ex i t ( . . ) ;
Uso de try-with-resources
La c l as e Pr i nt Wr i t er s e ut i l i z a par a
es c r i bi r en un ar c hi v o, v eamos el
s i gui ent e ej empl o:
try (PrintWriter writer = new PrintWriter(new
File("test.txt"))) {
writer.println("Hello World");
} catch (FileNotFoundException e) {
//Manejo de la excepción
}
En el c ódi go ant er i or s i n i mpor t ar s i
ex i s t e o no una ex c epc i ón al es c r i bi r en
el ar c hi v o s e ej ec ut ar á el mét odo c l os e
def i ni do en l a i nt er f az Aut oc l os abl e e
i mpl ement ado por Pr i nt Wr i t er .
www. f acebook. com/ devs4j
public void readFile() throws FileNotFoundException {
File file = new File("archivo_que_no_existe.txt");
FileInputStream stream = new FileInputStream(file);
/**
* código que utiliza stream
*/
}
Como s e puede v er , a pes ar de que
Fi l eNot FoundEx c ept i on es una ex c epc i ón de t i po
c hec k ed, no es nec es ar i o c ol oc ar el c ódi go
dent r o de un t r y c at c h y a que qui en s er á
r es pons abl e de c ac har l a ex c epc i ón es el
mét odo que i nv oque al mét odo r eadFi l e( ) .
Ut i l i z ar emos es t e mét odo par a del egar el
manej o del er r or a qui en t i ene l a c apac i dad de
manej ar l o, por ej empl o s i hay un c omponent e
que s ol o ac c ede a dat os puede pr opagar el
er r or has t a el c omponent e que manej a l a
pr es ent ac i ón par a que l e mues t r e un mens aj e
adec uado al us uar i o.
Reglas al utilizar throws / throw
- Thr ows es nec es ar i o s ol o par a ex c epc i ones
de t i po c hec k ed
- Cuando s e s obr es c r i be un mét odo no es
pos i bl e agr egar t hr ows c on una ex c epc i ón nuev a
de t i po c hec k ed
- Cuando s e l l ega a una l í nea c on t hr ow l a
ej ec uc i ón s e det i ene y s e c omi enz a a pr opagar
l a ex c epc i ón
- Si l a ex c epc i ón no es manej ada por ni ngún
mét odo, s er á manej ada por l a J VM
- Un mét odo puede dec l ar ar más de una
ex c epc i ón c on l a pal abr a r es er v ada t hr ows
- Se puede ut i l i z ar t hr ow s ol o c on obj et os
de t i po Thr owabl e
www. devs4j . com
Inner classes
Java - clases internas
Las c l as es i nt er nas s e pueden c l as i f i c ar
del s i gui ent e modo:
- Cl
- Cl
- Cl
- Cl
as es
as es
as es
as es
i nt er nas r egul ar es
i nt er nas a ni v el de mét odo
anóni mas
i nt er nas es t át i c as
Clases internas regulares
Las c l as es i nt er nas r epr es ent an c l as es
que no s on anóni mas , s t at i c o a ni v el de
mét odo. A c ont i nuac i ón s e pr es ent a un
ej empl o:
public class External {
void foo() {
System.out.println("Foo");
}
class Internal {
void bar() {
System.out.println("Bar");
}
}
}
Es pos i bl e c r ear i ns t anc i as de c l as es
i nt er nas del s i gui ent e modo:
External external = new External();
External.Internal internal = external.new Internal();
external.foo();
internal.bar();
Clases internas estáticas
A c ont i nuac i ón s e pr es ent a un ej empl o de
una c l as e es t át i c a i nt er na:
public class StaticExternal {
static class Interna {
void foo() {
System.out.println("Foo");
}
}
public static void main(String[] args) {
Interna internal = new Interna();
internal.foo();
}
}
No es nec es ar i o c r ear obj et os de l a c l as e
ex t er na par a i ns t anc i ar obj et os de l a
c l as e i nt er na.
Clases anónimas con interfaces
Son c l as es s i n nombr e que t ambi én pueden
i mpl ement ar una i nt er f az
interface Foo {
void foo();
}
public class InterfaceExample {
public static void main(String[] args) {
Foo f = new Foo() {
@Override
public void foo() {
System.out.println("Foo");
}
};
f.foo();
}
}
Threads
Un hi l o es un obj et o en j av a que t i ene
v ar i abl es y mét odos . Lo es pec i al de es t a
c l as e es que per mi t e ej ec ut ar t ar eas de
f or ma c onc ur r ent e.
Ex i s t en 2 f or mas de def i ni r un hi l o:
- Cr eando un obj et o de l a c l as e Thr ead
y s obr ees c r i bi endo el mét odo r un( )
- Cr eando un obj et o que i mpl ement e l a
i nt er f az Runnabl e e i mpl ement ando el
mét odo r un( )
Definición de Threads a
través de herencia
A c ont i nuac i ón s e mues t r a un ej empl o de
l a def i ni c i ón de un hi l o ut i l i z ando
her enc i a:
class DescendingCounter extends Thread {
private int maxNumber;
public DescendingCounter(int maxNumber) {
this.maxNumber = maxNumber;
}
@Override
public void run() {
for (int i = maxNumber; i >= 0; i--) {
try {
Thread.sleep(1000);
System.out.println("Desc:" + i);
} catch (InterruptedException e) {
System.err.println(e);
}
}
}
Clases a nivel de método
Tambi én es pos i bl e dec l ar ar c l as es a
ni v el de mét odo:
public class MethodLevelClasses {
static void print() {
class InnerMethodClass {
void foo() {
System.out.println("test");
}
}
InnerMethodClass innerClass = new
InnerMethodClass();
innerClass.foo();
}
public static void main(String[] args) {
print();
}
}
El c ódi go ant er i or mues t r a c omo hac er un
c ont ador de f or ma des c endent e.
Ejecución de un Thread
El s i gui ent e ej empl o mues t r a c omo
ej ec ut ar hi l os :
public class Counters {
public static void main(String[] args) {
DescendingCounter descending = new
DescendingCounter(10);
Thread ascending = new Thread(new
AscendingCounter(10));
descending.start();
ascending.start();
lkvc mclkvm
}
}
Del c ódi go ant er i or podemos v er l os
s i gui ent es punt os :
- Par a ej ec ut ar un hi l o NO
ej ec ut ar emos s u mét odo r un( ) .
- Par a ej ec ut ar un hi l o ej ec ut ar emos
s u mét odo s t ar t ( ) .
- Si ej ec ut amos el mét odo r un( )
ej ec ut ar á el c ódi go, per o no de f or ma
c onc ur r ent e, s i no c omo un mét odo c omún.
- El mét odo void sleep(long millis) per mi t e
dor mi r el hi l o l a c ant i dad de
mi l i s egundos es pec i f i c ada.
- Si s e c r ea un hi l o a t r av és de una
c l as e que her eda de Thr ead s ol o s e debe
ej ec ut ar s u mét odo s t ar t ( ) .
- Si s e c r ea un hi l o a t r av és de una
c l as e que i mpl ement a Runnabl e el obj et o
s e debe pas ar c omo par ámet r o a un obj et o
de l a c l as e Thr ead.
- " End of cr eat i on" s e i mpr i mi r á ant es
de que s e t er mi nen de ej ec ut ar l os dos
pr oc es os c onc ur r ent es .
Ciclo de vida de los hilos
Los hi l os s e pueden enc ont r ar en l os
s i gui ent es es t ados :
- New: El hi l o s e ha c r eado per o no s e
ha ej ec ut ado el mét odo s t ar t ( )
- Runnabl e: Se ej ec ut ó el mét odo
s t ar t ( ) y el hi l o es t á l i s t o par a s er
ej ec ut ado.
- Runni ng: El hi l o s e enc uent r a en
ej ec uc i ón.
- Wai t i ng/ bl oc k i ng: El hi l o no es
el egi bl e par a s er ej ec ut ado. El hi l o es t a
v i v o per o no es el egi bl e.
- Dead: El hi l o s e c ons i der a muer t o
c uando t er mi na l a ej ec uc i ón del mét odo
r un. No es pos i bl e i ni c i ar de nuev o un
hi l o que s e enc uent r a en es t ado dead.
Definición de Threads a través de implementación
Thread scheduler
A c ont i nuac i ón s e mues t r a un ej empl o de
l a def i ni c i ón de un hi l o i mpl ement ando l a
i nt er f az Runnabl e:
Es l a par t e de l a maqui na v i r t ual de J av a
que dec i de l os hi l os que s e v an a
ej ec ut ar de ac uer do a s us pr i or i dades .
class AscendingCounter implements Runnable {
private int maxNumber;
Clases anónimas
Son c l as es s i n nombr e que her edan de l a
c l as e es pec i f i c ada:
abstract class Test {
abstract void foo();
}
public class AnonymousClass {
public static void main(String[] args) {
Test object = new Test() {
@Override
void foo() {
System.out.println("Foo");
}
};
object.foo();
}
}
www. t wi t t er . com/ devs4j
public AscendingCounter(int maxNumber) {
this.maxNumber = maxNumber;
}
@Override
public void run() {
for (int i = maxNumber; i >= 0; i--) {
try {
Thread.sleep(800);
System.out.println("Asc : " + i);
} catch (InterruptedException e) {
System.err.println(e);
}
}
}
}
El c ódi go ant er i or mues t r a c omo hac er un
c ont ador as c endent e.
www. f acebook. com/ devs4j
www. devs4j . com
Hilos parte 2, Lambdas,
Optional, Streams y Sockets
Ciclo de vida de los hilos
Los hi l os s e pueden enc ont r ar en l os
s i gui ent es es t ados :
- New: El hi l o s e ha c r eado per o no s e
ha ej ec ut ado el mét odo s t ar t ( ) .
- Runnabl e: Se ej ec ut ó el mét odo
s t ar t ( ) y el hi l o es t á l i s t o par a s er
ej ec ut ado.
- Runni ng: El hi l o s e enc uent r a en
ej ec uc i ón.
- Wai t i ng/ bl oc k i ng: El hi l o no es
el egi bl e par a s er ej ec ut ado. El hi l o es t a
v i v o per o no es el egi bl e.
Creación de hilos con
lambdas
Un ej empl o de una i nt er f az f unc i onal es
l a i nt er f az Runnabl e l a c uál s ol o def i ne
el mét odo r un( ) . A c ont i nuac i ón un
ej empl o:
Runnable counter = () -> {
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(800);
System.out.println("Asc : " + i);
} catch (InterruptedException e) {
System.err.println(e);
}
}
};
- Dead: El hi l o s e c ons i der a muer t o
c uando t er mi na l a ej ec uc i ón del mét odo
r un( ) . Un hi l o en es t ado dead no s e puede
v ol v er a i ni c i ar .
El c ódi go ant er i or r epr es ent a l a c r eac i ón
de un obj et o que i mpl ement a l a i nt er f az
Runnabl e.
Métodos últiles
Implementación de una interfaz propias
- s t ar t ( ) : I ni c i a l a ej ec uc i ón de un
hi l o
- j oi n( ) : Hac e que un hi l o es per e l a
ej ec uc i ón de ot r o has t a que es t a t er mi ne.
- s l eep( l ong mi l i s ) : Mét odo es t át i c o
que puedes ut i l i z ar par a al ent ar l a
ej ec uc i ón de un hi l o.
- y i el d( ) : Puede c aus ar que s e mande
al hi l o a es t ado r unnabl e, dependi endo de
s u pr i or i dad.
- wai t ( ) : Env í a al hi l o a es per ar en
es t ado wai t i ng.
- not i f y( ) : Not i f i c a par a que un hi l o
en es t ado wai t i ng pas e a es t ado r unnabl e.
- not i f y Al l ( ) : Not i f i c a a t odos l os
hi l os en es t ado wai t i ng par a que v uel v an
a es t ado r unnabl e.
- s et Name( St r i ng name) : As i gna un
nombr e al hi l o.
- s et Pr i or i t y( i nt pr i or i t y ) : Def i ne
l a pr i or i dad de un hi l o
Lambdas
Las ex pr es i ones l ambda s on una de l as
adi c i ones más i mpor t ant es que s e hi c i er on
a l a v er s i ón 8 de J av a y pr ov een una
f or ma s i mpl e de r epr es ent ar un mét odo a
t r av és de una ex pr es i ón.
Las ex pr es i ones l
i mpl ement ac i ones
f unc i onal es. Una
bás i c ament e una i
mét odo abs t r ac t o.
ambda s on
de i nt er f ac es
i nt er f az f unc i onal es
nt er f az c on un s ol o
Sintaxis
Una ex pr es i ón l ambda es t á c ompues t a por
l as s i gui ent es 3 par t es :
l i s t a de ar gument os : ( i nt x , i nt y )
Tok en : - >
Cuer po : x + y
Creación de un Comparator a
través de lambdas
A c ont i nuac i ón s e mues t r a un ej empl o de
un Compar at or hac i endo us o de l ambdas :
List<Persona> personas = new ArrayList<>();
personas.add(new Persona("Juan", "López"));
personas.add(new Persona("Arturo", "Sánchez"));
Comparator<Persona> comparator = (Persona p,
Persona p2) ->
p.getNombre().compareTo(p2.getNombre());
Collections.sort(personas, comparator);
www. t wi t t er . com/ devs4j
A c ont i nuac i ón s e mues t r a un ej empl o de
l a i mpl ement ac i ón de una i nt er f az
hac i endo us o de l ambdas :
interface Calculable {
double avg(double... numbers);
}
public class InterfaceImplementation {
public static void main(String[] args) {
Calculable calc = (numbers) -> {
double sum = 0.0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
return sum / numbers.length;
};
System.out.println(calc.avg(1, 2, 3, 4, 5, 6, 7,
8, 9, 10));
}
}
Clase Optional
Es t a c l as e nos per mi t e r epr es ent ar
v al or es opc i onal es en l ugar de v al or es
nul os . Veamos el s i gui ent e ej empl o:
public Integer findValue(Integer value, Integer[] array) {
for (int i = 0; i < array.length; i++) {
if (array[i] == value) {
return i;
}
}
return null;
}
El mét odo ant er i or bus c a un v al or en un
ar r egl o y dev uel v e s u pos i c i ón, en c as o
de que no s e enc uent r e dev uel v e nul l . A
c ont i nuac i ón s e pr es ent a un ej empl o
ut i l i z ando Opt i onal :
public static Optional<Integer> findValue(Integer value,
Integer[] array) {
for (int i = 0; i < array.length; i++) {
if (array[i] == value) {
return Optional.of(i);
}
}
return Optional.empty();
}
Es t o hac e una s ol uc i ón más l i mpi a y menos
pr opens a a bugs . El s i gui ent e ej empl o
mues t r a c omo manej ar una r es pues t a
opc i onal :
Java 8 Streams
Un st r eam es una pi ez a de c ódi go que s e
enf oc a en c onj unt os y no en pi ez as
i ndi v i dual es . Supongamos el s i gui ent e
pr obl ema:
Se des ean obt ener l as 3 pr i mer as per s onas
may or es de 18 años que s e enc uent r an en
una l i s t a:
int count = 0;
List<Persona> resultado = new ArrayList<>();
for (Persona persona : personas) {
if (persona.getEdad() >= 18) {
resultado.add(persona);
count++;
if(count==3){
break;
}
}
}
En el c ódi go ant er i or s e da una s ol uc i ón
al pr obl ema de f or ma i mper at i v a. A
c ont i nuac i ón s e pr es ent a una s ol uc i ón de
f or ma f unc i onal a t r av és de s t r eams :
List<Persona> primerosMayores =
personas.stream().filter(p -> p.getEdad() >= 18).limit(3)
.collect(Collectors.toList());
¿Cómo utilizar streams?
Par a ut i l i z ar s t r eams s egui r emos l os
s i gui ent es pas os :
1: I ni c i ar c on una i mpl ement ac i ón
c onc r et a : Ar r ay s, Set , Li s t , Map, et c .
2: Ej ec ut ar el mét odo s t r eam( ) , es
pos i bl e c onc at enar múl t i pl es s t r eams .
3: Ut i l i z ar oper ac i ones ent r e s t r eams
ent r e l as que t enemos : f i l t er , map,
r educ e, et c .
4: Vol v er al c as o c onc r et o, es t e
puede s er : I nt eger , Li s t , Map, Set ,
Opt i onal , et c .
5: Par a v ol v er al c as o c onc r et o
podr emos ut i l i z ar al gunas de l as
s i gui ent es oper ac i ones : s um( ) ,
c ol l ec t ( Col l ec t or s . t oLi s t ( ) ) , av er age( ) ,
c ol l ec t ( Col l ec t or s . gr oupBy ( ) ) , et c .
Sockets
Los s oc k et s per mi t en es c r i bi r pr ogr amas
que s e ej ec ut an en di f er ent es
c omput ador as que es t an c onec t adas a
t r av és de l a r ed.
Un s oc k et es t a c onf or mado por :
- Un pr ot oc ol o : Puede s er UDP o TCP
- Una I P : El l ugar de or i gen o
des t i no al que s e env i ar á l a i nf or mac i ón
- Un puer t o: Son ut i l i z ados par a
det er mi nar a donde di r i gi r el t r áf i c o del
0 al 1023 s on puer t os dedi c ados del
s i s t ema.
ServerSocket
Nos per mi t e def i ni r a nues t r o s oc k et
s er v i dor . A c ont i nuac i ón s e pr es ent a un
ej empl o:
ServerSocket server = new ServerSocket(8080);
Optional<Integer> result = findValue(5, new Integer[] {
10, 33, 23, 57, 88 });
if(result.isPresent()){
System.out.println(result.get());
}else{
System.out.println("No se encontro el resultado");
}
www. f acebook. com/ devs4j
Socket
Nos per mi t e def i ni r a l os c l i ent es que s e
c onec t ar an al s er v i dor . A c ont i nuac i ón s e
pr es ent a un ej empl o:
Socket socket = new Socket("localhost", 8080);
www. devs4j . com
Productor consumidor
Thread
Thread
Productor
Recurso
compartido
Consumidor
LinkedList
Notas
- Los pr oduc t or es deben pr oduc i r mens aj es
en el Li nk edLi s t .
- El obj et o que c ont i ene al Li nk edLi s t
s er á un r ec ur s o c ompar t i do ent r e el
pr oduc er y el c ons umer .
- Si no hay mens aj es a c ons umi r el
c ons umi dor debe es per ar has t a que s ea
not i f i c ado que hay un mens aj e nuev o.
- Si el pr oduc t or gener a un mens aj e debe
not i f i c ar a l os c ons umi dor es par a que
v ay an a c ons umi r l o.
Todo es t o s e debe hac er de f or ma
s i nc r oni z ada par a que l os hi l os s e
ej ec ut en de f or ma i nf i ni t a.
Pueden ex i s t i r N pr oduc t or es y N
c ons umi dor es .
www. t wi t t er . com/ devs4j
www. f acebook. com/ devs4j
www. devs4j . com
Uso de streams
XXStream (range y
rangeClosed)
Transformaciones utilizando
map
Puedes ut i l i z ar I nt St r eam, Doubl eSt r eam,
LongSt r eam, et c , par a gener ar un f l uj o de
dat os pr i mi t i v os a c ont i nuac i ón s e
pr es ent a un ej empl o de f or ma i mper at i v a y
ut i l i z ando pr ogr amac i ón f unc i onal :
Puedes ut i l i z ar map c uando des ees
t r ans f or mar de un obj et o a ot r o, por
ej empl o, s i obt i enes de una bas e de dat os
un obj et o l l amado Per s ona y l o qui er es
t r ans f or mar a uno de t i po St r i ng puedes
hac er l o s i gui ent e:
I mper at i v a
public static void main(String []args) {
List<Persona>personas=
Arrays.asList(new Persona("Alex","Lopex"));
for(inti= 0;i< 10;i++) {
System.out.print(i);
}
List<String>nombres=personas.stream().
map(p->p.getNombre()).
collect(Collectors.toList());
for(String nombre:nombres) {
System.out.println(nombre);
}
Func i onal
IntStream.range(0, 10).forEach(System.out::print);
Máximos y mínimos
A c ont i nuac i ón s e pr es ent a una s ol uc i ón
c omún par a obt ener el v al or mí ni mo de una
l i s t a ut i l i z ando pr ogr amac i ón i mper at i v a:
Uso de métodos static en
interfaces
A par t i r de l a v er s i ón 8 de J av a puedes
c ol oc ar mét odos s t at i c en l as i nt er f ac es
c omo s e mues t r a a c ont i nuac i ón:
interface Follower{
static String getName() {
return "raidentrance";
}
}
Los mét odos s t at i c def i ni dos en l as
i nt er f ac es no pueden s er s obr ees c r i t os .
Ot r o c ambi o i mpor t ant e al t r abaj ar c on
i nt er f ac es es que ahor a puedes i nc l ui r
mét odos c on c uer po, a es t os l os
l l amar emos mét odos def aul t , a
c ont i nuac i ón un ej empl o:
interface Follower{
static String getName() {
return"raidentrance";
}
Par a c al c ul ar el v al or mí ni mo s ol o s e
r eempl az ar á mi n por max en l a l í nea
ant er i or .
default void follow() {
System.out.println("Default follow impl");
}
}
Remover datos
duplicados
Remov er dat os dupl i c ados de una
puede s er una t ar ea c ompl i c ada,
hac er l o c on s t r eams es muy s i mpl
c ont i nuac i ón dos f or mas s i mpl es
hac er l o:
l i st a
per o
e, a
de
1. Ut i l i z ando di s t i nc t
public static void main(String[] args) {
List<Integer> numbers= Arrays.asList(7, 7, 7, 7, 2,
2, 2, 3, 3, 3, 3, 100, 100, 200, 200);
numbers=numbers.stream().distinct().
collect(Collectors.toList());
System.out.println(numbers);
}
2. Ut i l i z ando un s et
public static void main(String []args) {
List<Integer> numbers= Arrays.asList(7, 7, 7, 7, 2,
2, 2, 3, 3, 3, 3, 100, 100, 200, 200);
Set<Integer>nums=
numbers.stream().collect(Collectors.toSet());
System.out.println(nums);
}
www. t wi t t er . com/ devs4j
public static void main(String []args) {
List<String>names=
Arrays.asList("Alex","Juan","Pedro","raidentrance");
names.stream().forEach(System.out::println);
}
Method reference static
class StringUtils{
static boolean isUpperCase(Stringcad) {
return cad.toUpperCase().equals(cad);
}
}
Ut i l i z ando pr ogr amac i ón i mper at i v a:
public static void main(String []args) {
List<String>names=
Arrays.asList
("Alex","Juan","Pedro","raidentrance","PANCHO");
names.stream().
filter(cad->StringUtils.isUpperCase(cad))
.forEach(System.out::println);
Métodos default en las
interfaces
A c ont i nuac i ón s e pr es ent a l a s ol uc i ón
equi v al ent e ut i l i z ando s t r eams :
public static void main(String[]args) {
List<Integer>numbers= Arrays.asList(7, 2, 3,
100, 200, 300, 400, 5, 1);
Integer minValue= numbers.stream().
min(Comparator.naturalOrder()).get();
System.out.println(minValue);
}
En es t e ej empl o s e ex pl i c ar á c omo
ut i l i z ar met hod r ef er enc e c on un mét odo
de i ns t anc i a:
En es t e ej empl o s e ex pl i c ar á c omo
ut i l i z ar met hod r ef er enc e c on un mét odo
s t at i c :
}
public static void main(String []args) {
List<Integer>numbers= Arrays.asList(7, 2, 3,
100, 200, 300, 400, 5, 1);
int min=numbers.get(0);
for(Integer value:numbers) {
if(value<min) {
min=value;
}
}
System.out.println(min);
}
Method reference por
méodo de instancia
El mét odo f ol l ow es un mét odo c on una
i mpl ement ac i ón por def aul t , a di f er enc i a
del mét od get Name que es s t at i c , el
mét odo f ol l ow puede s er s obr ees c r i t o s i n
nungún pr obl ema, c ons ul t a l a i nt er f ac e
Compar at or par a v er una i nt er f az que hac e
us o de mét odos def aul t .
}
Ut i l i z ando s t at i c met hod r ef er enc e:
public static void main(String[]args) {
List<String>names= Arrays.asList
("Alex","Juan","Pedro","raidentrance","PANCHO");
names.stream().
filter(StringUtils::isUpperCase)
.forEach(System.out::println);
}
Method reference con
constructores
Es pos i bl e ut i l i z ar c ons t r uc t or es c on
met hod r ef er enc e c omo s e mues t r a a
c ont i nuac i ón:
class Person {
private String name;
Method reference
public Person(String name) {
this.name=name;
}
Una f unc i onal i dad i mpor t ant e que s e
agr egó en J av a 8 es met hod r ef er enc e y es
ut i l i z ada par a s i mpl i f i c ar l a ej ec uc i ón
de un mét odo dent r o de un l ambda, es t o
puede s er de l os s i gui ent es modos :
-
Ref
Ref
Ref
Ref
er enc i
er enc i
er enc i
er enc i
as
as
as
as
a
a
a
a
mét
mét
mét
un
odos
odos
odos
c ons t
@Override
public String toString() {
return "Person [name="+name+"]";
}
s t at i c
de i ns t anc i a
de una c l as e
r uc t or
A c ont i nuac i ón s e pr es ent an al gunos
ej empl os .
}
names.stream().filter(StringUtils::isUpperCase).
map(Person::new).forEach(System.out::println);
www. f acebook. com/ devs4j
www. devs4j . com
Ejercicios
Sección 3 Primeros pasos
1. Real i z a un pr ogr ama c apaz de
c al c ul ar el ár ea de un c uadr ado,
c í r c ul o, r ec t angul o y t r i angul o.
2. Toma el ej er c i c i o ant er i or y
c ombi er t el o en un pr ogr ama
of us c ado, un pr ogr ama of us c ado es
un pr ogr ama del c ual no s e ent i ende
s u f unc i onal i dad a s i mpl e v i s t a,
haz us o de l os c onoc i mi ent os que
t i enes de i dent i f i c ador es par a que
s ea al go di f í c i l de ent ender .
Sección 5 Programación
orientada a objetos
1. Real i z a un di agr ama de c l as es
que r epr es ent e mas c ot as .
2. Cr ea l as c l as es def i ni das en el
ej er c i c i o ant er i or , c ada una deber á
t ener más de un c ons t r uc t or y el
c ódi go que s e ut i l i z a par a
i ni c i al i z ar no s e deber á r epet i r .
1. Cr ea un pr ogr ama donde un hi l o haga una c uent a
r egr es i v a dado un númer o, el t i empo que debe es per ar
el hi l o debe s er al eat or i o. I ni c i a 10 hi l os y r ev i s a
que hi l o t er mi no pr i mer o, as egur at e de c ol oc ar l e un
nombr e a c ada uno de el l os .
3. Haz debuggi ng s obr e l as c l as es
del ej er c i c i o ant er i or par a que
anal i c es el pas o a pas o de l a
ej ec uc i ón.
2. Modi f i c a el pr ogr ama ant er i or par a que t odos l os
hi l os es per en el mi s mo t i empo as i gnal e di f er ent es
pr i or i dades a c ada uno de el l os y l anz a 30 hi l os ,
r ev i s a s i el c ambi o de pr i or i dad gener ó al gún c ambi o.
3. Si mul a un pr ogr ama que haga t r ans ac c i ones banc ar i as
donde s e t engan que l l ev ar a c abo l as s i gui ent es
oper ac i ones al r et i r ar di ner o:
Sección 6 Herencia
Sección 4 Control de flujo
1. Real i z a un pr ogr ama que i mpr i ma
l as t abl as de mul t i pl i c ar del 1 al
20, debe ex i s t i r un es pac i o ent r e
una y ot r a par a i dent i f i c ar l as .
2. Modi f i c a el pr ogr ama ant er i or
par a que s ol o s e i mpr i man l as
t abl as de mul t i pl i c ar de númer os
par es , par a i dent i f i c ar s i l os
númer os s on par es puedes ut i l i z ar
el oper ador módul o c on 2 c omo s e
mues t r a a c ont i nuac i ón:
1. Pl ant ea 5 es c enar i os que hagan
us o de her enc i a, r ec uer da que deben
pas ar l a r egl a I S- A o ES- UN.
2. Ut i l i z a el di agr ama ant er i or y
haz un pr ogr ama que l o r epr es ent e.
Cada c l as e debe t ener más de un
c ons t r uc t or y t odo debe f unc i onar
c or r ec t ament e, haz us o de l a
pal abr a r es er v ada s uper .
3. Sobr ees c r i be al menos uno de l os
mét odos del ej er c i c i o ant er i or .
int x= 2;
if ( x % 2 == 0) {
System.out.println("Es par");
}
3. Crea un programa utilizando ciclos que
imprima el factorial de un número, se calcula
multiplicando todos los números a partir del
número indicado hasta 1 y se representa con el
simbolo !, a continuación un ejemplo:
4! = 4 x 3 x 2 x 1 = 24
7! = 7 × 6 × 5 × 4 × 3 × 2 × 1 = 5040
Programación con Hilos
Sección 8 Encapsulamiento y
polimorfismo
1. Cr ea l as c l as es nec es ar i as par a
r epr es ent ar a un aut omov i l ,
r ec uer da que debes apl i c ar l os
c onc ept os de pol i mor f i s mo y
enc aps ul ami ent o.
- Val i dar el mont o r ec i bi do
- Cons ul t ar s al do en l a c uent
s uf i c i ent e par a r et i r ar el
- Res t ar el mont o al s al do
- dev ol v er el mont o a qui en i
- I mpr i mi r que s e r eal i z ó el
4. Crea un progama que imprima las siguientes
figuras en la pantalla:
**********
**********
**********
**********
*
**
***
****
*****
4. Pr ogr ama el al gor i t mo de l os hi l os f umador es , debes
de t ener 3 hi l os que s on l os f umador es el l os nec es i t an
3 c os as par a f umar , papel , t abac o y c er i l l os . A demás
debes t ener 3 hi l os pr oduc t or es c ada uno pr oduc i r á un
mat er i al di f er ent e una v ez que s e enc uent r en l os 3
mat er i al es not i f i c a a l os hi l os que pueden i r por s us
mat er i al es par a f umar , s i no hay mat er i al es l os hi l os
f umandor es s e deben i r a un es t ado wai t i ng
Manejo de archivos y flujos
1. Pr ogr ama el c omando di r par a l i s t ar l os ar c hi v os en
un di r ec t or i o es pec i f i c ado
Sección 9 y 10 Temas generales
1. Cr ear un ar r egl o de c ada t i po de
dat o bool ean, by t e, s hor t , i nt ,
c har , f l oat , l ong y doubl e.
2. Pr ogr ama el c omando c p par a c opi ar un ar c hi v o de un
l ugar a ot r o
3. Pr ogr ama el c omando mv par a mov er un ar c hi v o de un
l ugar a ot r o.
2. Cr ear un ar r egl o i r r egul ar en
f or ma de t r i angul o.
Sockets
3. Cr ear un ar r egl o de t i po Mas c ot a
y l l enar l o c on obj et os de
di f er ent es s ubt i pos
1. Cr ea un pr ogr ama que a t r av és de un s oc k et env í e un
mens aj e depende del mens aj e el s er v i dor i mpr i mi r á
i ni c i ando, r ei ni c i ando o apagando.
4. Real i z ar 2 ar r egl os
bi di mens i onal es de l as mi s mas
di mens i ones y s umar l os .
2. Cr ea un pr ogr ama donde el c l i ent e pueda env i ar un
ar c hi v o al s er v i dor
3. Cr ea un pr ogr ama donde el c l i ent e pueda env i ar un
obj et o l l amado HTTPReques t que c ont enga l os s i gui ent es
at r i but os :
Sección 11 Colecciones
1. Cr ea una l i s t a de mas c ot as
modi f i c ando el ej empl o r eal i z ado en
l a s es i ón ant er i or .
2. Cr ea una i mpl ement ac i ón pr opi a de
una l i s t a l i gada, t e r ec omendamos
c r ear una c l as e Nodo que t enga c omo
at r i but os una r ef er enc i a al nodo
s i gui ent e y al ant er i or , debes
s opor t ar l as oper ac i ones agr egar
el ement o, bor r ar y bus c ar .
3. Cr ea una c l as e que admi ni s t r e
l os el ement os de una l i s t a y t e
per mi t a agr egar , bor r ar y bus c ar un
el ement o. El úni c o r equi s i t o es que
l a l i s t a no per mi t a dat os
dupl i c ados .
*
**
***
****
*****
nv oc o el mét odo
r et i r o c on ex i t o
Ej ec ut a l as oper ac i ones s obr e l a c uent a c on v ar i os
hi l os s i n ut i l i z ar s i nc r oni z ac i ón t e r ec omendamos
hac er v ar i os r et i r os , des pués haz l o de nuev o c on
s i nc r oni z ac i ón.
1! = 1
El factorial de 0 es 1.
a y v al i dar s i es
mont o
4. Cr ea una i mpl ement ac i ón de
de l as c ol ec c i ones par a es t o
c r ear una c l as e que i mpl ement
de l as i nt er f ac es Li s t , Set ,
Queue, et c .
al guna
debes
e una
Map,
- Body St r i ng
- Header s Map<St r i ng, St r i ng>
El s er v i dor deber á r es ponder un mens aj e c on l os
s i gui ent es at r i but os :
- Body St r i ng
- Header s Map<St r i ng, St r i ng>
- Ht t pSt at us I nt eger
Puedes s el ec c i onar l a ac c i ón a r eal i z ar t e
r ec omendamos que s ea al go s i mpl e c omo l a s uma de dos
númer os .
Generales
1. Cr ea un pr ogr ama que c or r a en un s er v i dor que t enga
una l i s t a de per s onas , el c l i ent e debe s er c apaz de
l eer l as per s onas , env i ar una per s ona nuev a y
modi f i c ar s us dat os .
Todo s e debe
s oc k et s , s i l
que al ej ec ut
c l i ent e y del
hac er de f or ma r emot a a t r av és de
o des eas puedes es c r i bi r un c omando s al i r
ar l o s e t er mi ne el pr oc es o del l ado del
s er v i dor .
Al t er mi nar el pr oc es o del l ado del s er v i dor l a l i s t a
s e debe guar dar en un ar c hi v o c omo obj et os .
www. t wi t t er . com/ devs4j
www. f acebook. com/ devs4j
www. devs4j . com
Java 9 - Modularidad
Java modular (Jigsaw)
El J SR( J av a Spec i f i c at i on Reques t ) 376 J av a pl at f or m modul e s y s t em pr ov ee:
- Si mpl i f i c a l a c ons t r uc c i ón y el
mant eni mi ent o de apl i c ac i ones gr andes y
c ompl ej as
- Mej or a l a s egur i dad y el mant eni mi ent o del
J DK ( Modul ar i z andol o)
- Mej or a el per f or manc e de l as apl i c ac i ones
- Real i z a un enc aps ul ami ent o más f uer t e
- Si mpl i f i c a s u es c al ami ent o hac i a abaj o par a
s er ut i l i z ado en di s pos i t i v i os más pequeños
Uso de módulos
Una v ez que s e def i ni ó un módul o el
s i gui ent e pas o es ut i l i z ar l o, par a es t o
c r ear emos un nuev o módul o c on l a s i gui ent e
c l as e:
package com.devs4j.calculator;
import java.util.ArrayList;
import java.util.List;
import com.devs4j.math.calculation.CientificCalculator;
Con es t o t endr emos una pl at af or ma más
es c al abl e c on un mej or per f or manc e.
Más i nf or mac i ón en
ht t ps : / / openj dk . j av a. net / pr oj ec t s / j i gs aw/ .
JEP's
Par a c ons egui r el pr oy ec t o J i gs aw s e c r ear on
l os s i gui ent es J EP' s ( J DK Enhanc ement
pr opos al ) :
-
200
201
220
260
261
282
-
J av a modul ar J DK
Modul ar Sour c e c ode
Modul ar r unt i me i mages
Enc aps ul at e mos t of t he i nt er nal api s
Modul e s y s t em
J l i nk : The j av a l i nk er
Crear módulos
Un módul o es bás i c ament e un paquet e de
paquet es or gani z ado por un ar c hi v o
des c r i pt or , a c ont i nuac i ón s e pr es ent a un
ej empl o donde s e ut i l i z a modul ar i dad:
package com.devs4j.math.calculation;
Par a que el c ódi go ant er i or f unc i one s i n
ni ngún pr obl ema s e deber á def i ni r l o
s i gui ent e en el ar c hi v o modul e- i nf o. j av a:
module com.devs4j.calculation {
requires java.base;
requires com.devs4j.math;
}
El ar c hi v o ant er i or def i ne que nues t r o
pr oy ec t o r equi er e del paquet e
c om. dev s 4j . mat h par a f unc i onar , l a
dec l ar ac i ón r equi r es j av a. bas e; no es
nec es ar i a dado que s e hac e de maner a
i mpl í c i t a per o es l a que per mi t e que
ut i l i c emos c l as es c omo Ar r ay Li s t .
Archivo module-info.java
public int sum(int x,int y) {
return processor.sum(x,y);
}
}
Ci ent i f i c Cal c ul ar or ut i l i z a l a c l as e
Cal c ul ar or Pr oc es s or que s e mues t r a a
c ont i nuac i ón:
package com.devs4j.math.operations;
public class CalculatorProcessor {
public int sum(int x,int y) {
return x+y;
}
}
Se puede obs er v ar que s e t i enen l os
s i gui ent es 2 paquet es :
package com.devs4j.math.calculation;
package com.devs4j.math.operations;
Cal c ul at i on def i ne l a i nt er f az a c ompar t i r
c on ot r os pr oy ec t os y oper at i ons c ont i ene
l os det al l es de i mpl ement ac i ón, por es t o
s ol o deber í amos ex poner el paquet e
c al c ul at i on dado que oper at i ons s ol o s e
ut i l i z a i nt er nament e, par a hac er l o c r ear emos
un ar c hi v o l l amado modul e- i nf o. j av a c on l a
s i gui ent e i nf or mac i ón:
module com.devs4j.math {
exports com.devs4j.math.calculation;
}
El ar c hi
paquet e
i nc l ui r
c omo un
vo
c al
el
det
modul e i nf o def i ne que s ol o el
c ul at i on s e ex podr á y al no
paquet e oper at i ons s e mant endr á
al l e de i mpl ement ac i ón.
www. t wi t t er . com/ devs4j
Ant es de dec l ar ar l os módul os del s i s t ema
ut i l i z ando j av a - - l i s t - modul es ,
la
dec l ar ac i ón de un módul o s e hac e c r eando
un ar c hi v o l l amado modul e- i nf o. j av an
i nc l uy endo el nombr e del módul o c omo s e
mues t r a a c ont i nuac i ón:
module com.devs4j.calculation {
...
}
Requires
public class Devs4jTestCalculator {
public static void main(String []args) {
CientificCalculator calc=new CientificCalculator();
System.out.println(calc.sum(10, 20));
List<String>names=newArrayList<>();
System.out.println(names);
}
}
import com.devs4j.math.operations.CalculatorProcessor;
public class ScientificCalculator{
private CalculatorProcessor processor=new
CalculatorProcessor();
Declaración de módulos
Cuando s e c r ea un nuev o módul o s e debe c r ear
un ar c hi v o des c r i pt or l l amado
modul e- i nf o. j av a el c ual puede def i ni r l o
s i gui ent e:
- Nombr e : Nombr e del módul o
- Dependenc i es : Li s t a de dependenc i as del
módul o
- Paquet es publ i c os : Li s t a de paquet es
ac c es i bl es f uer a del módul o
- Ser v i c i os of r ec i dos: Li s t a de s er v i c i os que
pueden c ons umi r ot r os módul os
- Ser v i c i os a c ons umi r : Li s t a de s er v i c i os a
c ons umi r de ot r os módul os
- Ref l ec t i on per mi s s i ons: Per mi t e def i ni r de
f or ma ex pl í c i t a el ni v el de ac c es o que s e
t endr á al ut i l i z ar r ef l ec t i on.
La c onv enc i ón de nombr es de l os módul os es
s i mi l ar a l a de l os paquet es .
Por def aul t t odos l os paquet es de un módul o
s on pr i v ados .
Tipos de módulos
Se ut i l i z a par a def i ni r l as dependenc i as
de nues t r o módul o a c ont i nuac i ón un
ej empl o:
module com.devs4j.calculation {
requires com.devs4j.math;
}
Todos l os paquet es ex por t ados por el
módul o def i ni do es t ar án di s poni bl es par a
s u us o.
Requires static
Def i ne una dependenc i a que es opc i onal en
t i empo de ej ec uc i ón per o que es nec es ar i a
en t i empo de c ompi l ac i ón.
module com.devs4j.calculation {
requires static com.devs4j.math;
}
Requires transitive
Cuando dependemos de un modul o que a s u
v ez t i ene dependenc i as ut i l i z ar emos
r equi r es t r ans i t i v e c omo s e mues t r a a
c ont i nuac i ón:
module com.devs4j.calculation {
requires transitive com.devs4j.math;
}
Exports
Por def aul t un módul o no ex pone ni nguno
de l os paquet es , por mot i v os de
enc aps ul ami ent o f uer t e( St r ong
enc aps ul at i on) debemos def i ni r de f or ma
ex pl í c i t a l os paquet es que s er án
ac c es i bl es c omo s e mues t r a a
c ont i nuac i ón:
module com.devs4j.math {
exports com.devs4j.math.calculation;
}
Puedes ut i l i z ar ex por t s . . . t o . . . par a
r es t r i ngi r l os módul os que pueden
i mpor t ar el paquet e es pec i f i c ado.
A c ont i nuac i ón s e l i s t an l os t i pos de
módul os di s poni bl es :
- Sy s t em modul es: Li s t a de módul os que
c ont i enen l os módul os del J DK puedes
ac c eder a el l os ut i l i z ando el c omando l i s t
modul es .
- Appl i c at i on modul es: Módul os que c r ear emos
y nombr ar emos dur ant e l a c ons t r uc c i ón de
nues t r as apl i c ac i ones .
- Aut omat i c modul es: Módul os que es t ar án
di s poni bl es al i nc l ui r un ar c hi v o j ar . Por
def aul t t endr an c ompl et o ac c es o de l ec t ur a
a t odos l os módul os agr egados al pat h.
- Unnamed modul es : Son ut i l i z ados par a t ener
c ompat i bi l i dad c on v er s i ones ant er i or es de
j av a s e ut i l i z an c uando no s e i nc l uy e
ni ngún t i po de módul o.
Los módul os pueden s er di s t r i bui dos a t r av és
de ar c hi v os j ar ( Sol o podemos t ener un módul o
por j ar ) .
www. f acebook. com/ devs4j
www. devs4j . com
Java 9 - Modularidad
Produce / Consume
services
Reflection
Los módul os pueden pr oduc i r y c ons umi r
s er v i c i os , más que s ol o paquet es , un s er v i c i o
es una i nt er f az que puede t ener múl t i pl es
i mpl ement ac i ones , a c ont i nuac i ón al gunos punt os
i mpor t ant es :
Ref l ec t i on es un api que t e per mi t e
t r abaj ar c on c l as es , obj et os , mét odos y
ot r os c omponent es del l enguaj e c omo
c l as es que podemos mani pul ar a
c ont i nuac i ón un ej empl o:
- pr ov i des <s er v i c e i nt er f ac e> wi t h <c l as s es >
es pec i f i c a que el módul o pr ov ee una o más
i mpl ement ac i ones que pueden s er des c ubi er t as
de f or ma di námi c a por el c ons umer .
- us es <s er v i c e i nt er f ac e> es pec i f i c a una
i nt er f az o c l as e abs t r ac t a que s e des ea
c ons umi r .
package com.devs4j.reflection.service;
A c ont i nuac i ón un ej empl o:
class ApplicationService {
void sayHello() {
System.out.println("Hello");
}
}
package com.devs4j.reflection.user;
Ser v i c e
package com.devs4j.service.auth;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public interface UserAuthentication {
public boolean authenticate(String username, String
password);
}
module com.devs4j.service {
exports com.devs4j.service.auth;
}
public class TestApplicationService {
public static void main(String []args)throws Exception
{
Class<?>classObject=
Class.forName
("com.devs4j.reflection.service.ApplicationService");
Pr ov i der
Constructor<?>constructor=
classObject.getDeclaredConstructor();
module com.devs4j.provider {
requires com.devs4j.service;
provides com.devs4j.service.auth.UserAuthentication
with UserDatabaseAuthenticator;
}
constructor.setAccessible(true);
Object instance=constructor.newInstance();
public class TestAuthenticationApplication {
public static void main(String[] args) {
ServiceLoader<UserAuthentication> service =
ServiceLoader.load(UserAuthentication.class);
if(method.getName().equals("sayHello")) {
method.setAccessible(true);
method.invoke(instance);
}
UserAuthentication userAuthentication =
service.findFirst().get();
}
}
}
}
}
module com.devs4j.application {
requires com.devs4j.service;
uses UserAuthentication;
}
Open
Los módul os pueden per mi t i r ac c es o a
t r av és de r ef l ec t i on ut i l i z ando open.
uses
require
Application
Service
requires
provides
Ser v i c e
package com.devs4j.reflection.app;
class ApplicationService {
void sayHello() {
System.out.println("Hello");
}
}
module com.devs4j.service {
exports com.devs4j.service.auth;
exports com.devs4j.reflection.app;
}
Se puede obs er v ar que s e ui l i z a ex por t s
por l o que el ac c es o a t r av és de
r ef l ec t i on s er á r es t r i ngi do.
Appl i c at i on
public class TestAuthenticationApplication {
public static void main(String []args) {
ServiceLoader<UserAuthentication>service=
ServiceLoader.load(UserAuthentication.class);
UserAuthenticationuserAuthentication=
service.findFirst().get();
boolean authenticated= userAuthentication.
authenticate("raidentrance","udemy");
System.out.println(authenticated);
}
}
Se puede obs er v ar que s e ui l i z a ex por t s
por l o que el ac c es o a t r av és de
r ef l ec t i on s er á r es t r i ngi do.
Como s e puede v er Appl i c at i onSer v i c e
t i ene un ni v el de ac c es o def aul t , es t o
ev i t a que puedas ut i l i z ar l a f uer a del
paquet e com.devs4j.reflection.service s i n
embar go hac i endo us o de r ef l ec t i on
podemos t ener ac c es o s i n i mpor t ar s i l a
c l as e s e enc uent r a f uer a del paquet e.
System.out.println(authenticated);
Es t i empo de c ombi nar l os dos ej empl os
ant er i or es par a ent ender el
f unc i onami ent o de opens , par a es t o s e
modi f i c ar án l os s i gui ent es c omponent es :
Method[]methods=classObject.getDeclaredMethods();
for(Methodmethod:methods) {
System.out.printf("Method %s, is accessible
\n",method.getName(),method.canAccess(instance));
Appl i c at i on
boolean authenticated =
userAuthentication.authenticate("raidentrance","udemy");
Probando reflection con
módulos
- opens <paquet e>
ac c es o a t r av és
- opens <paquet e>
aper t ur a de l os
en es pec í f i c o.
i ndi c a que s e per mi t i r á
de r ef l ec t i on
t o <modul e> r es t r i nge l a
paquet es a al gún modul o
Opens f unc i ona i gual que ex por t c on l a
di f er enc i a que per mi t e ac c es o a l os t i pos
no públ i c os a t r av és de r ef l ec t i on.
Al ej ec ut ar el c ódi go ant er i or
obt endr emos l a s i gui ent e ex c epc i ón:
Ex c ept i on i n t hr ead " mai n"
j av a. l ang. r ef l ec t . I nac c es s i bl eObj ec t Ex c ept i on:
Unabl e t o mak e
c om. dev s 4j . r ef l ec t i on. app. Appl i c at i onSer v i c e( )
ac c es s i bl e: modul e c om. dev s 4j . s er v i c e does not
" opens c om. dev s 4j . r ef l ec t i on. app" t o modul e
c om. dev s 4j . appl i c at i on
Par a per mi t i r el ac c es o a t r av és de
r ef l ec t i on debemos modi f i c ar l a
def i ni c i ón del módul o en s er v i c e c omo s e
mues t r a a c ont i nuac i ón:
module com.devs4j.service {
exports com.devs4j.service.auth;
opens com.devs4j.reflection.app;
}
Una v ez r eal i z ado el c ambi o l a ej ec uc i ón
del mét odo debe s er c or r ec t a
Provider
www. t wi t t er . com/ devs4j
www. f acebook. com/ devs4j
www. devs4j . com
Java 9
Try with resources
Tr y wi t h r es our c es apar ec i ó en l a v er s i ón 7
de j av a c on l a s i gui ent e es t r uc t ur a:
Cuando utilizar JShell
Puedes ut i l i z ar J Shel l par a es c r i bi r
el ement os una v ez e i nmedi at ament e obt ener
r es ul t ados .
try(InputStreamReader isr=new InputStreamReader(System.in);){
Puedes ut i l i z ar c omandos par a c ont r ol ar
el ambi ent e y mos t r ar i nf or mac i ón a
c ont i nuac i ón al gunos ej empl os :
}
A par t i r de l a v er s i ón 9 de J av a podr emos
r eal i z ar l as dec l ar ac i ones f uer a del t r y
c omo s e mues t r a a c ont i nuac i ón:
InputStreamReader isr = new InputStreamReader(System.in);
try(isr) {
}
Extensión al operador
diamante
En J av a 7 s e agr egó el s opor t e par a ut i l i z ar
el oper ador di amant e c omo s e mues t r a a
c ont i nuac i ón:
Configuración
Par a poder
ut i l i z ar l o
agr egar a l
j av a- home/ j
ej ec ut ar el c omando j s hel l y
debes i ns t al ar el J DK de j av a y
as v ar i abl es de ent or no
dk - 9/ bi n.
interface Foo<T>{}
jshell> /vars
|
int x = 45
|
int $3 = 4
|
String $5 = "OceanOcean"
Una v ez que s e c onf i gur a l a v ar i abl e de
ent or no puedes ej ec ut ar el c omando j s hel l
c omo s e mues t r a a c ont i nuac i ón:
jshell> /methods
% jshell
|
twice (String)String
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> /list
jshell>
1 : System.out.println("Hi");
2 : int x = 45;
List<Integer>list=new ArrayList<>();
Una de l as r es t r i c c i ones que s e t ení a es que
el oper ador di amant e no s e podí a apl i c ar a
c l as es anóni mas y s e debí a hac er del
s i gui ent e modo:
Commands
3:2+2
Para salir de jshell utiliza el comando /exit como se
4 : String twice(String s) {return s + s;}
muestra a continuación:
5 : twice("Ocean")
jshell> /exit
Puedes escribir / y utilizar tab para obtener los
| Goodbye
comandos disponibles.
public static void main(String []args) {
Foo<Integer>foo=new Foo<Integer>() {
};
}
Snippets
Puedes utilizar abreviaciones como /l, /se fe v (set
A par t i r de J av a 9 y a puedes ut i l i z ar el
oper ador di amant e c on c l as es abs t r ac t as c omo
s e mues t r a a c ot i nuac i ón:
J s hel l ac ept a s ent enc i as j av a; v ar i abl es ,
mét odos , c l as es , i mpor t s y ex pr es i ones .
Es t as pi ez as de c ódi go s on c onoc i das c omo
s ni ppet s .
feedback verbose)
interface Foo<T> {
}
Dec l ar ac i ón de v ar i abl es
jshell> int x = 45
Puedes ut i l i z ar el f eedbac k mode par a
det er mi nar l as r es pues t as y ot r as
i nt er ac c i ones c on j s hel l .
x ==> 45
Los f eedbac k s di s poni bl es s on:
public static void main(String []args) {
Foo<Integer> foo=new Foo<>() {
};
}
Métodos privados en
interfaces
A par t i r de l a v er s i ón J av a 9 puedes def i ni r
mét odos pr i v ados c on el f i n de que s ean
ut i l i z ados por l os mét odos def aul t , c omo s e
mues t r a a c ont i nuac i ón:
interface Bar {
private void foo() {
}
| created variable x : int
Evaluación de expresiones
jshell> 2 + 2
$3 ==> 4
Feedback
-
v er bos e
nor mal
c onc i s e
s i l ent
Par a c ambi ar el t i po de f eedbac k ut i l i z a
el s i gui ent e c omando:
| created scratch variable $3 : int
/ s et f eedbac k v er bos e
jshell> String twice(String s) {
Pr ueba l os di f er ent es t i pos de f eedbac k
par a v er l os di f er ent es t i pos de
i nt er ac c i ón que puedes t ener .
...>
return s + s;
...> }
private static void foo2() {
}
default void foo3() {
foo();
foo2();
}
Scripting
| created method twice(String)
$5 ==> "OceanOcean"
Puedes es c r i bi r s c r i pt s en ar c hi v os c on
ex t ens i ón . j s h, pueden s er gener ados c omo
s al i das de l as ent r adas del s hel l c omo s e
mues t r a a c ont i nuac i ón:
| created scratch variable $5 : String
jshell> /save mysnippets.jsh
jshell> twice("Ocean")
jshell> /save -history myhistory.jsh
Cambiando la definición
}
jshell> /save -start mystartup.jsh
jshell> String twice(String s) {
Es i mpor t ant e menc i onar que l os mét odos
abs t r ac t os deben s egui r s i endo publ i c .
JShell
J Shel l ( J av a Shel l ) es una her r ami ent a
i nt er ac t i v a par a el apr endi z aj e del l enguaj e
j av a, s e ut i l i z a par a ev al uar dec l ar ac i ones ,
s ent enc i as y ex pr es i ones , es t as
i nmedi at ament e mos t r ar án l os r es ul t ados .
...> return "Twice:" + s;
Puedes ejecutarlos como se muestra a
...> }
continuación:
| modified method twice(String)
% jshell mysnippets.jsh
jshell> twice("thing")
Para cargar un script puedes utilizar /open como
$7 ==> "Twice:thing"
se muestra a continuación:
| created scratch variable $7 : String
jshell> /open PRINTING
www. t wi t t er . com/ devs4j
www. f acebook. com/ devs4j
www. devs4j . com
Descargar