¡Descarga Material de estudio Java y más Esquemas y mapas conceptuales en PDF de Programación Java solo en Docsity!
Compilación y ejecución
Conceptos básicos
Compi l aci ón javac Nombr eDel Ar chi vo. j ava Ej ecuci ón java Nombr eDel Ar chi vo Paso de par ámet r os java Nombr eDel Ar chi vo ar g1 ar g Tipos de datos Ti po Tamaño Ej empl o Def aul t boolean no det er mi nado t r ue / f al se 0 byte 1 byt e 128 0 short 2 byt es 32, 767 0 char 2 byt es ' a' ' \ u0000' int 4 byt es 212, 345 0 float 4 byt es 1234. 12F 0. 0f long 8 byt es 123948573L 0 double 8 byt es 1247593. 1739 0. 0d if (expr esi ón bool eana) { //Acción en caso verdadero } else { //Acción en caso falso } if (expr esi ón bool eana) { //Acción en caso verdadero } else if (expr esi ó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 */ } Comentarios de una sola línea // Comentario Comentarios de multiples líneas / Comentario de múltiples líneas / Sentencia if while (expr esi ón bool eana) { //Sentencias a repetir } Loop while do { /
- Sentencias a repetir, se ejecuta al menos una vez / } while ( true ); Loop do while for (i ni ci al i zaci ón ; eval uaci ón ; i ncr ement o / decr ement o / acci ón) { // Sentencias a repetir } for ( int i = 0; i < 10; i++) { // Sentencias a repetir } cont i nue: Dej a de ej ecut ar l a i t er aci ón act ual y sal t a a l a si gui ent e. br eak: Rompe el ci cl o act ual. Es posi bl e ut i l i zar t ags par a det er mi nar cual de l os dos ci cl os se desea r omper. outer : for ( int i = 0; i <= 10; i++) { for ( int j = 0; j <= 10; j++) { if (i == 5) { break outer ; } } } For loop for ( int temp : array) { // Sentencias a repetir } For each loop switch (e) { case 'a': /
- sentencias en caso de que e sea igual a 'a' / break ; case 'b': /
- sentencias en caso de que e sea igual a 'b' / break ; default : /
- sentencias en caso de que e no sea ninguna de las anteriores */ break ; } Sentencia switch Comentarios Operadores aritméticos Suma a + b Rest a a - b Mul t i pl i caci ón a * b Di vi si ón a / b Módul o a % b I ncr ement o a ++ Decr ement o a - - Pr e i ncr ement o ++ a Pr e decr ement o - - a At aj os de asi gnaci ón a +=1; I ncr ement a a en 1 a - =1 Decr ement a a en 1 Operadores de comparación menor que a < b mayor que a > b menor o i gual a <= b mayor o i gual a >= b I gual a == b Di f er ent e a! = b Operadores lógicos a = t r ue b=f al se AND a && b = f al se OR a | | b = t r ue NOT a_! =_ f al se Not a: && y | | se l es conoce como de cor t o ci r cui t o de t al modo que, si con eval uar el pr i mer el ement o es suf i ci ent e par a det er mi nar el r esul t ado, el segundo el ement o no se eval úa. En caso de que no se desee ese compor t ami ent o y se qui er an ej ecut ar ambos, es posi bl e ut i l i zar & y |. Operador instanceof Devuel ve ver dader o si a es una i nst anci a cr eada a par t i r de l a cl ase Per r o boolean res=a instanceof Perro; Operador ternario ( expr esi ón bool eana )? val or si es ver dader o : val or si es f al so Ej empl o boolean permitirPaso = (edad > 18) ? true : false ; Operadores a nivel de bits Cor r i mi ent o a l a i zqui er da << Cor r i mi ent o a l a der echa
Oper ador AND & Oper ador OR | Oper ador XOR ^ Niveles de acceso private Mi sma cl ase default Mi smo paquet e protected Di f er ent e paquet e a t r avés de her enci a public Desde cual qui er l ugar Definición de variables t i po de dat o nombr e = val or Ej empl o int x = 0 ; Definición de una clase [ modi f i cador de acceso] class Nombr eDeLaCl ase { / / At r i but os / / Const r uct or es / / Mét odos } Ej empl o public class Perro { private String nombre; public Perro() { } public void ladrar() { System. out .print("WOW"); } } Creación de objetos [ Ref er enci a] nombr e=new Const r uct or ( par ámet r os) ; Ej empl o Perro roscko= new Perro(); Definición de métodos [ modi f i cador de acceso] val or de r et or no nombr e del mét odo ( par ámet r os) { / / Sent enci as } Ej empl o public String getName(){ return "Alex"; } Definición de atributos [ modi f i cador de acceso] [ t i po de dat o] [ nombr e de var i abl e] = val or ; ej empl o public int edad=18; Definición de constructores [ modi f i cador de acceso] nombr e de l a cl ase ( par ámet r os) { / / Sent enci as } Ej empl o public Perro(String name) { System. out .print("Se creó " + name); } Palabra reservada final En una cl ase : Hace que no se pueda her edar de el l a. En un mét odo : Hace que no se pueda sobr eescr i bi r. En una var i abl e pr i mi t i va : No se puede cambi ar su val or. En una r ef er enci a : El obj et o se puede cambi ar per o no se puede apunt ar a ot r o.
Modificador de acceso:
+ Public
# Protected
Herencia
Figura
+ color:String
+ calcularArea() : double
- calcularPerimetro() : double
Circulo
+ radio:double
+ calcularArea() : double
- calcularPerimetro() : double
Persona
+ nombre:String
+ fechaDeNacimiento:String
+ dormir() : void
+ respirar() : void
+ comer() : void
Estudiante
+ numeroDeCuenta:int
+ aprobar() : void
+ reprobar() : void
+presentarExamen
(ExamenNormal e) : float
+presentarExamen
(ExamenExtraordinario e) : float
Empleado
+ sueldo:float
+ trabajar() : void
+ cobrar() : void
Cuadrado
+ lado:double
+ calcularArea() : double
- calcularPerimetro() : double 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(); Estudiante hereda de Persona, por esto es posible invocar a los métodos definidos en ella sin tener que re escribirlos.
Polimorfismo
Figura c= new Circulo(); double area=c.calcularArea(); 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.
Examen
- calificacion:float
- numeroDePreguntas: int
+ getCalificacion() : float
+ setCalificacion(float calif) :
float
- float sumaAciertos() : float
- float generaPromedio() :
float
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 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()
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
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
IS A
Para poder determinar si una clase hereda de otra debe pasar el test IS A (ES UN), veamos algunos ejemplos: Perro is an Animal - Cumple Libro is a Cuaderno - No cumple Coche is a Vehiculo - Cumple 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.
Coche
+avanzar():void
Motor
+encender():void
Nombre de la
clase
Atributos
Métodos
Programación orientada a objetos
www. t wi t t er. com/ devs4j www. f acebook. com/ devs4j
Clases abstractas
La def i ni ci ón de un mét odo si n i mpl ement aci ón se conoce como mét odo abst r act o. Una cl ase abst r act a es una cl ase que puede cont ener mét odos abst r act os y mét odos concr et os: public abstract class Figura { private String material; 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 si sol a no sabe como r eal i zar un cál cul o de ár ea el mét odo cal cul ar Ar ea es def i ni do como abst r act o, l a i mpl ement aci ón debe i mpl ement ar ese mét odo. Regl as i mpor t ant es:
- Una cl ase abst r act a no puede ser f i nal.
- Los mét odos abst r act os deben ser i mpl ement ados por l as subcl ases
- No se pueden cr ear obj et os de una cl ase abst r act a
- Es posi bl e def i ni r const r uct or es y mét odos st at i c en l a cl ase abst r act a.
- Puede t ener mét odos f i nal par a evi t ar que l as i mpl ement aci ones l os cambi en.
- Un mét odo abst r act o no puede ser def i ni do como f i nal.
- Si una cl ase abst r act a i mpl ement a una i nt er f az , puede no i mpl ement ar sus mét odos, per o l a cl ase que her ede de el l a debe i mpl ement ar l os.
- Los mét odos abst r act os no pueden ser st at i c.
- Una i nt er f az es una cl ase 100% abst r act a.
Enumeraciones
Una enumer aci ón es un t i po especi al de cl ase que r epr esent a un gr upo de const ant es, est as const ant es deber án est ar en mayúscul as: public enum SaborPalomitas { CHILE, MANTEQUILLA, QUESO, CARAMELO; } Par a acceder al val or de l a enumer aci ón se r eal i zar á del si gui ent e modo: SaborPalomitas.CARAMELO Es posi bl e asi gnar l e val or es a l as enumer aci ones, veamos el si 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 acceder a un val or de l a enumer aci ón se r eal i zar á del si gui ent e modo: TamanioDePalomitas tamanioMediano = TamanioDePalomitas.MEDIANA; System.out.println(tamanioMediano.getPrecio()); Al ej ecut ar l o ant er i or t endr emos l a si gui ent e sal i da: 30. 1
Arreglos
En Java l os ar r egl os son obj et os que al macenan mul t i pl es val or es del mi smo t i po , una vez def i ni do el t amaño est e no puede cambi ar , veamos al gunos punt os a consi der ar :
- Pueden al macenar pr i mi t i vos y obj et os.
- Exi st en ar r egl os uni di mensi onal es y mul t i di mensi onal es
Identificadores
Un i dent i f i cador es el nombr e que asi gnamos a l as cosas en Java, est os deben segui r l as si gui ent es r egl as:
- Pueden i ni ci ar con una l et r a , gui ón baj o o sí mbol o de moneda.
- Después del pr i mer car act er se pueden i ncl ui r númer os.
- Pueden t ener cual qui er l ongi t ud.
- No se pueden ut i l i zar pal abr as r eser vadas como i dent i f i cador es.
- Los i dent i f i cador es son case sensi t i ve, FOO y f oo son 2 i dent i f i cador es di f er ent es.
Java beans standards
- Si se desea obt ener un val or el mét odo debe t ener el pr ef i j o get , por ej empl o get Name ( ) ;
- Si se desea obt ener un val or bool ean t ambi én es vál i do ut i l i zar el pr ef i j o i s, por ej empl o i sAl i ve ( ) ;
- Si se desea asi gnar un val or se debe ut i l i zar el pr ef i j o set , por ej empl o set Name ( St r i ng name) ;
- Los mét odos get t er / set t er deben ser públ i cos
Declaración de arreglos
Es posi bl e decl ar ar una r ef er nci a a un ar r ay de cual qui er a de l as si gui ent es f or mas: Ar r egl os de pr i mi t i vos
- int arr [];
- int [] arr; Ar r egl os de obj et os
- String arr[];
- String []arr;
Inicialización de arreglos
Exi st en di f er ent es f or mas de cr ear l os ar r egl os, veamos l as si gui ent es:
- For ma i mpl í ci t a String nombres[] = { "Alex", "Pedro", "Juan" }
- For ma expl í ci 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 acceder a l os el ement os de un ar r agl o l o har emos a t r avés de su i ndi ce, veamos el si gui ent e ej empl o: String nombres[] = { "Alex", "Pedro", "Juan" } System.out.println(nombres[0]); Imprimirá : Alex
Iterando sobre un arreglo
Es posi bl e i t er ar a cada el ement o de un ar r egl o con el si 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 posi bl e hacer l o de l a mi sma f or ma con un ci cl o whi l e y do whi l e per o exi st e un t i po de ci l o f or especi al l l amado f or Each , a cont i nuaci ón un ej empl o: int numeros[] = { 10, 11, 2, 12, 3, 34, 2, 12 }; for (int numero : numeros) { System.out.println(numero); } Est e t i po de ci cl o f unci ona a t r avés de una var i abl e t empor al que va t omando el val or de cada el ement o del ar r egl o, f or Each es una opci ón cuando:
- No necesi t amos modi f i car el ar r egl o
- No necesi t amos i ndi ces
Arreglos de objetos
Es posi bl e t ener t ant o ar r egl os de t i pos pr i mi t i vos como de obj et os, a cont i nuaci ó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 mensi ones a cont i nuaci ó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(); } } Ar r egl os, cl ases abst r act as y enumer aci ones
Wrapper classes Java - Colecciones
Las wr apper cl ases en Java t i enen 2 pr i nci pal es pr opósi t os:
- Pr oveer un mecaní smo par a envol ver val or es pr i mi t i vos en obj et os y así ser i ncl ui dos en act i vi dades excl usi vas par a obj et os.
- Pr oveer una gr an var i edad de ut i l i dades, muchas de el l as est án r el aci onadas con l a conver si ón.
Equivalencias de wrapper classes
con primitivos
Exi st e una wr apper cl ass par a cada uno de l os t i pos pr i mi t i vos:
- bool ean- Bool ean
- byt e - Byt e
- char - Char act er
- doubl e - Doubl e
- f l oat - Fl oat
- i nt - I nt eger
- l ong - Long
- shor t - Shor t Todas l as wr apper cl asses except o Char act er pr oveen 2 const r uct or es, uno que t oma el val or pr i mi t i vo y ot r o que t oma l a r epr esent aci ón en St r i ng.
Métodos de conversión
Exi st en di f er ent es mét odos que nos per mi t en r eal i zar act i vi dades de conver si ón, a cont i nuaci ón se muest r an al gunos de l os más ut i l i zados:
- xxxVal ue ( ) : Se ut i l i za cuando necesi t as obt ener el val or pr i mi t i vo par a un val or dado: Integer val=new Integer(11); double doubleValue = val.doubleValue(); System.out.println(doubleValue);
- par seXXX ( ) : Convi er t e un St r i ng a un t i po pr i mi t i vo: 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 ver si ón 5 de Java exi st en l as si gui ent es car act er í st i cas:
- Aut oboxi ng : Es l a conver si ón que hace el compi l ador de Java de el t i po pr i mi t i vo o a su cor r espondi ent e wr apper cl ass : Integer x=10;
- Aut o- unboxi ng : Es l a conver si ón que hace el compi l ador de Java de l a wr apper cl ass al t i po de dat o pr i mi t i vo: 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. <> Li st <> Queue <> Set <> Map <> Col l ect i on Ar r ayLi st Li nkedLi st Vect or Pr i or i t yQueue HashSet Tr eeSet HashMap Tr eeMap <> Compar abl e <> Compar at or Col l ect i ons
Colecciones en Java
Las col ecci ones en Java son un f r amewor k que per mi t e al macenar un gr upo de obj et os, a di f er enci a de l os ar r egl os l as col ecci ones pueden cr ecer , veamos un r esumen de l as i nt er f aces pr i nci pal es:
- Col l ect i on : Todas l as col ecci ones a excepci ón de l as que pr ovi enen de l a i nt er f az Map pr ovi nen de l a i nt er f az Col l ect i on.
- Li st : Per mi t e gener ar l i st as si mpl es de obj et os
- Set : Per mi t e al macenar obj et os úni cos
- Map : Per mi t en al macenar obj et os en par es l l ave y val or , l as l l aves deben de ser úni cas
- Queue : Per mi t en al macenar obj et os de acuer do al or den de i nser ci ón o a r egl as def i ni das
ArrayList
Col ecci ón basada en ar r egl os que puede cr ecer , cuando es i nst anci ada t i ene una capaci dad def aul t de 10 el ement os, conf or me se van agr egando val or es l a capaci dad se va i ncr ement ando. Ar r ayLi st t i ene una vel oci dad const ant e al agr egar y al obt ener el ement os. Ar r ayLi st no es muy ef i ci ent e cuando se t i ene que agr egar en una posi ci ón especí f i ca o r emover un el ement o. ArrayList lista = new ArrayList<>();
LinkedList
Li nkedLi st es una i mpl ement aci ón de una l i st a dobl ement e l i gada, su per f or mance es mej or a un Ar r ayLi st cuando se t i ene que agr egar o r emover un el ement o, per o es peor cuando se qui er e obt ener o modi f i car un el ement o. Li nkedLi st i mpl ement a t ambi én l a i nt er f az Queue así que se puede ut i l i zar al mi smo t i empo como una est r uct ur a de t i po FI FO. LinkedList lista = new LinkedList<>();
Vector
Vect or j unt o con HashTabl e son l as col ecci ones i ni ci al es agr egadas en l a ver si ón 1. 2, su compor t ami ent o es si mi l ar al de un Ar r ayLi st a di f er enci a que Vect or es t hr ead saf e. Vector lista = new Vector<>();
PriorityQueue
Est a cl ase f ue agr egada en Java 5, como Li nkedLi st sopor t a el compor t ami ent o def aul t de una est r uct ur a FI FO , Pr i or i t yQueue or dena l os el ement os de acuer do a una pr i or i dad, de est e modo podemos acceder pr i mer o a l os el ement os que t i enen una mayor pr i or i dad. PriorityQueue queue = new PriorityQueue<>();
HashSet
Col ecci ón ut i l i zada cuando necesi t as un conj unt o de dat os si n el ement os dupl i cados y no t e i mpor t e el or den de l os dat os. HashSet set = new HashSet<>();
TreeSet
Tr eeSet es una de l as col ecci ones or denadas e i mpl ement a una est r uct ur a de t i po ár bol r oj o- negr o y gar ant i za que l os el ement os ser án úni cos y est ar án or denados de f or ma ascendent e de acuer do a un or den nat ur al. TreeSet set = new TreeSet<>();
HashMap
Ut i l i za HashMap cuando r equi er as una col ecci ón que cont enga par es, l l ave- val or , l as l l aves pueden cont ener nul l per o sol o un el ement o. HashMap no per mi t e l l aves dupl i cadas. El acceso a l os dat os se basa en el hashCode, ent r e mej or sea l a i mpl ement aci ón de hashCode, mej or ser á el per f or mance. HashMap<Integer,String> map = new HashMap<>();
TreeMap
Tr eeMap es una de l as col ecci ones or denadas al i gual que Tr eeSet , sol o que el or den l o def i ni r án l as l l aves y no l os val or es. TreeMap<Integer,String> map = new TreeMap<>();
Comparable /
Comparator
Se ut i l i za Compar abl e y compar at or par a def i ni r el or den en col ecci ones como Tr eeSet y Tr eeMap.
Collections
La cl ase j ava. ut i l. Col l ect i ons cont i ene un conj unt o de mét odos st at i c út i l es par a t r abaj ar con col ecci ones.
Inner classes Las cl ases i nt er nas se pueden cl asi f i car del si gui ent e modo:
- Cl ases i nt er nas r egul ar es
- Cl ases i nt er nas a ni vel de mét odo
- Cl ases anóni mas
- Cl ases i nt er nas est át i cas Definición de Threads a través de implementación A cont i nuaci ón se muest r a un ej empl o de l a def i ni ci ón de un hi l o i mpl ement ando l a i nt er f az Runnabl e : class AscendingCounter implements Runnable { private int maxNumber; 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 muest r a como hacer un cont ador ascendent e.
Java - clases internas
Clases internas regulares Las cl ases i nt er nas r epr esent an cl ases que no son anóni mas, st at i c o a ni vel de mét odo. A cont i nuaci ón se pr esent a un ej empl o: public class External { void foo() { System.out.println("Foo"); } class Internal { void bar() { System.out.println("Bar"); } } } Es posi bl e cr ear i nst anci as de cl ases i nt er nas del si gui ent e modo: External external = new External(); External.Internal internal = external.new Internal(); external.foo(); internal.bar(); Clases internas estáticas A cont i nuaci ón se pr esent a un ej empl o de una cl ase est át i ca 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 necesar i o cr ear obj et os de l a cl ase ext er na par a i nst anci ar obj et os de l a cl ase i nt er na. Clases a nivel de método Tambi én es posi bl e decl ar ar cl ases a ni vel 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(); } Clases anónimas Son cl ases si n nombr e que her edan de l a cl ase especi f i cada: 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(); } } Clases anónimas con interfaces Son cl ases si 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 ava que t i ene var i abl es y mét odos. Lo especi al de est a cl ase es que per mi t e ej ecut ar t ar eas de f or ma concur r ent e. Exi st en 2 f or mas de def i ni r un hi l o:
- Cr eando un obj et o de l a cl ase Thr ead y sobr eescr 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 cont i nuaci ón se muest r a un ej empl o de l a def i ni ci ón de un hi l o ut i l i zando her enci 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); } } } } El códi go ant er i or muest r a como hacer un cont ador de f or ma descendent e. Ejecución de un Thread El si gui ent e ej empl o muest r a como ej ecut 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 ver l os si gui ent es punt os:
- Par a ej ecut ar un hi l o NO ej ecut ar emos su mét odo r un ( ).
- Par a ej ecut ar un hi l o ej ecut ar emos su mét odo st ar t ( ).
- Si ej ecut amos el mét odo r un ( ) ej ecut ar á el códi go, per o no de f or ma concur r ent e, si no como un mét odo común.
- El mét odo void sleep(long millis) per mi t e dor mi r el hi l o l a cant i dad de mi l i segundos especi f i cada.
- Si se cr ea un hi l o a t r avés de una cl ase que her eda de Thr ead sol o se debe ej ecut ar su mét odo st ar t ( ).
- Si se cr ea un hi l o a t r avés de una cl ase que i mpl ement a Runnabl e el obj et o se debe pasar como par ámet r o a un obj et o de l a cl ase Thr ead.
- " End of cr eat i on" se i mpr i mi r á ant es de que se t er mi nen de ej ecut ar l os dos pr ocesos concur r ent es. Ciclo de vida de los hilos Los hi l os se pueden encont r ar en l os si gui ent es est ados:
- New : El hi l o se ha cr eado per o no se ha ej ecut ado el mét odo st ar t ( )
- Runnabl e : Se ej ecut ó el mét odo st ar t ( ) y el hi l o est á l i st o par a ser ej ecut ado.
- Runni ng : El hi l o se encuent r a en ej ecuci ón.
- Wai t i ng/ bl ocki ng : El hi l o no es el egi bl e par a ser ej ecut ado. El hi l o est a vi vo per o no es el egi bl e.
- Dead : El hi l o se consi der a muer t o cuando t er mi na l a ej ecuci ón del mét odo r un. No es posi bl e i ni ci ar de nuevo un hi l o que se encuent r a en est ado dead. Thread scheduler Es l a par t e de l a maqui na vi r t ual de Java que deci de l os hi l os que se van a ej ecut ar de acuer do a sus pr i or i dades.
Java 8 Streams
Un st r eam es una pi eza de códi go que se enf oca en conj unt os y no en pi ezas i ndi vi dual es. Supongamos el si gui ent e pr obl ema: Se desean obt ener l as 3 pr i mer as per sonas mayor es de 18 años que se encuent r an en una l i st a: int count = 0; List 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 se da una sol uci ón al pr obl ema de f or ma i mper at i va. A cont i nuaci ón se pr esent a una sol uci ón de f or ma f unci onal a t r avés de st r eams : List primerosMayores = personas.stream().filter(p -> p.getEdad() >= 18).limit(3) .collect(Collectors.toList());
Creación de hilos con
lambdas
Un ej empl o de una i nt er f az f unci onal es l a i nt er f az Runnabl e l a cuál sol o def i ne el mét odo r un ( ). A cont i nuaci ó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); } } }; El códi go ant er i or r epr esent a l a cr eaci ón de un obj et o que i mpl ement a l a i nt er f az Runnabl e.
Ciclo de vida de los hilos
Los hi l os se pueden encont r ar en l os si gui ent es est ados:
- New : El hi l o se ha cr eado per o no se ha ej ecut ado el mét odo st ar t ( ).
- Runnabl e : Se ej ecut ó el mét odo st ar t ( ) y el hi l o est á l i st o par a ser ej ecut ado.
- Runni ng : El hi l o se encuent r a en ej ecuci ón.
- Wai t i ng/ bl ocki ng : El hi l o no es el egi bl e par a ser ej ecut ado. El hi l o est a vi vo per o no es el egi bl e.
- Dead : El hi l o se consi der a muer t o cuando t er mi na l a ej ecuci ón del mét odo r un ( ). Un hi l o en est ado dead no se puede vol ver a i ni ci ar.
Métodos últiles
- st ar t ( ) : I ni ci a l a ej ecuci ón de un hi l o
- j oi n ( ) : Hace que un hi l o esper e l a ej ecuci ón de ot r o hast a que est a t er mi ne.
- sl eep ( l ong mi l i s) : Mét odo est át i co que puedes ut i l i zar par a al ent ar l a ej ecuci ón de un hi l o.
- yi el d ( ) : Puede causar que se mande al hi l o a est ado r unnabl e , dependi endo de su pr i or i dad.
- wai t ( ) : Enví a al hi l o a esper ar en est ado wai t i ng.
- not i f y ( ) : Not i f i ca par a que un hi l o en est ado wai t i ng pase a est ado r unnabl e.
- not i f yAl l ( ) : Not i f i ca a t odos l os hi l os en est ado wai t i ng par a que vuel van a est ado r unnabl e.
- set Name ( St r i ng name) : Asi gna un nombr e al hi l o.
- set 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 expr esi ones l ambda son una de l as adi ci ones más i mpor t ant es que se hi ci er on a l a ver si ón 8 de Java y pr oveen una f or ma si mpl e de r epr esent ar un mét odo a t r avés de una expr esi ón. Las expr esi ones l ambda son i mpl ement aci ones de i nt er f aces f unci onal es. Una i nt er f az f unci onal es bási cament e una i nt er f az con un sol o mét odo abst r act o.
Sintaxis
Una expr esi ón l ambda est á compuest a por l as si gui ent es 3 par t es: l i st a de ar gument os : ( i nt x, i nt y) Token : - > Cuer po : x + y
Creación de un Comparator a
través de lambdas
A cont i nuaci ón se muest r a un ej empl o de un Compar at or haci endo uso de l ambdas: List personas = new ArrayList<>(); personas.add(new Persona("Juan", "López")); personas.add(new Persona("Arturo", "Sánchez")); Comparator comparator = (Persona p, Persona p2) -> p.getNombre().compareTo(p2.getNombre()); Collections.sort(personas, comparator);
Implementación de una interfaz propias
A cont i nuaci ón se muest r a un ej empl o de l a i mpl ement aci ón de una i nt er f az haci endo uso 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
Est a cl ase nos per mi t e r epr esent ar val or es opci onal es en l ugar de val or es nul os. Veamos el si 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 busca un val or en un ar r egl o y devuel ve su posi ci ón, en caso de que no se encuent r e devuel ve nul l. A cont i nuaci ón se pr esent a un ej empl o ut i l i zando Opt i onal : public static Optional findValue(Integer value, Integer[] array) { for (int i = 0; i < array.length; i++) { if (array[i] == value) { return Optional.of(i); } } return Optional.empty(); } Est o hace una sol uci ón más l i mpi a y menos pr opensa a bugs. El si gui ent e ej empl o muest r a como manej ar una r espuest a opci onal : Optional 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"); }
¿Cómo utilizar streams?
Par a ut i l i zar st r eams segui r emos l os si gui ent es pasos: 1: I ni ci ar con una i mpl ement aci ón concr et a : Ar r ays , Set , Li st , Map , et c. 2: Ej ecut ar el mét odo st r eam ( ) , es posi bl e concat enar múl t i pl es st r eams. 3: Ut i l i zar oper aci ones ent r e st r eams ent r e l as que t enemos : f i l t er , map , r educe , et c. 4: Vol ver al caso concr et o, est e puede ser : I nt eger , Li st , Map , Set , Opt i onal , et c. 5: Par a vol ver al caso concr et o podr emos ut i l i zar al gunas de l as si gui ent es oper aci ones: sum ( ) , col l ect ( Col l ect or s. t oLi st ( ) ) , aver age ( ) , col l ect ( Col l ect or s. gr oupBy ( ) ) , et c.
Sockets
Los socket s per mi t en escr i bi r pr ogr amas que se ej ecut an en di f er ent es comput ador as que est an conect adas a t r avés de l a r ed. Un socket est a conf or mado por :
- Un pr ot ocol o : Puede ser UDP o TCP
- Una I P : El l ugar de or i gen o dest i no al que se envi ar á l a i nf or maci ón
- Un puer t o : Son ut i l i zados par a det er mi nar a donde di r i gi r el t r áf i co del 0 al 1023 son puer t os dedi cados del si st ema.
ServerSocket
Nos per mi t e def i ni r a nuest r o socket ser vi dor. A cont i nuaci ón se pr esent a un ej empl o: ServerSocket server = new ServerSocket(8080);
Socket
Nos per mi t e def i ni r a l os cl i ent es que se conect ar an al ser vi dor. A cont i nuaci ón se pr esent a un ej empl o: Socket socket = new Socket("localhost", 8080);
Hilos parte 2, Lambdas,
Optional, Streams y Sockets
Uso de streams
Method reference static
En est e ej empl o se expl i car á como ut i l i zar met hod r ef er ence con un mét odo st at i c:
class StringUtils{
static boolean isUpperCase(Stringcad) {
return cad.toUpperCase().equals(cad);
Ut i l i zando pr ogr amaci ón i mper at i va:
public static void main(String []args) {
Listnames=
Arrays. asList
("Alex","Juan","Pedro","raidentrance","PANCHO");
names.stream().
filter(cad->StringUtils. isUpperCase (cad))
.forEach(System. out ::println);
Ut i l i zando st at i c met hod r ef er ence:
public static void main(String[]args) {
Listnames= Arrays. asList
("Alex","Juan","Pedro","raidentrance","PANCHO");
names.stream().
filter(StringUtils:: isUpperCase )
.forEach(System. out ::println);
Transformaciones utilizando
map
Puedes ut i l i zar map cuando desees t r ansf or mar de un obj et o a ot r o, por ej empl o, si obt i enes de una base de dat os un obj et o l l amado Per sona y l o qui er es t r ansf or mar a uno de t i po St r i ng puedes hacer l o si gui ent e: public static void main(String []args) { Listpersonas= Arrays. asList ( new Persona("Alex","Lopex")); Listnombres=personas.stream(). map(p->p.getNombre()). collect(Collectors. toList ()); for (String nombre:nombres) { System. out .println(nombre); } }
XXStream (range y
rangeClosed)
Puedes ut i l i zar 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 vos a cont i nuaci ón se pr esent a un ej empl o de f or ma i mper at i va y ut i l i zando pr ogr amaci ón f unci onal : I mper at i va
for ( int i= 0;i< 10;i++) {
System. out .print(i);
Funci onal IntStream. range (0, 10).forEach(System. out ::print);
Máximos y mínimos
A cont i nuaci ón se pr esent a una sol uci ón común par a obt ener el val or mí ni mo de una l i st a ut i l i zando pr ogr amaci ón i mper at i va:
public static void main(String []args) {
Listnumbers= Arrays. asList (7, 2, 3,
int min=numbers.get(0);
for (Integer value:numbers) {
if (value<min) {
min=value;
System. out .println(min);
A cont i nuaci ón se pr esent a l a sol uci ón equi val ent e ut i l i zando st r eams:
public static void main(String[]args) {
Listnumbers= Arrays. asList (7, 2, 3,
Integer minValue= numbers.stream().
min(Comparator. naturalOrder ()).get();
System. out .println(minValue);
Par a cal cul ar el val or mí ni mo sol o se r eempl azar á mi n por max en l a l í nea ant er i or.
Remover datos
duplicados
Remover dat os dupl i cados de una l i st a puede ser una t ar ea compl i cada, per o hacer l o con st r eams es muy si mpl e, a cont i nuaci ón dos f or mas si mpl es de hacer l o:
- Ut i l i zando di st i nct public static void main(String[] args) { List 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); }
- Ut i l i zando un set public static void main(String []args) { List numbers= Arrays. asList (7, 7, 7, 7, 2, 2, 2, 3, 3, 3, 3, 100, 100, 200, 200); Setnums= numbers.stream().collect(Collectors. toSet ()); System. out .println(nums); }
Uso de métodos static en
interfaces
A par t i r de l a ver si ón 8 de Java puedes col ocar mét odos st at i c en l as i nt er f aces como se muest r a a cont i nuaci ón:
interface Follower{
static String getName() {
return "raidentrance";
Los mét odos st at i c def i ni dos en l as i nt er f aces no pueden ser sobr eescr i t os.
Métodos default en las
interfaces
Ot r o cambi o i mpor t ant e al t r abaj ar con i nt er f aces es que ahor a puedes i ncl ui r mét odos con cuer po, a est os l os l l amar emos mét odos def aul t , a cont i nuaci ón un ej empl o:
interface Follower{
static String getName() {
return "raidentrance";
default void follow() {
System. out .println("Default follow impl");
El mét odo f ol l ow es un mét odo con una i mpl ement aci ón por def aul t , a di f er enci a del mét od get Name que es st at i c, el mét odo f ol l ow puede ser sobr eescr i t o si n nungún pr obl ema, consul t a l a i nt er f ace Compar at or par a ver una i nt er f az que hace uso de mét odos def aul t.
Method reference
Una f unci onal i dad i mpor t ant e que se agr egó en Java 8 es met hod r ef er ence y es ut i l i zada par a si mpl i f i car l a ej ecuci ón de un mét odo dent r o de un l ambda, est o puede ser de l os si gui ent es modos:
- Ref er enci as a mét odos st at i c
- Ref er enci as a mét odos de i nst anci a
- Ref er enci as a mét odos de una cl ase
- Ref er enci as a un const r uct or A cont i nuaci ón se pr esent an al gunos ej empl os.
Method reference por
méodo de instancia
En est e ej empl o se expl i car á como ut i l i zar met hod r ef er ence con un mét odo de i nst anci a: public static void main(String []args) { Listnames= Arrays. asList ("Alex","Juan","Pedro","raidentrance"); names.stream().forEach(System. out ::println); }
Method reference con
constructores
Es posi bl e ut i l i zar const r uct or es con met hod r ef er ence como se muest r a a cont i nuaci ón:
class Person {
private String name;
public Person(String name) {
this .name=name;
@Override
public String toString() {
return "Person [name="+name+"]";
names.stream().filter(StringUtils:: isUpperCase ).
map(Person:: new ).forEach(System. out ::println);
Ejercicios
Sección 3 Primeros pasos
- Real i za un pr ogr ama capaz de cal cul ar el ár ea de un cuadr ado, cí r cul o, r ect angul o y t r i angul o.
- Toma el ej er ci ci o ant er i or y combi er t el o en un pr ogr ama of uscado , un pr ogr ama of uscado es un pr ogr ama del cual no se ent i ende su f unci onal i dad a si mpl e vi st a, haz uso de l os conoci mi ent os que t i enes de i dent i f i cador es par a que sea al go di f í ci l de ent ender.
Sección 4 Control de flujo
- Real i za un pr ogr ama que i mpr i ma l as t abl as de mul t i pl i car del 1 al 20, debe exi st i r un espaci o ent r e una y ot r a par a i dent i f i car l as.
- Modi f i ca el pr ogr ama ant er i or par a que sol o se i mpr i man l as t abl as de mul t i pl i car de númer os par es, par a i dent i f i car si l os númer os son par es puedes ut i l i zar el oper ador módul o con 2 como se muest r a a cont i nuaci ón: int x= 2; if ( x % 2 == 0) { System. out .println("Es par"); }
- 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 1! = 1 El factorial de 0 es 1.
- Crea un progama que imprima las siguientes figuras en la pantalla:
Sección 5 Programación
orientada a objetos
- Real i za un di agr ama de cl ases que r epr esent e mascot as.
- Cr ea l as cl ases def i ni das en el ej er ci ci o ant er i or , cada una deber á t ener más de un const r uct or y el códi go que se ut i l i za par a i ni ci al i zar no se deber á r epet i r.
- Haz debuggi ng sobr e l as cl ases del ej er ci ci o ant er i or par a que anal i ces el paso a paso de l a ej ecuci ón.
Sección 6 Herencia
- Pl ant ea 5 escenar i os que hagan uso de her enci a, r ecuer da que deben pasar l a r egl a I S- A o ES- UN.
- Ut i l i za el di agr ama ant er i or y haz un pr ogr ama que l o r epr esent e. Cada cl ase debe t ener más de un const r uct or y t odo debe f unci onar cor r ect ament e, haz uso de l a pal abr a r eser vada super.
- Sobr eescr i be al menos uno de l os mét odos del ej er ci ci o ant er i or.
Sección 8 Encapsulamiento y
polimorfismo
- Cr ea l as cl ases necesar i as par a r epr esent ar a un aut omovi l , r ecuer da que debes apl i car l os concept os de pol i mor f i smo y encapsul ami ent o.
Sección 9 y 10 Temas generales
- Cr ear un ar r egl o de cada t i po de dat o bool ean, byt e, shor t , i nt , char , f l oat , l ong y doubl e.
- Cr ear un ar r egl o i r r egul ar en f or ma de t r i angul o.
- Cr ear un ar r egl o de t i po Mascot a y l l enar l o con obj et os de di f er ent es subt i pos
- Real i zar 2 ar r egl os bi di mensi onal es de l as mi smas di mensi ones y sumar l os.
Sección 11 Colecciones
- Cr ea una l i st a de mascot as modi f i cando el ej empl o r eal i zado en l a sesi ón ant er i or.
- Cr ea una i mpl ement aci ón pr opi a de una l i st a l i gada, t e r ecomendamos cr ear una cl ase Nodo que t enga como at r i but os una r ef er enci a al nodo si gui ent e y al ant er i or , debes sopor t ar l as oper aci ones agr egar el ement o, bor r ar y buscar.
- Cr ea una cl ase que admi ni st r e l os el ement os de una l i st a y t e per mi t a agr egar , bor r ar y buscar un el ement o. El úni co r equi si t o es que l a l i st a no per mi t a dat os dupl i cados.
- Cr ea una i mpl ement aci ón de al guna de l as col ecci ones par a est o debes cr ear una cl ase que i mpl ement e una de l as i nt er f aces Li st , Set , Map, Queue, et c.
Programación con Hilos
- Cr ea un pr ogr ama donde un hi l o haga una cuent a r egr esi va dado un númer o, el t i empo que debe esper ar el hi l o debe ser al eat or i o. I ni ci a 10 hi l os y r evi sa que hi l o t er mi no pr i mer o, asegur at e de col ocar l e un nombr e a cada uno de el l os.
- Modi f i ca el pr ogr ama ant er i or par a que t odos l os hi l os esper en el mi smo t i empo asi gnal e di f er ent es pr i or i dades a cada uno de el l os y l anza 30 hi l os, r evi sa si el cambi o de pr i or i dad gener ó al gún cambi o.
- Si mul a un pr ogr ama que haga t r ansacci ones bancar i as donde se t engan que l l evar a cabo l as si gui ent es oper aci ones al r et i r ar di ner o:
- Val i dar el mont o r eci bi do
- Consul t ar sal do en l a cuent a y val i dar si es suf i ci ent e par a r et i r ar el mont o
- Rest ar el mont o al sal do
- devol ver el mont o a qui en i nvoco el mét odo
- I mpr i mi r que se r eal i zó el r et i r o con exi t o Ej ecut a l as oper aci ones sobr e l a cuent a con var i os hi l os si n ut i l i zar si ncr oni zaci ón t e r ecomendamos hacer var i os r et i r os, después hazl o de nuevo con si ncr oni zaci ón.
- 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 son l os f umador es el l os necesi t an 3 cosas par a f umar , papel , t abaco y cer i l l os. A demás debes t ener 3 hi l os pr oduct or es cada uno pr oduci r á un mat er i al di f er ent e una vez que se encuent r en l os 3 mat er i al es not i f i ca a l os hi l os que pueden i r por sus mat er i al es par a f umar , si no hay mat er i al es l os hi l os f umandor es se deben i r a un est ado wai t i ng
Manejo de archivos y flujos
- Pr ogr ama el comando di r par a l i st ar l os ar chi vos en un di r ect or i o especi f i cado
- Pr ogr ama el comando cp par a copi ar un ar chi vo de un l ugar a ot r o
- Pr ogr ama el comando mv par a mover un ar chi vo de un l ugar a ot r o.
Sockets
- Cr ea un pr ogr ama que a t r avés de un socket enví e un mensaj e depende del mensaj e el ser vi dor i mpr i mi r á i ni ci ando, r ei ni ci ando o apagando.
- Cr ea un pr ogr ama donde el cl i ent e pueda envi ar un ar chi vo al ser vi dor
- Cr ea un pr ogr ama donde el cl i ent e pueda envi ar un obj et o l l amado HTTPRequest que cont enga l os si gui ent es at r i but os:
- Body St r i ng
- Header s Map<St r i ng, St r i ng> El ser vi dor deber á r esponder un mensaj e con l os si 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 sel ecci onar l a acci ón a r eal i zar t e r ecomendamos que sea al go si mpl e como l a suma de dos númer os.
Generales
- Cr ea un pr ogr ama que cor r a en un ser vi dor que t enga una l i st a de per sonas, el cl i ent e debe ser capaz de l eer l as per sonas, envi ar una per sona nueva y modi f i car sus dat os. Todo se debe hacer de f or ma r emot a a t r avés de socket s, si l o deseas puedes escr i bi r un comando sal i r que al ej ecut ar l o se t er mi ne el pr oceso del l ado del cl i ent e y del ser vi dor. Al t er mi nar el pr oceso del l ado del ser vi dor l a l i st a se debe guar dar en un ar chi vo como obj et os.
Java 9 - Modularidad
Produce / Consume
services
Los módul os pueden pr oduci r y consumi r ser vi ci os, más que sol o paquet es, un ser vi ci o es una i nt er f az que puede t ener múl t i pl es i mpl ement aci ones, a cont i nuaci ón al gunos punt os i mpor t ant es:
- pr ovi des wi t h especi f i ca que el módul o pr ovee una o más i mpl ement aci ones que pueden ser descubi er t as de f or ma di námi ca por el consumer. - uses especi f i ca una i nt er f az o cl ase abst r act a que se desea consumi r. A cont i nuaci ón un ej empl o: Ser vi ce package com.devs4j.service.auth; public interface UserAuthentication { public boolean authenticate(String username, String password); } module com.devs4j.service { exports com.devs4j.service.auth; } Pr ovi der module com.devs4j.provider { requires com.devs4j.service; provides com.devs4j.service.auth.UserAuthentication with UserDatabaseAuthenticator; } Appl i cat i on public class TestAuthenticationApplication { public static void main(String[] args) { ServiceLoader service = ServiceLoader.load(UserAuthentication. class ); UserAuthentication userAuthentication = service.findFirst().get(); boolean authenticated = userAuthentication.authenticate("raidentrance","udemy"); System.out.println(authenticated); } } module com.devs4j.application { requires com.devs4j.service; uses UserAuthentication; }
Probando reflection con
módulos
Es t i empo de combi nar l os dos ej empl os ant er i or es par a ent ender el f unci onami ent o de opens, par a est o se modi f i car án l os si gui ent es component es: Ser vi ce 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 obser var que se ui l i za expor t s por l o que el acceso a t r avés de r ef l ect i on ser á r est r i ngi do. Appl i cat i on public class TestAuthenticationApplication { public static void main(String []args) { ServiceLoaderservice= ServiceLoader. load (UserAuthentication. class ); UserAuthenticationuserAuthentication= service.findFirst().get(); boolean authenticated= userAuthentication. authenticate("raidentrance","udemy"); System. out .println(authenticated); } } Se puede obser var que se ui l i za expor t s por l o que el acceso a t r avés de r ef l ect i on ser á r est r i ngi do. Al ej ecut ar el códi go ant er i or obt endr emos l a si gui ent e excepci ón: Except i on i n t hr ead " mai n" j ava. l ang. r ef l ect. I naccessi bl eObj ect Except i on: Unabl e com. devs4j. r ef l ect i on. app. Appl i cat i onSer vi ce( ) t o make accessi bl e: modul e com. devs4j. ser vi ce does not " opens com. devs4j. appl i cat i on com. devs4j. r ef l ect i on. app" t o modul e Par a per mi t i r el acceso a t r avés de r ef l ect i on debemos modi f i car l a def i ni ci ón del módul o en ser vi ce como se muest r a a cont i nuaci ón: module com.devs4j.service { exports com.devs4j.service.auth; opens com.devs4j.reflection.app; } Una vez r eal i zado el cambi o l a ej ecuci ón del mét odo debe ser cor r ect a
Reflection
Ref l ect i on es un api que t e per mi t e t r abaj ar con cl ases, obj et os, mét odos y ot r os component es del l enguaj e como cl ases que podemos mani pul ar a cont i nuaci ón un ej empl o: package com.devs4j.reflection.service; class ApplicationService { void sayHello() { System. out .println("Hello"); } } package com.devs4j.reflection.user; import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class TestApplicationService { public static void main(String []args) throws Exception { Class<?>classObject= Class. forName ("com.devs4j.reflection.service.ApplicationService"); Constructor<?>constructor= classObject.getDeclaredConstructor(); constructor.setAccessible( true ); Object instance=constructor.newInstance(); Method[]methods=classObject.getDeclaredMethods(); for (Methodmethod:methods) { System. out .printf("Method %s, is accessible \n",method.getName(),method.canAccess(instance)); if (method.getName().equals("sayHello")) { method.setAccessible( true ); method.invoke(instance); } } } } Como se puede ver Appl i cat i onSer vi ce t i ene un ni vel de acceso def aul t , est o evi t a que puedas ut i l i zar l a f uer a del paquet e com.devs4j.reflection.service si n embar go haci endo uso de r ef l ect i on podemos t ener acceso si n i mpor t ar si l a cl ase se encuent r a f uer a del paquet e. Application Service Provider uses require requires provides
Open
Los módul os pueden per mi t i r acceso a t r avés de r ef l ect i on ut i l i zando open.
- opens i ndi ca que se per mi t i r á acceso a t r avés de r ef l ect i on - opens t o r est r i nge l a aper t ur a de l os paquet es a al gún modul o en especí f i co. Opens f unci ona i gual que expor t con l a di f er enci a que per mi t e acceso a l os t i pos no públ i cos a t r avés de r ef l ect i on.
Java 9
Try with resources
Tr y wi t h r esour ces apar eci ó en l a ver si ón 7 de j ava con l a si gui ent e est r uct ur a: try (InputStreamReader isr= new InputStreamReader(System. in );){ } A par t i r de l a ver si ón 9 de Java podr emos r eal i zar l as decl ar aci ones f uer a del t r y como se muest r a a cont i nuaci ón: InputStreamReader isr = new InputStreamReader(System. in ); try (isr) { }
Commands
Puedes ut i l i zar comandos par a cont r ol ar el ambi ent e y most r ar i nf or maci ón a cont i nuaci ón al gunos ej empl os:
jshell> /vars
| int x = 45
| int $3 = 4
| String $5 = "OceanOcean"
jshell> /methods
| twice (String)String
jshell> /list
1 : System.out.println("Hi");
2 : int x = 45; 3 : 2 + 2
4 : String twice(String s) {return s + s;}
5 : twice("Ocean")
Puedes escribir / y utilizar tab para obtener los
comandos disponibles.
Puedes utilizar abreviaciones como /l, /se fe v (set
feedback verbose)
Cuando utilizar JShell
Puedes ut i l i zar JShel l par a escr i bi r el ement os una vez e i nmedi at ament e obt ener r esul t ados.
Extensión al operador
diamante
En Java 7 se agr egó el sopor t e par a ut i l i zar el oper ador di amant e como se muest r a a cont i nuaci ón: Listlist= new ArrayList<>(); Una de l as r est r i cci ones que se t ení a es que el oper ador di amant e no se podí a apl i car a cl ases anóni mas y se debí a hacer del si gui ent e modo: interface Foo{} public static void main(String []args) { Foofoo= new Foo() { }; } A par t i r de Java 9 ya puedes ut i l i zar el oper ador di amant e con cl ases abst r act as como se muest r a a cot i nuaci ón: interface Foo { } public static void main(String []args) { Foo foo= new Foo<>() { }; }
Métodos privados en
interfaces
A par t i r de l a ver si ón Java 9 puedes def i ni r mét odos pr i vados con el f i n de que sean ut i l i zados por l os mét odos def aul t , como se muest r a a cont i nuaci ón: interface Bar { private void foo() { } private static void foo2() { } default void foo3() { foo(); foo2 (); } } Es i mpor t ant e menci onar que l os mét odos abst r act os deben segui r si endo publ i c.
JShell
JShel l ( Java Shel l ) es una her r ami ent a i nt er act i va par a el apr endi zaj e del l enguaj e j ava, se ut i l i za par a eval uar decl ar aci ones, sent enci as y expr esi ones, est as i nmedi at ament e most r ar án l os r esul t ados.
Configuración
Par a poder ej ecut ar el comando j shel l y ut i l i zar l o debes i nst al ar el JDK de j ava y agr egar a l as var i abl es de ent or no j ava- home/ j dk- 9/ bi n. Una vez que se conf i gur a l a var i abl e de ent or no puedes ej ecut ar el comando j shel l como se muest r a a cont i nuaci ón:
% jshell
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell>
Para salir de jshell utiliza el comando /exit como se
muestra a continuación:
jshell> /exit
| Goodbye
Snippets
Jshel l acept a sent enci as j ava; var i abl es, mét odos, cl ases, i mpor t s y expr esi ones. Est as pi ezas de códi go son conoci das como sni ppet s. Decl ar aci ón de var i abl es
jshell> int x = 45
x ==> 45
| created variable x : int
Evaluación de expresiones
jshell> 2 + 2
| created scratch variable $3 : int
jshell> String twice(String s) {
...> return s + s;
| created method twice (String)
jshell> twice("Ocean")
$5 ==> "OceanOcean"
| created scratch variable $5 : String
Cambiando la definición
jshell> String twice(String s) {
...> return "Twice:" + s;
| modified method twice (String)
jshell> twice("thing")
$7 ==> "Twice:thing"
| created scratch variable $7 : String
Feedback
Puedes ut i l i zar el f eedback mode par a det er mi nar l as r espuest as y ot r as i nt er acci ones con j shel l. Los f eedbacks di sponi bl es son:
- ver bose
- nor mal
- conci se
- si l ent Par a cambi ar el t i po de f eedback ut i l i za el si gui ent e comando: / set f eedback ver bose Pr ueba l os di f er ent es t i pos de f eedback par a ver l os di f er ent es t i pos de i nt er acci ón que puedes t ener.
Scripting
Puedes escr i bi r scr i pt s en ar chi vos con ext ensi ón_. j sh_ , pueden ser gener ados como sal i das de l as ent r adas del shel l como se muest r a a cont i nuaci ón:
jshell> /save mysnippets.jsh
jshell> /save -history myhistory.jsh
jshell> /save -start mystartup.jsh
Puedes ejecutarlos como se muestra a
continuación:
% jshell mysnippets.jsh
Para cargar un script puedes utilizar /open como
se muestra a continuación:
jshell> /open PRINTING