SlideShare una empresa de Scribd logo
1 de 86
FUNDAMENTOS DE JAVA
15 consejos prácticos sobre Java que cambiarán la forma en que codificas
Tech Day ITLA Santiago RD 2018
24 Noviembre 2018,Instituto Tecnológico de Las Américas, Santiago, R. D.
#ITLATechDay2018 #EncuentrosUniversitariosJava2018
Eudris Cabrera
@eudriscabrera
Eudris Cabrera
Graduado de Ingeniería Telemática en la PUCMM.
Entusiasta de la tecnología y el software libre,
desarrollador Java, instructor ocasional (Java / Linux),
aficionado del béisbol/sóftbol y los bailes latinos.
En el tiempo libre, escribe artículos, realiza charlas,
participa en eventos tecnológicos y ayuda en la
revisión de documentación técnica en el mundo Java y
el código abierto.
AGENDA
● 15 consejos prácticos sobre características
fundamentales que todo programador Java debe
tener en cuenta.
● Conocer técnicas y mejores prácticas para producir
software con menos bug en Java.
● Extras
Conocer los tipos de datos y
sus valores por defecto
1
Tipos
Primitivos
(sin métodos; no son
objetos; no necesitan
una invocación para
ser creados)
Nombre Tipo
Espacio
Memoria
Rango
Aproximado
Valor por
defecto
Clase
Asociada
byte Entero 1 byte -128 a 127 0 Byte
short Entero 2 bytes -32768 a
32767
0 Short
int Entero 4 bytes 2*109 0 Integer
long Entero 8 bytes Muy grande 0L Long
float Decimal simple 4 bytes Muy grande 0.0f Float
double Decimal doble 8 bytes Muy grande 0.0d Double
char Carácter simple 2 bytes 'u0000' Character
boolean Valor true o
false
1 byte false Boolean
void Void
Tipos
Objeto
(con métodos, necesitan
una invocación para ser
creados)
Nombre Tipo
Tipos de la biblioteca estándar
de Java
String (cadenas de texto)
Muchos otros (p.ej. Scanner, TreeSet, ArrayList…)
Tipos definidos por el
programador / usuario
Cualquiera tipo que se nos ocurra
arrays Serie de elementos o formación tipo vector o matriz.
Lo consideraremos un objeto especial que carece
de métodos.
Tipos envoltorio o wrapper
(Equivalentes a los tipos
primitivos pero como objetos.)
Byte
Short
Integer
Long
Float
Double
Character
Boolean
Conocer los paquetes más utilizados
2
Paquetes de Propósito General
java.lang
Contiene clases fundamentales e interfaces fuertemente relacionadas con el lenguaje y el sistema runtime.
java.io
Las clases centrales del paquete son InputStream y OutputStream, las cuales son clases abstractas, base para leer y
escribir a streams de bytes, respectivamente.
java.nio
El paquete java.nio (NIO o Nueva I/O) fue añadido para soportar I/O mapeada en memoria, facilitando las
operaciones I/O cercanas al hardware subyacente con mejor rendimiento.
Java.text
El paquete java.text proporciona clases e interfaces para el manejo de texto, fechas, números y mensajes de una
manera independiente de los lenguajes naturales.
Paquetes de Propósito General
java.math
Soporta aritmética multi precisión (incluyendo operaciones aritméticas modulares) y suministra generadores de números
primos multi precisión usados para la generación de claves criptográficas.
java.util
En el paquete está incluida la API Collections, una jerarquía organizada de estructura de datos influenciada fuertemente por
consideraciones de patrones de diseño.
java.net
El paquete java.net suminista rutinas especiales IO para redes, permitiendo las peticiones HTTP, así como también otras
transacciones comunes.
Paquetes de Propósito Especial
java.sql
Una implementación de la API JDBC (usada para acceder a bases de datos SQL) se agrupa en el paquete java.sql.
java.time
La API principal de fechas, horas, instantes, y duraciones.
Manejar las cadenas de
caracteres de forma correcta
3
Clase String
Se utiliza para manejar cadena de texto.
Algunos consejos a la hora de manejar cadena de texto
● Evitar concatenar usando el signo de más (+), usar el método concat o join para tales fines.
● Utilizar el método format(String format, Object... args)
● Para cadenas grandes de caracteres usar StringBuilder
Concatenar cadena de caracteres
Método String concat(String str)
name.concat(" - " ).concat(String.valueOf(age));
Método format(String format, Object... args)
Logger.getLogger("Demo").log(Level.WARNING, String.format("Hubo un error :%s", ex.getMessage()));
Método String join(CharSequence delimiter, CharSequence... elements)
String.join("-", teamId,name);
Clase StringBuilder
Util para manejar grandes cadenas de texto
● Es considerable tomar en cuenta el valor por defecto cuando creamos una instancia de este tipo
● Si la cadena es muy grande inicializar el constructor con un valor alto
● Evitar concatenar usando el signo de más (+), utilice el método append()
Clase StringBuilder
@Override
public String toString() {
return new StringBuilder()
.append("id").append(teamId)
.append("name").append(name)
.append("hasWonWoldSeries").append(hasWonWoldSeries)
.append("lastTimeWonWorldSeries").append(lastTimeWonWorldSeries)
.toString();
}
Clase StringBuilder
StringBuilder sb = new StringBuilder(150);
map.forEach((String k, Integer v) -> {
sb.append(String.format("%s%s", k,v));
});
Usar clases y tipos genéricos
4
Antes de Tipo Genéricos
List lista = new ArrayList();
lista.add("Hola Mundo");
lista.add(new Integer(5));
String cadenaTexo = (String) lista.get(0);
int entero = (int) lista.get(1);
Cuales
inconvenientes
presenta este
pedazo de código ?
Tipos Genéricos
List<String> lenguajesJVM = new ArrayList<String>();
lenguajesJVM.add("Java");
lenguajesJVM.add("Groovy");
lenguajesJVM.add("Scala");
lenguajesJVM.add("Kotlin");
for (String lenguaje : lenguajesJVM) {
System.out.println(lenguaje);
}
Los tipos genéricos agregan estabilidad a su código
al hacer que se detecten más errores en el
momento de la compilación.
Con las características de tipos genéricos, puede
configurar el tipo de colección para limitar qué tipo
de objetos se pueden insertar en la colección.
Clases Genéricas
Las clases genéricos permiten usar tipos para parametrizar las clases, interfaces y métodos al definirlas. Los
beneficios son:
● Comprobación de tipos más fuerte en tiempo de compilación.
● Eliminación de casts aumentando la legibilidad del código.
● Posibilidad de implementar algoritmos genéricos, con tipado seguro.
● Una clase genérica puede tener múltiples argumentos de tipos y los argumentos pueden ser a su vez
tipos genéricos. Después del nombre de la clase se puede indicar la lista de parámetros de tipos con
el formato <T1, T2, T3, …>
Clases Genéricas
public class ClaseGenerica<T> {
private T t;
public ClaseGenerica(T o) {
this.t = o;
}
public void classType() {
System.out.println("El tipo de T es " .concat(t.getClass().getName()));
}
}
// Creamos una instancia de ClaseGenerica para Integer.
ClaseGenerica<Integer> intObj = new ClaseGenerica<Integer>(88);
intObj.classType();
// Creamos una instancia de ClaseGenerica para Team.
ClaseGenerica<Team> strTeam = new ClaseGenerica<Team>(new Team());
strObj.classType();
Clases Genéricas
Existen una serie de convenciones para nombrar a los genéricos:
● E – Element (usado bastante por Java Collections Framework)
● K – Key (Llave, usado en mapas)
● N – Number (para números)
● T – Type (Representa un tipo, es decir, una clase)
● V – Value (representa el valor, también se usa en mapas)
● S,U,V etc. – usado para representar otros tipos.
Usar tipos enumerados (enum)
5
Enums
Un dato de un tipo enumerado es aquel que puede tomar por valor uno de los pertenecientes a una lista
ordenada de valores definida por el programador.
Ejemplo:
public enum Genero {
MASCULINO, FEMENINO;
}
Enums
Las enumeraciones son listas de constantes. Cuando necesite una lista predefinida de valores que
representan algún tipo de datos numéricos o textuales, debe usar una enumeración.
Siempre debe usar enumeraciones cuando una variable (especialmente un parámetro de método) solo
puede tomar una de un pequeño conjunto de valores posibles.
Enum con constructor
public enum ESTADO {
CREADO("Creado"), PENDIENTE_APROVACION("Pendiente de Aprobacion"), APROBADO("Aprobado");
private String descripcion;
private ESTADO(String descripcion) {
this.descripcion = descripcion;
}
public String getDescripcion() {
return descripcion;
}
public String getId() {
return name();
}
}
Comprender el uso y manejo
de excepciones
6
Excepción
Es una condición anormal que
interrumpe el flujo normal de un
programa.
Tipos de Excepciones
Excepciones comprobadas (Checked exceptions)
Indica un problema esperado que puede ocurrir durante la operación normal del sistema. Estas excepciones
deben ser declaradas en la cláusula throws de un método. Extienden de la clase Excepción.
Excepciones no comprobadas (Unchecked exceptions)
Estas son excepciones que no necesitan ser declaradas en una cláusula throws. JVM simplemente no lo
obliga a manejarlos, ya que se generan principalmente en tiempo de ejecución debido a errores
programáticos. Extienden de la clase RuntimeException.
Ejemplo: NullPointerException, IndexOutOfBoundsException, etc.
Tipos de Excepciones
Errores (Errors)
Son problemas graves en el entorno de ejecución que casi con seguridad no son recuperables.
Algunos ejemplos son OutOfMemoryError, LinkageError y StackOverflowError. Por lo general, bloquean su
programa o parte del programa.
Solo una buena práctica de logging le ayudará a determinar las causas exactas de los errores.
Manejo de Excepciones
● Gestionar correctamente todas o la mayor parte de los errores que se pueden producir.
● Evitar mostrar al usuario los mismos mensajes generados por las excepciones, en su lugar colocar
mensajes personalizados que el usuario final pueda entender sin problemas.
● Crear clases personalizadas para manejar nuestras excepciones.
● Evitar escribir en la consola usando printStackTrace(), en su lugar usar un Logger
● Usar multiples catch de excepciones
Excepción personalizada
Ejemplo:
public class ExcepcionJdbcMySQL extends Exception {
private static final long serialVersionUID = 1L;
public ExcepcionJdbcMySQL(String message) {
super(message);
}
......
}
public class PruebaExcepcion {
public void excepcion1() throws ExcepcionJdbcMySQL {
throw new ExcepcionJdbcMySQL("Hubo un error");
}
.....
}
Manejar los logs de forma
más inteligente
7
Logging
Logging es el proceso de escribir mensajes durante la ejecución de un programa en un lugar central.
Los logs permiten informar y persistir los mensajes de error y advertencia, así como los mensajes de
información (por ejemplo, estadísticas de tiempo de ejecución) para que los mensajes puedan recuperarse y
analizarse más adelante.
Java Logging API
Podemos usar el framework de logging de Java para:
- Escribir mensajes a la consola
- Escribir mensajes en un archivo
Logger.getLogger("Demo").log(Level.WARNING, ex.getMessage());
Logger.getLogger(ConeccionDB.class.getName()).log(Level.SEVERE, null, ex);
La forma en que opera es la siguiente:
- Creamos un objeto estático de tipo Logger desde el cual enviaremos los mensajes.
● Creamos un objeto ConsoleHandler y se lo agregamos al Logger, de modo que los mensajes
aparezcan automáticamente en la consola.
● Creamos un objeto FileHandler y se lo agregamos al Logger, este Handler en particular enviara los
mensajes al archivo que le indiquemos.
● Creamos un objeto SimpleFormatter y lo establecemos en el FileHandler, de este modo los logs se
escriban como texto plano simple, de no indicarlo se escribiran en formato XML por defecto.
- Para registrar algo en bitácora llamamos al método log del Logger indicamos el nivel del log y el mensaje
que deseamos registrar, esto automáticamente reportara la fecha, hora, el nombre completo de la clase
y el método y en el caso de mensajes de nivel grave la linea de código donde se genero el reporte
Niveles de Log
Podemos indicar el nivel de información que queremos guardar o mostrar en la consola usando los diferentes
niveles. En orden descendente
SEVERE (más alto nivel)
WARNING
INFO
CONFIG
FINE
FINER
FINEST (más bajo nivel)
Java Logging API
private final static Logger LOGGER = Logger.getLogger(DemoLogger.class.getName());
public void loggerAll() {
LOGGER.log(Level.ALL, "Todos los niveles");
}
public void loggerInfo() {
LOGGER.log(Level.INFO, "Nivel Informativo");
}
public void loggerWarning() {
LOGGER.log(Level.WARNING, "Nivel advertencia");
}
public void loggerError() {
LOGGER.log(Level.SEVERE, "Nivel ERROR");
}
Manejo correcto de recursos
8
Uso de try-with-resources
Cuando estamos trabajando con archivos, conexiones a base de datos, socket, etc., debemos manejar
correctamente los recursos correspondientes a cada uno de estos casos, esto es, cerrar cada recursos luego
de su uso para evitar problemas posteriores, como anidamientos de conexiones.
A partir de Java SE 7 se introdujo una forma sencilla de manejar los recursos try-with-resources.
Uso de try-with-resources
try (Connection con = ConeccionDB.getInstancia().getConeccion()) {
try (PreparedStatement stmt = con.prepareStatement(sqlSelect)) {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
}
}
}
} catch (SQLException ex) {
Logger.getLogger(DemoRecursos.class.getName()).log(Level.SEVERE, ex.getMessage());
throw new ExcepcionJdbcMySQL("No pudo encontrar registros");
}
Usando el try de esa forma nos aseguramos de que el recurso quede cerrado luego de su uso.
Esto es posible a que las clases anteriores implementa la interfaz Closable.
Se podrá utilizar try-with-resources siempre que implementen la interfaz Closable.
Aprender cómo y por qué
usar Expresiones Lambdas
9
Tenemos una lista del tipo del tipo Team y sobre ella queremos realizar
algunas operaciones cumpliendo ciertos criterios.
public void
printTeamsHasNotWonWorldSeries(List<Team> teams){
for (Team team : teams) {
if(!team.isHasWonWoldSeries()){
System.out.println(""+ team.toString());
}
}
}
Ejemplo
public void printTeamsWithPredicate(List<Team> teams, Predicate<Team>
tester){
for (Team t : teams) {
if(tester.test(t)){
System.out.println(""+ t.toString());
}
}
}
Predicate<Team> hasNotWonWS = new Predicate<Team>() {
@Override
public boolean test(Team t) {
return !t.isHasWonWoldSeries();
}
};
printTeamsWithPredicate(teams, hasNotWonWS);
¿Cuál es el inconveniente de
esta solución?
Las clases anónimas reduce la cantidad
de clases creadas y el paso de
comportamiento como parámetro se
mantiene, pero aún se puede detectar
mucho código repetido.
Solución usando clases anónimas
En nuestro ejemplo anterior, podemos utilizar una expresión lambda en
lugar de una clase anónima.
Ejemplo básico usando expresiones lambdas.
printTeamsWithPredicate(teams, (Team t) -> !t.isHasWonWoldSeries());
Nota:
Puede parecer bastante confuso en un
principio, pero ya revisaremos los
conceptos y cambios en el lenguaje que
nos permitirán escribir código Java de
esa manera.
Expresiones lambdas
Una expresión lambda representa una
función anónima.
λx → x+x
Función anónima que toma un número x y devuelve el resultado x + x.
Una expresión lambda se compone de un conjunto de
parámetros, un operador lambda ( -> ) y un cuerpo de la
función.
Sintaxis
() -> System.out.println("Hello Lambda")
x -> x + 10
(int x, int y) -> { return x + y; }
(String x, String y) -> x.length() – y.length()
(int a, int b) -> a + b
(int a) -> a + 1
(int a, int b) -> {
System.out.println(a + b);
return a + b;
}
() -> new ArrayList();
https://github.com/ecabrerar/java-8-mas-alla-de-las-expresiones-lambda
Código fuente de los ejemplos en GitHub
Explorar cómo las operaciones agregadas, el API
Stream y las expresiones Lambda
funcionan en conjunto para proporcionar potentes
capacidades de filtrado.
10
API Stream
Stream:
● Representa una abstracción para
especificar cálculos agregados
(acumulativos).
● Simplifica la descripción de los cálculos
agregados (laziness,paralelismo).
Elementos de un Stream
Un Stream se compone de 3 elementos:
● Un origen
● Cero o más operaciones intermedias
● Una operación final (salida o un resultado)
Ejemplo
long totalEquipos = teams.stream()
.filter(t -> t.isHasWonWoldSeries())
.mapToInt(Team::getLastTimeWonWorldSeries)
.count();
Source
Intermediate
operations
Terminal
operation
Ejemplo
Procesar la siguiente lista para que solamente contenga cadena de caracteres impares y en letra minúscula.
List<String> list = Arrays.asList("BarCamp", "MongoDB", "10Gen", "TokuMX", "Nagios", "PUCMM", "Ruby", "JSON", "JSON");
Solución usando clase anónima
List<String> newList = list
.stream()
.filter(new Predicate<String>() {
@Override
public boolean test(String t) {
return (t.length() % 2)==1;
}
}).map(String::toLowerCase)
.collect(Collectors.toList());
Solución usando expresiones lambdas
List<String> newList = list
.stream()
.filter(s -> (s.length() % 2)==1)
.map(String::toLowerCase)
.collect(Collectors.toList());
Entender, aceptar y aprovechar Optional de Java 8
para tratar los nulos de forma más simple y menos
propensos a errores
11
Clase Optional
Ayuda a eliminar los problemas de NullPointerException
Optional<T>
Contenedor para una referencia de objet (nulo, o objeto real).
Piensa en Optional como un stream 0 ó 1 elemento.
Garantiza que la referencia de Optional no retornará nulo.
Ejemplo
Usando Optional con Stream
Optional<String> val = Stream.of("one", "two").findAny();
Optional<String> val = Stream.of("one", "two").findFirst();
Optional<Team> opt = teams.stream().findFirst();
Otros métodos útiles en la clase Optional
opt.isPresent(); //true
Optional<Team> opt = Optional.empty();
opt.orElse(new Team("TOR", "Toronto Blue Jays", true, 1992)).isHasWonWoldSeries();
Adoptar el nuevo API de
Fecha y Tiempo
12
Date Time API JSR 310
Nuevo API de fecha/tiempo en java
Date Time API
El Date and Time API se desarrolló como parte del Java Community Process (JCP) dirigido por Stephen
Colebourne (autor de Joda-Time) y Oracle, bajo JSR 310.
El paquete java.time es el núcleo de la API y utiliza el sistema de calendario definido en ISO-8601
(https://www.iso.org/iso-8601-date-and-time-format.html ) como el calendario predeterminado.
El calendario ISO se basa en el sistema de calendario gregoriano y es el estándar internacional para
representar fecha y hora.
Para soportar las necesidades de los desarrolladores que utilizan sistemas de calendario no ISO, en
algunas áreas del mundo, como Japón o Tailandia, el nuevo API de Tiempo y Fecha permite trabajar con
diferentes sistemas de calendario.
java.time
LocalDate : Fecha más fácil de interpretar.
LocalDate date = LocalDate.now();
System.out.printf("%s-%s-%s", date.getYear(), date.getMonthValue(), date.getDayOfMonth());
LocalDateTime: Maneja fecha y hora sin especificar la zona horaria
LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zdateTime = ZonedDateTime.now(); //fecha y hora con zona horaria
Zona Horaria
ZoneId zone = ZoneId.systemDefault();
Clock clockDefault = Clock.systemDefaultZone();
ZoneId zoneAmerica = ZoneId.of("America/Santo_Domingo");
Clock clock = Clock.system(zoneAmerica);
java.time
Haciendo cálculo de fechas
LocalDate sinceJava8Launch = LocalDate.of(2014, Month.MARCH, 18);
LocalDate today = LocalDate.now();
today.isAfter(sinceJava8Launch); //true
Calcular diferencia entre dos fecha usando period
LocalDate sinceBarCamp2013 = LocalDate.of(2013, Month.NOVEMBER, 16);
LocalDate currentDate = LocalDate.of(2015, Month.NOVEMBER, 28);
Period betweenDates = Period.between(sinceBarCamp2013, currentDate);
int diffInDays = betweenDates.getDays();
int diffInMonths = betweenDates.getMonths();
int diffInYears = betweenDates.getYears();
TemporalQuery
Determinar si una fecha es festiva
usando TemporalQuery
LocalDate date = LocalDate.of(2016,
Month.JANUARY, 26);
Boolean isHoliday = date.query(new
DiasFestivosRD());
public class DiasFestivosRD implements TemporalQuery<Boolean>{
static List<MonthDay> DIAS_FESTIVOS = Lists.newArrayList(
MonthDay.of(Month.JANUARY, 1), // Año Nuevo
MonthDay.of(Month.JANUARY, 6), // Día Santos Reyes
MonthDay.of(Month.JANUARY, 21), // Día de la Altagracia
MonthDay.of(Month.JANUARY, 26), // Día del Natalicio de
Duarte
MonthDay.of(Month.FEBRUARY, 27), // Día Independencia
Nacional
MonthDay.of(Month.MAY, 1), //Día Trabajador
MonthDay.of(Month.AUGUST, 16), //Día Restauración
MonthDay.of(Month.SEPTEMBER, 24), //Día de las Mercedes
MonthDay.of(Month.NOVEMBER, 6), //Día Constitución
MonthDay.of(Month.DECEMBER, 25) //Día de Navidad
);
@Override
public Boolean queryFrom(TemporalAccessor date) {
MonthDay diaMesActual = MonthDay.from(date);
return DIAS_FESTIVOS.contains(diaMesActual);
}
}
TemporalQuery
Determinar si una fecha es esta dentro de la temporada ciclónica
LocalDate date = LocalDate.of(2017, Month.JUNE, 30);
Boolean esTemporadaCiclonica = date.query(new TemporadaCiclonica());
public class TemporadaCiclonica implements TemporalQuery<Boolean>{
@Override
public Boolean queryFrom(TemporalAccessor temporal) {
LocalDate fecha = LocalDate.from(temporal);
MonthDay primeroJulio = MonthDay.of(Month.JUNE.getValue(), 1);
MonthDay trentaNoviembre = MonthDay.of(Month.NOVEMBER.getValue(), 30);
return fecha.isAfter(primeroJulio.atYear(fecha.getYear())) &&
fecha.isBefore(trentaNoviembre.atYear(fecha.getYear()));
}
}
Usar Varargs
13
Varargs en Java
Introducido en Java 5 y su objetivo es proporcionar una vía corta para los métodos que admiten un número
arbitrario de parámetros de un tipo.
Los varargs nos ayudan a evitar escribir un código repetitivo al introducir la nueva sintaxis que puede
manejar una cantidad arbitraria de parámetros automáticamente, usando una arreglo detrás de escenario.
public static void main(String... s) {}
Restrinciones:
Cada método solo puede tener un parámetro varargs.
El argumento varargs debe ser el último parámetro.
Utilizar Paths y Files
14
Clase Path
Forma parte de paquete java.nio y provee una forma fácil para trabajar con rutas. Es común usarla en
conjunto con la clase Files.
Ejemplo:
try (BufferedReader reader = Files.newBufferedReader(Paths.get("SonnetI.txt"), StandardCharsets.UTF_8)) {
long totalLines = reader.lines().count();
System.out.println("Number of lines = " + totalLines);
} catch (IOException ex) {
Logger.getLogger(DemoRecursos.class.getName()).log(Level.SEVERE, ex.getMessage());
}
Clase Path
A partir de JDK8 se agregó el método lines () dentro de la clase Files.
Devuelve un Stream de elementos de cadena.
Modularización con Jigsaw
15
Sistema Modular :
Proyecto Jigsaw
Principal novedad en Java 9.
La idea de un sistema modular es hacer el jdk más
ligero para dispositivos pequeños.
El sistema de módulos proporcionará a la aplicación
la capacidad de utilizar sólo los módulos del jdk que
sean necesarios.
Las aplicaciones ya no necesitarán el jdk completo. El
sistema de módulos encapsula las clases públicas
dentro de un módulo. Así que clase definida pública no
estaría disponible para el mundo entero hasta que un
módulo lo defina explícitamente.
Sistema Modular - Proyecto Jigsaw
Los módulos van a ser descritos en un archivo llamado module-info.java ubicado en la
parte superior de la jerarquía de código java.
El archivo module-info provee:
1. Nombre del módulo.
2. Lista de dependencias de módulos necesarias para la correcta compilación y
ejecución.
3. Información sobre paquetes exportados por este módulo.
4. Lista de servicios que proporciona el módulo en tiempo de ejecución.
Sistema Modular - Proyecto Jigsaw
Sistema Modular - Proyecto Jigsaw
com.example.samplemodule : es el nombre del módulo.
requires : Indica que son dependencia del módulo
exports : Todas las clases públicas en estos paquetes serán accesibles a otros módulos
que dependen de él.
uses : Para usar datos de otros módulos.
provides : Proporciona configuración al servicio de otro módulo
Demo
Vamos a explorar varios ejemplos.
https://github.com/ecabrerar/java9-
labs/tree/master/jigsaw
Puntos Extra (Bonus)
Herramientas para analizar tu código
Las herramientas de análisis estático de código se utilizan para cuidar la calidad del código y evitar la
deuda técnica.
1. PMD
Detecta cosas como código duplicado, código muerto (variables, parámetros o métodos sin usar),
complejidad de métodos (if innecesarios, etc.)
1. Findbugs
Identificar cientos de tipos de errores potenciales. Opera a nivel de bytecode en lugar de código fuente
1. Check Style
Se utiliza para comprobar que el código analizado cumple con una serie de reglas de estilo.
Leer código
Intentar comprender cosas de proyectos más avanzados, descubrir la organización(flujo), siempre te
ayudará a crecer como desarrollador.
1. Estudiar código de otros programadores y/o proyectos.
2. Leer código de proyectos de código abierto.
3. Leer código del JDK o de tu IDE favorito.
4. Leer código que tiene que ver con tu proyecto(Librerías, frameworks,etc)
Participar en comunidades de desarolladores
1. Socializar con otros desarrolladores.
2. Conocer un mentor.
3. Ser mentor de alguien.
4. Dar una charla en un evento relacionado con la comunidad.
5. Resolver incidencias en proyecto open source.
¿Preguntas?
¡Gracias
P o r
Acompañarnos!
https://github.com/ecabrerar/java-fundamentos-tips.git
Código fuente de los ejemplos en GitHub
Asuntos Legales
Todas las marcas registradas, así como todos los logotipos, imágenes,
fotografías, audio y vídeos mostrados en esta presentación son propiedad de
sus respectivos propietarios y/o representantes.
Su utilización es solamente para fines ilustrativos.
Referencias
Enlaces:
https://blogs.oracle.com/darcy/more-concise-try-with-resources-statements-in-jdk-9
https://www.pluralsight.com/blog/software-development/java-9-new-features
https://www.pluralsight.com/blog/software-development/java-9-impact
http://www.baeldung.com/java-9-stream-api
https://www.codacy.com/blog/review-of-java-static-analysis-tools/
http://www.vogella.com/tutorials/Logging/article.html
https://www.baeldung.com/java-logging-intro
https://howtodoinjava.com/best-practices/java-exception-handling-best-practices/
@eudriscabrera
@eudris
@ecabrerar
@eudriscabrera
Eudris Cabrera Rodríguez
Ingeniero Telemático
Desarrollador de Software / Consultor Informático
eudris@gmail.com
https://www.linkedin.com/in/eudriscabrera
http://www.slideshare.net/eudris
https://twitter.com/eudriscabrera
https://github.com/ecabrerar

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Semana 6 Módulos Clases y Objetos
Semana 6   Módulos Clases y ObjetosSemana 6   Módulos Clases y Objetos
Semana 6 Módulos Clases y Objetos
 
Curso Java Inicial 7 Excepciones
Curso Java Inicial   7 ExcepcionesCurso Java Inicial   7 Excepciones
Curso Java Inicial 7 Excepciones
 
Jyoc java-cap05 metodos (funciones)
Jyoc java-cap05 metodos (funciones)Jyoc java-cap05 metodos (funciones)
Jyoc java-cap05 metodos (funciones)
 
Introducción a java
Introducción a javaIntroducción a java
Introducción a java
 
Java exceptions
Java exceptionsJava exceptions
Java exceptions
 
Exceptions (2)
Exceptions (2)Exceptions (2)
Exceptions (2)
 
Excepciones en java
Excepciones en javaExcepciones en java
Excepciones en java
 
Guia1 pii
Guia1 piiGuia1 pii
Guia1 pii
 
Fundamentos de programación Java
Fundamentos de programación JavaFundamentos de programación Java
Fundamentos de programación Java
 
Tipos de datos
Tipos de datosTipos de datos
Tipos de datos
 
Datos Previos
Datos PreviosDatos Previos
Datos Previos
 
Curso Java Inicial 8 Conceptos Avanzados Applets
Curso Java Inicial   8 Conceptos Avanzados   AppletsCurso Java Inicial   8 Conceptos Avanzados   Applets
Curso Java Inicial 8 Conceptos Avanzados Applets
 
Datos Previos
Datos PreviosDatos Previos
Datos Previos
 
Grupo1
Grupo1Grupo1
Grupo1
 
4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Calse 3 JAVA 2012
Calse 3 JAVA 2012Calse 3 JAVA 2012
Calse 3 JAVA 2012
 
Introducción a scala
Introducción a scalaIntroducción a scala
Introducción a scala
 
Jyoc java-cap23 j unit
Jyoc java-cap23 j unitJyoc java-cap23 j unit
Jyoc java-cap23 j unit
 
Jyoc java-cap21 jse avanzado
Jyoc java-cap21 jse avanzadoJyoc java-cap21 jse avanzado
Jyoc java-cap21 jse avanzado
 

Similar a Java fundamentos 15 consejos prácticos - ITLA Tech Day 2018

Similar a Java fundamentos 15 consejos prácticos - ITLA Tech Day 2018 (20)

Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
2introduccionallenguajejava 141109171757-conversion-gate02
2introduccionallenguajejava 141109171757-conversion-gate022introduccionallenguajejava 141109171757-conversion-gate02
2introduccionallenguajejava 141109171757-conversion-gate02
 
INTRODUCCION LENGUAJE JAVA
INTRODUCCION LENGUAJE JAVAINTRODUCCION LENGUAJE JAVA
INTRODUCCION LENGUAJE JAVA
 
2) introduccion al lenguaje java
2) introduccion al lenguaje java2) introduccion al lenguaje java
2) introduccion al lenguaje java
 
Manejo de memoria
Manejo de memoriaManejo de memoria
Manejo de memoria
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Caracteristicas de C Sharp
Caracteristicas de C SharpCaracteristicas de C Sharp
Caracteristicas de C Sharp
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
Introduccion java
Introduccion javaIntroduccion java
Introduccion java
 
Lenguajes de programación orientados a objetos
Lenguajes de programación orientados a objetosLenguajes de programación orientados a objetos
Lenguajes de programación orientados a objetos
 
Mule Librerias en Java
Mule Librerias en JavaMule Librerias en Java
Mule Librerias en Java
 
Tutorial jared
Tutorial jaredTutorial jared
Tutorial jared
 
Preguntas de introiducción a java
Preguntas de introiducción a javaPreguntas de introiducción a java
Preguntas de introiducción a java
 
Java - No numérica - II
Java - No numérica - IIJava - No numérica - II
Java - No numérica - II
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2
 

Último

guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersIván López Martín
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...AlanCedillo9
 

Último (19)

guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
 

Java fundamentos 15 consejos prácticos - ITLA Tech Day 2018

  • 1. FUNDAMENTOS DE JAVA 15 consejos prácticos sobre Java que cambiarán la forma en que codificas Tech Day ITLA Santiago RD 2018 24 Noviembre 2018,Instituto Tecnológico de Las Américas, Santiago, R. D. #ITLATechDay2018 #EncuentrosUniversitariosJava2018 Eudris Cabrera @eudriscabrera
  • 2. Eudris Cabrera Graduado de Ingeniería Telemática en la PUCMM. Entusiasta de la tecnología y el software libre, desarrollador Java, instructor ocasional (Java / Linux), aficionado del béisbol/sóftbol y los bailes latinos. En el tiempo libre, escribe artículos, realiza charlas, participa en eventos tecnológicos y ayuda en la revisión de documentación técnica en el mundo Java y el código abierto.
  • 3. AGENDA ● 15 consejos prácticos sobre características fundamentales que todo programador Java debe tener en cuenta. ● Conocer técnicas y mejores prácticas para producir software con menos bug en Java. ● Extras
  • 4. Conocer los tipos de datos y sus valores por defecto 1
  • 5. Tipos Primitivos (sin métodos; no son objetos; no necesitan una invocación para ser creados) Nombre Tipo Espacio Memoria Rango Aproximado Valor por defecto Clase Asociada byte Entero 1 byte -128 a 127 0 Byte short Entero 2 bytes -32768 a 32767 0 Short int Entero 4 bytes 2*109 0 Integer long Entero 8 bytes Muy grande 0L Long float Decimal simple 4 bytes Muy grande 0.0f Float double Decimal doble 8 bytes Muy grande 0.0d Double char Carácter simple 2 bytes 'u0000' Character boolean Valor true o false 1 byte false Boolean void Void
  • 6. Tipos Objeto (con métodos, necesitan una invocación para ser creados) Nombre Tipo Tipos de la biblioteca estándar de Java String (cadenas de texto) Muchos otros (p.ej. Scanner, TreeSet, ArrayList…) Tipos definidos por el programador / usuario Cualquiera tipo que se nos ocurra arrays Serie de elementos o formación tipo vector o matriz. Lo consideraremos un objeto especial que carece de métodos. Tipos envoltorio o wrapper (Equivalentes a los tipos primitivos pero como objetos.) Byte Short Integer Long Float Double Character Boolean
  • 7. Conocer los paquetes más utilizados 2
  • 8. Paquetes de Propósito General java.lang Contiene clases fundamentales e interfaces fuertemente relacionadas con el lenguaje y el sistema runtime. java.io Las clases centrales del paquete son InputStream y OutputStream, las cuales son clases abstractas, base para leer y escribir a streams de bytes, respectivamente. java.nio El paquete java.nio (NIO o Nueva I/O) fue añadido para soportar I/O mapeada en memoria, facilitando las operaciones I/O cercanas al hardware subyacente con mejor rendimiento. Java.text El paquete java.text proporciona clases e interfaces para el manejo de texto, fechas, números y mensajes de una manera independiente de los lenguajes naturales.
  • 9. Paquetes de Propósito General java.math Soporta aritmética multi precisión (incluyendo operaciones aritméticas modulares) y suministra generadores de números primos multi precisión usados para la generación de claves criptográficas. java.util En el paquete está incluida la API Collections, una jerarquía organizada de estructura de datos influenciada fuertemente por consideraciones de patrones de diseño. java.net El paquete java.net suminista rutinas especiales IO para redes, permitiendo las peticiones HTTP, así como también otras transacciones comunes.
  • 10. Paquetes de Propósito Especial java.sql Una implementación de la API JDBC (usada para acceder a bases de datos SQL) se agrupa en el paquete java.sql. java.time La API principal de fechas, horas, instantes, y duraciones.
  • 11. Manejar las cadenas de caracteres de forma correcta 3
  • 12. Clase String Se utiliza para manejar cadena de texto. Algunos consejos a la hora de manejar cadena de texto ● Evitar concatenar usando el signo de más (+), usar el método concat o join para tales fines. ● Utilizar el método format(String format, Object... args) ● Para cadenas grandes de caracteres usar StringBuilder
  • 13. Concatenar cadena de caracteres Método String concat(String str) name.concat(" - " ).concat(String.valueOf(age)); Método format(String format, Object... args) Logger.getLogger("Demo").log(Level.WARNING, String.format("Hubo un error :%s", ex.getMessage())); Método String join(CharSequence delimiter, CharSequence... elements) String.join("-", teamId,name);
  • 14. Clase StringBuilder Util para manejar grandes cadenas de texto ● Es considerable tomar en cuenta el valor por defecto cuando creamos una instancia de este tipo ● Si la cadena es muy grande inicializar el constructor con un valor alto ● Evitar concatenar usando el signo de más (+), utilice el método append()
  • 15. Clase StringBuilder @Override public String toString() { return new StringBuilder() .append("id").append(teamId) .append("name").append(name) .append("hasWonWoldSeries").append(hasWonWoldSeries) .append("lastTimeWonWorldSeries").append(lastTimeWonWorldSeries) .toString(); }
  • 16. Clase StringBuilder StringBuilder sb = new StringBuilder(150); map.forEach((String k, Integer v) -> { sb.append(String.format("%s%s", k,v)); });
  • 17. Usar clases y tipos genéricos 4
  • 18. Antes de Tipo Genéricos List lista = new ArrayList(); lista.add("Hola Mundo"); lista.add(new Integer(5)); String cadenaTexo = (String) lista.get(0); int entero = (int) lista.get(1); Cuales inconvenientes presenta este pedazo de código ?
  • 19. Tipos Genéricos List<String> lenguajesJVM = new ArrayList<String>(); lenguajesJVM.add("Java"); lenguajesJVM.add("Groovy"); lenguajesJVM.add("Scala"); lenguajesJVM.add("Kotlin"); for (String lenguaje : lenguajesJVM) { System.out.println(lenguaje); } Los tipos genéricos agregan estabilidad a su código al hacer que se detecten más errores en el momento de la compilación. Con las características de tipos genéricos, puede configurar el tipo de colección para limitar qué tipo de objetos se pueden insertar en la colección.
  • 20. Clases Genéricas Las clases genéricos permiten usar tipos para parametrizar las clases, interfaces y métodos al definirlas. Los beneficios son: ● Comprobación de tipos más fuerte en tiempo de compilación. ● Eliminación de casts aumentando la legibilidad del código. ● Posibilidad de implementar algoritmos genéricos, con tipado seguro. ● Una clase genérica puede tener múltiples argumentos de tipos y los argumentos pueden ser a su vez tipos genéricos. Después del nombre de la clase se puede indicar la lista de parámetros de tipos con el formato <T1, T2, T3, …>
  • 21. Clases Genéricas public class ClaseGenerica<T> { private T t; public ClaseGenerica(T o) { this.t = o; } public void classType() { System.out.println("El tipo de T es " .concat(t.getClass().getName())); } } // Creamos una instancia de ClaseGenerica para Integer. ClaseGenerica<Integer> intObj = new ClaseGenerica<Integer>(88); intObj.classType(); // Creamos una instancia de ClaseGenerica para Team. ClaseGenerica<Team> strTeam = new ClaseGenerica<Team>(new Team()); strObj.classType();
  • 22. Clases Genéricas Existen una serie de convenciones para nombrar a los genéricos: ● E – Element (usado bastante por Java Collections Framework) ● K – Key (Llave, usado en mapas) ● N – Number (para números) ● T – Type (Representa un tipo, es decir, una clase) ● V – Value (representa el valor, también se usa en mapas) ● S,U,V etc. – usado para representar otros tipos.
  • 24. Enums Un dato de un tipo enumerado es aquel que puede tomar por valor uno de los pertenecientes a una lista ordenada de valores definida por el programador. Ejemplo: public enum Genero { MASCULINO, FEMENINO; }
  • 25. Enums Las enumeraciones son listas de constantes. Cuando necesite una lista predefinida de valores que representan algún tipo de datos numéricos o textuales, debe usar una enumeración. Siempre debe usar enumeraciones cuando una variable (especialmente un parámetro de método) solo puede tomar una de un pequeño conjunto de valores posibles.
  • 26. Enum con constructor public enum ESTADO { CREADO("Creado"), PENDIENTE_APROVACION("Pendiente de Aprobacion"), APROBADO("Aprobado"); private String descripcion; private ESTADO(String descripcion) { this.descripcion = descripcion; } public String getDescripcion() { return descripcion; } public String getId() { return name(); } }
  • 27. Comprender el uso y manejo de excepciones 6
  • 28. Excepción Es una condición anormal que interrumpe el flujo normal de un programa.
  • 29. Tipos de Excepciones Excepciones comprobadas (Checked exceptions) Indica un problema esperado que puede ocurrir durante la operación normal del sistema. Estas excepciones deben ser declaradas en la cláusula throws de un método. Extienden de la clase Excepción. Excepciones no comprobadas (Unchecked exceptions) Estas son excepciones que no necesitan ser declaradas en una cláusula throws. JVM simplemente no lo obliga a manejarlos, ya que se generan principalmente en tiempo de ejecución debido a errores programáticos. Extienden de la clase RuntimeException. Ejemplo: NullPointerException, IndexOutOfBoundsException, etc.
  • 30. Tipos de Excepciones Errores (Errors) Son problemas graves en el entorno de ejecución que casi con seguridad no son recuperables. Algunos ejemplos son OutOfMemoryError, LinkageError y StackOverflowError. Por lo general, bloquean su programa o parte del programa. Solo una buena práctica de logging le ayudará a determinar las causas exactas de los errores.
  • 31. Manejo de Excepciones ● Gestionar correctamente todas o la mayor parte de los errores que se pueden producir. ● Evitar mostrar al usuario los mismos mensajes generados por las excepciones, en su lugar colocar mensajes personalizados que el usuario final pueda entender sin problemas. ● Crear clases personalizadas para manejar nuestras excepciones. ● Evitar escribir en la consola usando printStackTrace(), en su lugar usar un Logger ● Usar multiples catch de excepciones
  • 32. Excepción personalizada Ejemplo: public class ExcepcionJdbcMySQL extends Exception { private static final long serialVersionUID = 1L; public ExcepcionJdbcMySQL(String message) { super(message); } ...... } public class PruebaExcepcion { public void excepcion1() throws ExcepcionJdbcMySQL { throw new ExcepcionJdbcMySQL("Hubo un error"); } ..... }
  • 33. Manejar los logs de forma más inteligente 7
  • 34. Logging Logging es el proceso de escribir mensajes durante la ejecución de un programa en un lugar central. Los logs permiten informar y persistir los mensajes de error y advertencia, así como los mensajes de información (por ejemplo, estadísticas de tiempo de ejecución) para que los mensajes puedan recuperarse y analizarse más adelante.
  • 35. Java Logging API Podemos usar el framework de logging de Java para: - Escribir mensajes a la consola - Escribir mensajes en un archivo Logger.getLogger("Demo").log(Level.WARNING, ex.getMessage()); Logger.getLogger(ConeccionDB.class.getName()).log(Level.SEVERE, null, ex);
  • 36. La forma en que opera es la siguiente: - Creamos un objeto estático de tipo Logger desde el cual enviaremos los mensajes. ● Creamos un objeto ConsoleHandler y se lo agregamos al Logger, de modo que los mensajes aparezcan automáticamente en la consola. ● Creamos un objeto FileHandler y se lo agregamos al Logger, este Handler en particular enviara los mensajes al archivo que le indiquemos. ● Creamos un objeto SimpleFormatter y lo establecemos en el FileHandler, de este modo los logs se escriban como texto plano simple, de no indicarlo se escribiran en formato XML por defecto. - Para registrar algo en bitácora llamamos al método log del Logger indicamos el nivel del log y el mensaje que deseamos registrar, esto automáticamente reportara la fecha, hora, el nombre completo de la clase y el método y en el caso de mensajes de nivel grave la linea de código donde se genero el reporte
  • 37. Niveles de Log Podemos indicar el nivel de información que queremos guardar o mostrar en la consola usando los diferentes niveles. En orden descendente SEVERE (más alto nivel) WARNING INFO CONFIG FINE FINER FINEST (más bajo nivel)
  • 38. Java Logging API private final static Logger LOGGER = Logger.getLogger(DemoLogger.class.getName()); public void loggerAll() { LOGGER.log(Level.ALL, "Todos los niveles"); } public void loggerInfo() { LOGGER.log(Level.INFO, "Nivel Informativo"); } public void loggerWarning() { LOGGER.log(Level.WARNING, "Nivel advertencia"); } public void loggerError() { LOGGER.log(Level.SEVERE, "Nivel ERROR"); }
  • 39. Manejo correcto de recursos 8
  • 40. Uso de try-with-resources Cuando estamos trabajando con archivos, conexiones a base de datos, socket, etc., debemos manejar correctamente los recursos correspondientes a cada uno de estos casos, esto es, cerrar cada recursos luego de su uso para evitar problemas posteriores, como anidamientos de conexiones. A partir de Java SE 7 se introdujo una forma sencilla de manejar los recursos try-with-resources.
  • 41. Uso de try-with-resources try (Connection con = ConeccionDB.getInstancia().getConeccion()) { try (PreparedStatement stmt = con.prepareStatement(sqlSelect)) { try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { } } } } catch (SQLException ex) { Logger.getLogger(DemoRecursos.class.getName()).log(Level.SEVERE, ex.getMessage()); throw new ExcepcionJdbcMySQL("No pudo encontrar registros"); }
  • 42. Usando el try de esa forma nos aseguramos de que el recurso quede cerrado luego de su uso. Esto es posible a que las clases anteriores implementa la interfaz Closable. Se podrá utilizar try-with-resources siempre que implementen la interfaz Closable.
  • 43. Aprender cómo y por qué usar Expresiones Lambdas 9
  • 44. Tenemos una lista del tipo del tipo Team y sobre ella queremos realizar algunas operaciones cumpliendo ciertos criterios. public void printTeamsHasNotWonWorldSeries(List<Team> teams){ for (Team team : teams) { if(!team.isHasWonWoldSeries()){ System.out.println(""+ team.toString()); } } }
  • 45. Ejemplo public void printTeamsWithPredicate(List<Team> teams, Predicate<Team> tester){ for (Team t : teams) { if(tester.test(t)){ System.out.println(""+ t.toString()); } } } Predicate<Team> hasNotWonWS = new Predicate<Team>() { @Override public boolean test(Team t) { return !t.isHasWonWoldSeries(); } }; printTeamsWithPredicate(teams, hasNotWonWS); ¿Cuál es el inconveniente de esta solución? Las clases anónimas reduce la cantidad de clases creadas y el paso de comportamiento como parámetro se mantiene, pero aún se puede detectar mucho código repetido. Solución usando clases anónimas
  • 46. En nuestro ejemplo anterior, podemos utilizar una expresión lambda en lugar de una clase anónima. Ejemplo básico usando expresiones lambdas. printTeamsWithPredicate(teams, (Team t) -> !t.isHasWonWoldSeries()); Nota: Puede parecer bastante confuso en un principio, pero ya revisaremos los conceptos y cambios en el lenguaje que nos permitirán escribir código Java de esa manera.
  • 47. Expresiones lambdas Una expresión lambda representa una función anónima. λx → x+x Función anónima que toma un número x y devuelve el resultado x + x.
  • 48. Una expresión lambda se compone de un conjunto de parámetros, un operador lambda ( -> ) y un cuerpo de la función.
  • 49. Sintaxis () -> System.out.println("Hello Lambda") x -> x + 10 (int x, int y) -> { return x + y; } (String x, String y) -> x.length() – y.length() (int a, int b) -> a + b (int a) -> a + 1 (int a, int b) -> { System.out.println(a + b); return a + b; } () -> new ArrayList();
  • 51. Explorar cómo las operaciones agregadas, el API Stream y las expresiones Lambda funcionan en conjunto para proporcionar potentes capacidades de filtrado. 10
  • 52. API Stream Stream: ● Representa una abstracción para especificar cálculos agregados (acumulativos). ● Simplifica la descripción de los cálculos agregados (laziness,paralelismo).
  • 53. Elementos de un Stream Un Stream se compone de 3 elementos: ● Un origen ● Cero o más operaciones intermedias ● Una operación final (salida o un resultado)
  • 54. Ejemplo long totalEquipos = teams.stream() .filter(t -> t.isHasWonWoldSeries()) .mapToInt(Team::getLastTimeWonWorldSeries) .count(); Source Intermediate operations Terminal operation
  • 55. Ejemplo Procesar la siguiente lista para que solamente contenga cadena de caracteres impares y en letra minúscula. List<String> list = Arrays.asList("BarCamp", "MongoDB", "10Gen", "TokuMX", "Nagios", "PUCMM", "Ruby", "JSON", "JSON"); Solución usando clase anónima List<String> newList = list .stream() .filter(new Predicate<String>() { @Override public boolean test(String t) { return (t.length() % 2)==1; } }).map(String::toLowerCase) .collect(Collectors.toList()); Solución usando expresiones lambdas List<String> newList = list .stream() .filter(s -> (s.length() % 2)==1) .map(String::toLowerCase) .collect(Collectors.toList());
  • 56. Entender, aceptar y aprovechar Optional de Java 8 para tratar los nulos de forma más simple y menos propensos a errores 11
  • 57. Clase Optional Ayuda a eliminar los problemas de NullPointerException Optional<T> Contenedor para una referencia de objet (nulo, o objeto real). Piensa en Optional como un stream 0 ó 1 elemento. Garantiza que la referencia de Optional no retornará nulo.
  • 58. Ejemplo Usando Optional con Stream Optional<String> val = Stream.of("one", "two").findAny(); Optional<String> val = Stream.of("one", "two").findFirst(); Optional<Team> opt = teams.stream().findFirst(); Otros métodos útiles en la clase Optional opt.isPresent(); //true Optional<Team> opt = Optional.empty(); opt.orElse(new Team("TOR", "Toronto Blue Jays", true, 1992)).isHasWonWoldSeries();
  • 59. Adoptar el nuevo API de Fecha y Tiempo 12
  • 60. Date Time API JSR 310 Nuevo API de fecha/tiempo en java
  • 61. Date Time API El Date and Time API se desarrolló como parte del Java Community Process (JCP) dirigido por Stephen Colebourne (autor de Joda-Time) y Oracle, bajo JSR 310. El paquete java.time es el núcleo de la API y utiliza el sistema de calendario definido en ISO-8601 (https://www.iso.org/iso-8601-date-and-time-format.html ) como el calendario predeterminado. El calendario ISO se basa en el sistema de calendario gregoriano y es el estándar internacional para representar fecha y hora. Para soportar las necesidades de los desarrolladores que utilizan sistemas de calendario no ISO, en algunas áreas del mundo, como Japón o Tailandia, el nuevo API de Tiempo y Fecha permite trabajar con diferentes sistemas de calendario.
  • 62. java.time LocalDate : Fecha más fácil de interpretar. LocalDate date = LocalDate.now(); System.out.printf("%s-%s-%s", date.getYear(), date.getMonthValue(), date.getDayOfMonth()); LocalDateTime: Maneja fecha y hora sin especificar la zona horaria LocalDateTime localDateTime = LocalDateTime.now(); ZonedDateTime zdateTime = ZonedDateTime.now(); //fecha y hora con zona horaria Zona Horaria ZoneId zone = ZoneId.systemDefault(); Clock clockDefault = Clock.systemDefaultZone(); ZoneId zoneAmerica = ZoneId.of("America/Santo_Domingo"); Clock clock = Clock.system(zoneAmerica);
  • 63. java.time Haciendo cálculo de fechas LocalDate sinceJava8Launch = LocalDate.of(2014, Month.MARCH, 18); LocalDate today = LocalDate.now(); today.isAfter(sinceJava8Launch); //true Calcular diferencia entre dos fecha usando period LocalDate sinceBarCamp2013 = LocalDate.of(2013, Month.NOVEMBER, 16); LocalDate currentDate = LocalDate.of(2015, Month.NOVEMBER, 28); Period betweenDates = Period.between(sinceBarCamp2013, currentDate); int diffInDays = betweenDates.getDays(); int diffInMonths = betweenDates.getMonths(); int diffInYears = betweenDates.getYears();
  • 64. TemporalQuery Determinar si una fecha es festiva usando TemporalQuery LocalDate date = LocalDate.of(2016, Month.JANUARY, 26); Boolean isHoliday = date.query(new DiasFestivosRD()); public class DiasFestivosRD implements TemporalQuery<Boolean>{ static List<MonthDay> DIAS_FESTIVOS = Lists.newArrayList( MonthDay.of(Month.JANUARY, 1), // Año Nuevo MonthDay.of(Month.JANUARY, 6), // Día Santos Reyes MonthDay.of(Month.JANUARY, 21), // Día de la Altagracia MonthDay.of(Month.JANUARY, 26), // Día del Natalicio de Duarte MonthDay.of(Month.FEBRUARY, 27), // Día Independencia Nacional MonthDay.of(Month.MAY, 1), //Día Trabajador MonthDay.of(Month.AUGUST, 16), //Día Restauración MonthDay.of(Month.SEPTEMBER, 24), //Día de las Mercedes MonthDay.of(Month.NOVEMBER, 6), //Día Constitución MonthDay.of(Month.DECEMBER, 25) //Día de Navidad ); @Override public Boolean queryFrom(TemporalAccessor date) { MonthDay diaMesActual = MonthDay.from(date); return DIAS_FESTIVOS.contains(diaMesActual); } }
  • 65. TemporalQuery Determinar si una fecha es esta dentro de la temporada ciclónica LocalDate date = LocalDate.of(2017, Month.JUNE, 30); Boolean esTemporadaCiclonica = date.query(new TemporadaCiclonica()); public class TemporadaCiclonica implements TemporalQuery<Boolean>{ @Override public Boolean queryFrom(TemporalAccessor temporal) { LocalDate fecha = LocalDate.from(temporal); MonthDay primeroJulio = MonthDay.of(Month.JUNE.getValue(), 1); MonthDay trentaNoviembre = MonthDay.of(Month.NOVEMBER.getValue(), 30); return fecha.isAfter(primeroJulio.atYear(fecha.getYear())) && fecha.isBefore(trentaNoviembre.atYear(fecha.getYear())); } }
  • 67. Varargs en Java Introducido en Java 5 y su objetivo es proporcionar una vía corta para los métodos que admiten un número arbitrario de parámetros de un tipo. Los varargs nos ayudan a evitar escribir un código repetitivo al introducir la nueva sintaxis que puede manejar una cantidad arbitraria de parámetros automáticamente, usando una arreglo detrás de escenario. public static void main(String... s) {} Restrinciones: Cada método solo puede tener un parámetro varargs. El argumento varargs debe ser el último parámetro.
  • 68. Utilizar Paths y Files 14
  • 69. Clase Path Forma parte de paquete java.nio y provee una forma fácil para trabajar con rutas. Es común usarla en conjunto con la clase Files. Ejemplo: try (BufferedReader reader = Files.newBufferedReader(Paths.get("SonnetI.txt"), StandardCharsets.UTF_8)) { long totalLines = reader.lines().count(); System.out.println("Number of lines = " + totalLines); } catch (IOException ex) { Logger.getLogger(DemoRecursos.class.getName()).log(Level.SEVERE, ex.getMessage()); }
  • 70. Clase Path A partir de JDK8 se agregó el método lines () dentro de la clase Files. Devuelve un Stream de elementos de cadena.
  • 72. Sistema Modular : Proyecto Jigsaw Principal novedad en Java 9. La idea de un sistema modular es hacer el jdk más ligero para dispositivos pequeños. El sistema de módulos proporcionará a la aplicación la capacidad de utilizar sólo los módulos del jdk que sean necesarios. Las aplicaciones ya no necesitarán el jdk completo. El sistema de módulos encapsula las clases públicas dentro de un módulo. Así que clase definida pública no estaría disponible para el mundo entero hasta que un módulo lo defina explícitamente.
  • 73. Sistema Modular - Proyecto Jigsaw Los módulos van a ser descritos en un archivo llamado module-info.java ubicado en la parte superior de la jerarquía de código java. El archivo module-info provee: 1. Nombre del módulo. 2. Lista de dependencias de módulos necesarias para la correcta compilación y ejecución. 3. Información sobre paquetes exportados por este módulo. 4. Lista de servicios que proporciona el módulo en tiempo de ejecución.
  • 74. Sistema Modular - Proyecto Jigsaw
  • 75. Sistema Modular - Proyecto Jigsaw com.example.samplemodule : es el nombre del módulo. requires : Indica que son dependencia del módulo exports : Todas las clases públicas en estos paquetes serán accesibles a otros módulos que dependen de él. uses : Para usar datos de otros módulos. provides : Proporciona configuración al servicio de otro módulo
  • 76. Demo Vamos a explorar varios ejemplos. https://github.com/ecabrerar/java9- labs/tree/master/jigsaw
  • 78. Herramientas para analizar tu código Las herramientas de análisis estático de código se utilizan para cuidar la calidad del código y evitar la deuda técnica. 1. PMD Detecta cosas como código duplicado, código muerto (variables, parámetros o métodos sin usar), complejidad de métodos (if innecesarios, etc.) 1. Findbugs Identificar cientos de tipos de errores potenciales. Opera a nivel de bytecode en lugar de código fuente 1. Check Style Se utiliza para comprobar que el código analizado cumple con una serie de reglas de estilo.
  • 79. Leer código Intentar comprender cosas de proyectos más avanzados, descubrir la organización(flujo), siempre te ayudará a crecer como desarrollador. 1. Estudiar código de otros programadores y/o proyectos. 2. Leer código de proyectos de código abierto. 3. Leer código del JDK o de tu IDE favorito. 4. Leer código que tiene que ver con tu proyecto(Librerías, frameworks,etc)
  • 80. Participar en comunidades de desarolladores 1. Socializar con otros desarrolladores. 2. Conocer un mentor. 3. Ser mentor de alguien. 4. Dar una charla en un evento relacionado con la comunidad. 5. Resolver incidencias en proyecto open source.
  • 84. Asuntos Legales Todas las marcas registradas, así como todos los logotipos, imágenes, fotografías, audio y vídeos mostrados en esta presentación son propiedad de sus respectivos propietarios y/o representantes. Su utilización es solamente para fines ilustrativos.
  • 86. @eudriscabrera @eudris @ecabrerar @eudriscabrera Eudris Cabrera Rodríguez Ingeniero Telemático Desarrollador de Software / Consultor Informático eudris@gmail.com https://www.linkedin.com/in/eudriscabrera http://www.slideshare.net/eudris https://twitter.com/eudriscabrera https://github.com/ecabrerar

Notas del editor

  1. Ingeniero Telemático - PUCMM (2006). Desarrollador Java desde hace más de 9 años. Actualmente Desarrollador Informático en el Programa de Administración Financiera Integrada (PAFI) / Ministerio de Hacienda. Entusiasta de la tecnología y el software libre, charlista ocasional y colaborador en eventos tecnológicos para desarrolladores como Barcamp RD, Taller de Java EE 7 /Java Day Santiago RD (PUCMM - Santiago), Code Camp SDQ 4.0, varias charlas y talleres en la Universidad Abierta para Adultos (UAPA-Santiago). Miembro fundador de la Comunidad Java Dominicano. He sido Facilitador a tiempo parcial en el Curso Final de Grado de la Escuela de Ingeniería y Tecnología de la Universidad Abierta para Adultos (UAPA), Santiago. También, facilitador en el Diplomado de Programación Java organizado por la MESCYT y el Centro de Tecnología y Educación Permanente (TEP) de la PUCMM, Santiago.
  2. Puede parecer bastante confuso en un principio, pero ya revisaremos los conceptos y cambios en el lenguaje que nos permitirán escribir código Java de esa manera.
  3. Con las expresiones lambdas podemos crear código más conciso y significativo, además de abrir la puerta hacia la programación funcional en Java, donde las funciones juegan un papel fundamental.
  4. La API Stream nos permite realizar operaciones de tipo filtro/mapeo/reducción sobre colecciones de datos de forma secuencial o paralela y su implementación es transparente para el desarrollador.