Enviar correo de GMAIL con Java

Este es otro post que quería compartir desde hace tiempo, entre otras cosas por su sencillez ya que en un proyecto anterior una solución de este tipo nos ayudó a resolver un problema puntual. Les pongo en contexto, debíamos desde nuestra empresa enviar una información que recabábamos diariamente, como es de suponer estábamos alejados fisicamente y en otra red y como no podía ser de otra forma no había permisos para por FTP o SSH hacer llegar la información, es por ello que dado las exigencias y con el poco tiempo que contábamos se nos ocurrió la idea “¿y si enviamos la información por email?”  y así hicimos, construimos un pequeño programa Java el cual se ejecutaba periódicamente para enviar unos ficheros adjuntos que sacábamos diariamente.

Primero que nada es necesario que desde la cuenta de GMAIL habilitemos el acceso de aplicaciones menos seguras. Para ello es necesario que ingresemos a nuestra cuenta de GMAIL y una vez dentro vayamos a la parte superior derecha donde este el icono de nuestra cuenta, hacemos clic en el icono y posteriormente al botón “Mi cuenta”. Allí veremos la siguiente imagen

mi cuenta de GMAIL

mi cuenta de GMAIL

Como vemos en la imagen de arriba (resaltado en rojo), debemos hacer clic en el apartado de “Inicio de sesión y seguridad”. Y allí nos desplazamos hasta la parte inferior y habilitamos/activamos la opción “Permitir el acceso de aplicaciones menos seguras”, como en la imagen de abajo.

habilitar acceso de aplicaciones menos seguras

habilitar acceso de aplicaciones menos seguras

Hecho esto, vamos al programa, el cual hace uso de Java Mail. El programa es bastante sencillo consta de un fichero de configuración del siguiente tipo:

gmail.account: La cuenta de GMAIL desde la cual enviaremos el correo electrónico.

gmail.password: El password de la cuenta de GMAIL desde la cual enviaremos el correo electrónico.

emaildestinations: Lista de direcciones de correo electrónico separadas por punto y coma (“;”) a donde será enviado el correo.

attachmentfiles: Lista de rutas donde están ubicados los ficheros a adjuntar separados por punto y coma (“;”).

A continuación el programa Java encargado del envío del correo electrónico.

El ejemplo es bastante sencillo, pero nos muestra como indicar el asunto del email, el texto del mensaje así como adjuntar ficheros. Espero que les pueda ser de utilidad. Aquí el enlace al proyecto en Github.

¿Valen la pena las certificaciones?

Tiempo atrás me hicieron la siguiente consulta en el blog:

Hola Jose,

estoy muy indecisa en si prepararme para la certificación de Java. Mucha gente me dice que es absurdo porque las preguntas son del api, y tipo trozos de código que tienes que hacer de compilador y que al final se vuelve en un absurdo porque eso al fin y al cabo en nuestro día a día con un compilador es intuitivo. También me han dicho que a la hora del mundo laboral apenas lo valoran porque como debemos pagar para certificarnos, como que los empresarios lo ven como un título comprado.

Antes que nada disculparme con la persona que me escribió ya que ha pasado algo de tiempo y apenas ahora es que le respondo, pero aquí voy y con la sinceridad que me caracteriza.

En más de una vez he recalcado estar a favor en realizar certificaciones, pero así como lo he dicho alguna vez, ahora lo repito, “no es por el papel”, el papel o el certificado es lo de menos, bueno (pausa de 1 seg), es un premio o mejor dicho un reconocimiento al esfuerzo y a la dedicación que has puesto en estudiar y aprender cierta tecnología o idioma, es como cuando presentábamos un examen importante (para obtener créditos especiales o en una materia electiva de particular importancia) y después de tanto estudiar te otorgaban un aprobado pero que goza de cierto cache, ya que no se aprueba con la mitad de la nota sino con un poco más (por ejemplo si las notas van de 1 a 10 se otorgue únicamente el aprobado con 6.5). Lo que a mí particularmente me parece fascinante de las certificaciones y me entusiasma a realizarlas es todo el proceso de preparación, es como te planteas y organizas los objetivos para estudiarlos, como al cabo de un tiempo empiezas a darte cuenta de que algunos temas los tienes bien cubiertos mientras que hay otros donde necesitas hacer énfasis y repasarlos de nuevo, todo ese proceso de estudio con ese poquitín de presión añadida pero sobretodo con la ambición de aprender y mejorar tus habilidades profesionales, creo que hace méritos más que suficientes para presentar una certificación, y voy a plantear par de ejemplos para intentar hacerles llegar mi punto de vista.

Imaginemonos que empezamos a prepararnos durante algunos meses en presentar un examen de inglés, por ejemplo el FCE (también llamado el first). Si nos hemos esforzado digamos que durante unos 5 meses estudiando, leyendo muchos verbos, conjungandolos y utilizándolos en frases, escuchando mucho inglés, etc… ya habremos ganado, porque independientemente de que al presentar aprobemos o no el examen, el premio lo recibiremos cuando nos toque hablar con una persona de habla inglesa y hayamos podido entender a esta persona y a su vez hayamos logrado expresarnos con cierta fluidez, que si no fue tal, pues sencillamente no importa porque estoy seguro de que nos expresaríamos mucho mejor que antes de haber empezado a estudiar para la certificación.

Otra razón de presentar las certificaciones, es el saber, porque para mí “el saber es poder”, el saber te da confianza, y si vas a presentarte para una entrevista de trabajo o para un cargo, créeme que la confianza es importante (te desenvuelves mejor, yo sinceramente creo que hasta te cambia la cara y hasta la forma de expresarte) y ahora bien ¿recuerdas cuando en la escuela tenías que hacer una exposición? a la mayoría nos daba algo de miedo escénico, pero había una cosa que siempre era palpable independientemente de que fueras el mejor en el escenario o no, y es que siempre se sabía quien había estudiado y quien no. ¿Crees que las personas de RRHH no se dan cuenta? y si tuviste suerte y pasaste esa entrevista recuerda que luego seguramente tendrás una entrevista técnica y a esta persona será difícil que le engañes o mejor dicho dejaras mejor imagen si le demuestras a esa persona que sabes de lo que hablas.

Entonces, ¿valen la pena las certificaciones? SI

¿Los empresarios lo ven como un titulo comprado? No conozco ninguno que lo vea de esa manera y en dado caso desde mi humilde punto de vista te diría corre y vete de esa empresa porque allí no te valorarán ni como profesional ni tu deseo de ser mejor.

Yo particularmente he visto como últimamente empresas dedican una “bolsa” de dinero para fomentar la certificación de sus empleados, ya que a la hora de escoger un perfil entre un grupo de candidatos, la certificación y el haber aprobado la entrevista técnica puede que pongan la balanza a tu favor. Además no olvidemos que las empresas son las principales beneficiadas de que nosotros los empleados nos certifiquemos, ya que a priori están ganando, teniendo en el staff mejores profesionales.

¿Algunas preguntas son muy complejas y debemos actuar como si fuésemos un compilador, ya que incluyen código? Si hay preguntas que incluyen código y debemos actuar como un compilador pero ni son muchas y tampoco todas son extremadamente difíciles, estas la mayoría de las veces son conchas de mango, que si has estudiado, las vas a pillar de inmediato.

Así que amiga no lo pienses 2 veces certificate si tienes interés en hacerlo, que en el peor de los casos lo que harás es aprender 😉 y serás bien valorada por el gremio profesional y por tus colegas por interesante en afrontar retos de este tipo.

Por último confesar que ya he empezado a preparar mi próxima certificación y como adelanto les dire que va enfocada en tecnologías Big Data.

PD: La de Java 8 me hace mucho ojito, jejejeje, pero ya he estudiado por mi parte las expresiones lambda, los streams, los default methods de las interfaces, entre otras cosas, por lo cual no siento tanto interés como otras veces en presentarla, así que quizás cuando salga Java 9 me meta de cabeza a estudiar de nuevo.

Representación gráfica de mi cuenta de Twitter

Hola de nuevo chicos, este es un post breve pero que quería compartir con ustedes desde hace mucho tiempo, fue hace un año aproximadamente que en la materia de análisis de redes sociales realicé un mini proyecto, este consistió en analizar la actividad de mi red social de twitter, y además tener una representación gráfica de la actividad de mi cuenta, es decir, a quienes sigo y las menciones y hashtags utilizados por mí y por aquellos a quienes sigo, incluso el número de veces que se ha utilizado cada hashtag.

Lo único que he hecho antes de subir el código a github fue actualizar la versión neo4j a 2.3.6 (base de datos de grafo donde se guardan las relaciones) y eliminar mis datos para el uso de la API de twitter.

Antes de ejecutar esta aplicación será necesario que generen un token y sigan los pasos necesarios para poder utilizar la API de twitter, por otro lado es importante destacar que este programa almacena las distintas relaciones entre entidades en una base de datos embebida de neo4j y para poder visualizar el resultado final de todas esas relaciones guardadas, lo que hice fue simplemente utilizar el navegador/visualizador por defecto que trae neo4j (que si no me equivoco esta creado con d3.js). Así que manos a la obra y comencemos descargando e instalando la versión 2.3.6 de Neo4j desde el siguiente enlace y una vez realizada la instalación pasamos al código fuente.

A continuación la clase principal:

El código completo del proyecto pueden hallarlo en el siguiente enlace. Una vez hayamos ejecutado nuestra aplicación, en la ruta especificada TWITTER_DB_PATH encontraremos una carpeta con extensión .db donde estarán almacenadas las relaciones (todo el grafo), el siguiente paso para poder visualizar el grafo será editar el fichero RUTA_INSTALACION_NEO4J/conf/neo4j-server.properties y editar la ruta donde ha de estar ubicada la base de datos

org.neo4j.server.database.location=TWITTER_DB_PATH.db

TWITTER_DB_PATH= La ruta especificada donde se ha de crear la base de datos Neo4j donde se almacenarán las relaciones.

Ahora procedemos a arrancar la base de datos, que es bastante sencillo solo es necesario ejecutar el siguiente comando:

RUTA_INSTALACION_NEO4J/bin/neo4j start

Hecho esto desde un navegador (chrome o firefox por ejemplo) ir a la ruta http://localhost:7474 y veremos el cliente web de Neo4j

neo4j

neo4j

Luego desde la consola donde ejecutar las consultas (donde aparece el símbolo del $) ejecutar el siguiente comando para poder visualizar todo el grafo.

MATCH (n) RETURN n

En mi caso obtuve lo siguiente

relaciones neo4j

relaciones neo4j

Como podrán darse cuenta se pueden distinguir los distintos tipos de relaciones (USE y MENTION) entre los distintos nodos, además hay 2 tipos de nodos, los azules son las cuentas de twitter y los verdes son los hashtags.

Otra cosa interesante es que con el visualizador de Neo4j podemos ver los datos de las relaciones como por ejemplo el número de veces que una cuenta de twitter ha usado un hashtag o mencionado a otra cuenta como en la siguiente gráfica

Número de veces que un hashtag es utilizado

Número de veces que un hashtag es utilizado

Como se puede apreciar en la parte inferior de la gráfica, la cuenta Ben & Martijn ha utilizado 2 veces el hashtag #Java.

Bueno ya no me queda más nada que mostrar a este respecto, así que si te resulta interesante ejecuta este ejemplo y ve como es la actividad de tu cuenta de twitter y te aseguro que encontraras cosas que te llamarán la atención y si te parece compártelas con el resto.

Por último mencionarles que intentare en medida de lo posible actualizar este código para que trabaje con la versión 3 o superior de Neo4j, mejorar el código (hacerlo más claro) y actualizarlo a Java 8. Cualquier comentario y/o sugerencia soy todo oídos.

Primer ejemplo con apache Storm

Apache Storm es un framework de procesamiento distribuido de eventos. Empresas como twitter utilizaron Storm desde el 2011 aunque posteriormente lo reemplazó por Heron en el 2015.

Actualmente me encuentro trabajando en una aplicación construida con Apache Storm y quiero compartir con ustedes mi primer ejemplo con Apache Storm el cual es bastante simple pero cumplio su cometido que era el iniciarme en este framework y entender sus componentes principales.

Necesitaremos descargar rabbitMQ la versión 3.5.7.

Una vez hayamos instalado rabbitMQ (es solo cuestión de descomprimir) vamos a habilitar un plugin (un cliente web) donde podremos de forma sencilla monitorizar las colas, entonces nos ubicamos en la siguiente ruta ruta_instalacion_rabbitmq/sbin/ y desde allí ejecutamos el siguiente comando

./rabbitmq-plugins enable rabbitmq_management

Este comando habilitará el cliente web que nos permitirá monitorizar las colas, los exchanges  incluso manipular las colas pudiendo ingresar elementos a las colas, sacar elementos e incluso purgar las colas. Paso siguiente iniciaremos el rabbitMQ con el siguiente comando:

./rabbitmq-server

Inmediatamente después desde un navegador nos dirigimos a la dirección http://localhost:15672

rabbitmq overview

rabbitmq overview

Una vez allí crearemos una cola para hacer nuestro ejemplo y la llamaremos “data”.

agregar cola en rabbitmq

agregar cola en rabbitmq

Ahora deberíamos ser capaces de ver la única cola de nuestro sistema. Clicando en ella podríamos incluso agregarle mensajes por medio de la interfaz gráfica (si lo desean hagan la prueba y verán como cada uno de los mensajes que agreguen se irán encolando), pero la inserción de mensajes en la cola lo haremos mediante un pequeño programa Java.

cola data

cola data

Ahora un poco de teoría para conocer acerca de Apache Storm.

¿Qué es Apache Storm?

Es un framework de computación distribuida en tiempo real, escrito en su mayoría en Clojure. Storm es similar a la forma como Hadoop ofrece un conjunto de primitivas generales para hacer el procesamiento por lotes, también ofrece un conjunto de primitivas generales para hacer cómputos en tiempo real. Storm es simple, se puede utilizar con cualquier lenguaje de programación.

Las aplicaciones de Storm son creadas como topologías en la forma de DAG (Directed Acyclic  Graph) con spouts y bolts actuando como los vertices del grado. Las aristas en el grafo son llamados streams y dirigen la data de un nodo a otro. Juntos, la topología actúa como una tubería de transformación de datos.

Los spouts son fuentes de flujo (streams) en una topología. Los spouts generalmente leerán tuplas desde una fuente externa y las emiten dentro de la topología.

Un bolt es donde se realiza todo el procesamiento de una topología, pueden hacer cualquier cosa, desde filtrado, funciones, agregaciones, joins, comunicarse con bases de datos y mucho más.

El ejemplo que hice y compartiré a continuación con ustedes será bastante simple, estará constituido por un spout que leerá de una cola rabbitmq (la cola data que creamos anteriormente) y ese mensaje lo insertará en la topología para posteriormente al recibirlo el bolt mostrarlo por linea de comandos (ya luego si ustedes lo desean lo que podrían hacer es que en vez de mostrarlo por linea de comandos volcar ese mensaje en otra cola de rabbitmq).

El programa java que se encarga de insertar mensajes a la cola

El Spout que leerá de la cola rabbitMQ

El bolt que leerá los datos que han sido insertados en la topología por el Spout

Definición de la topología

Para ejecutar nuestro ejemplo y verlo funcionando debemos ejecutar 2 clases (el orden sería indistinto):

  • SendMessagesToRabbit
  • RabbitMQTopologyExample

Al ejecutar la clase SendMessagesToRabbit, podremos ver en el cliente Web de RabbitMQ como la cola tendrá 10000 mensajes encolados. Al ejecutar la topología (ejecutando la clase RabbitMQTopologyExample) podremos ver como los mensajes se van desencolando y a su vez por linea de comandos (por ejemplo de nuestro editor) veremos los mensajes que en teoría el bolt leyó y procesó.

Espero que les sea de utilidad y disfruten con este framework, desde mi punto de vista es sencillo y funciona bien, incluso la nueva herramienta que utiliza Twitter posee retrocompatibilidad con Storm por lo cual se podría empezar con un ejemplo de este tipo.

Clic aquí para ir al repositorio github.

Sabias que Java posee una clase Void

Hacía mas de 2 años que quería hacer este post, porque me parece algo bastante curioso. De hecho fue en el 2012 que me enteré de la existencia de la clase java.lang.Void pero lo verdaderamente interesante es que esta clase existe desde la versión 1.1 del jdk.

De acuerdo a la documentación de la API “La clase Void es un comodín para almacenar una referencia a objetos de clases representando la palabra clave void.”

A continuación un ejemplo que muestran el uso de la clase Void. La primera parte es con Generics (que de hecho fue así como me enteré de su existencia), lo que me resulta curioso es que quizás ahora este sea su uso mas extendido aun cuando Generics apareció en la versión 5 de Java. La segunda parte es con reflection el cual creo que fue el primer caso de uso de esta clase Void.

Web scraping con Java

Actualmente me encuentro desarrollando mi proyecto final de máster, el cual consiste en crear un modelo de aprendizaje automático que arroje predicciones acerca de partidos de futbol de la liga de primera división española. Para ello he necesitado entre otras cosas tener los resultados de todas las jornadas de las ultimas ligas. Aunque recientemente conseguí un paquete de R (enlace) que contenía los resultados desde 1929, este no me proporcionaba toda la información que yo buscaba, así que me decidí por obtener yo mismo esa información sacándola de las paginas deportivas y es lo que quiero compartir con ustedes.

En un principio pense en hacerlo en python con la biblioteca lxml, pero haciendo una búsqueda rápida por Internet encontré un proyecto en Java llamado Jsoup y debo decir que este si me simplifico la tarea.

Primero como todos saben es necesario que demos un repaso a la estructura del documento que vamos a scrapear y confirmar que hay un patron.

estructura documento html

Como pueden ver en la imagen, podemos detallar que todas las filas de las tablas de las jornadas comparten el atributo itemtype=”http://schema.org/SportEvent”, así que este fue el que utilicé para obtener todas las filas y a partir de allí obtener los nombres de los equipos, el resultado y el enlace para ir al detalle del partido.

Par de cosas que quisiera comentar con respecto al código:

  • Podemos aplicar expresiones sobre elementos de antemano obtenidos, por ejemplo como se hizo para obtener los equipos que intervienen en el partido.
  • Existe otra forma además de la anteriormente explicada (usando expresiones) para obtener elementos del árbol DOM de la página Web, si damos un vistazo a la API de la biblioteca del partido, existe un método getElementsByAttributeValue, entonces para obtener el elemento score, este se pudo haber obtenido también de la siguiente manera

    Elements score = match.getElementsByAttributeValue(“class”, “resultado resul_post”)

  • Por último si quisiéramos obtener mas datos por ejemplo del detalle del partido (ya que logramos obtener el url), esta biblioteca nos permite seguir navegando (haciendo conexiones), y sería cuestión de realizar otra conexión y de nuevo empezar a extraer elementos.
    Document detalleDelPartido = Jsoup.connect(statsLink).get()

Aquí les dejo el enlace al repositorio GitHub y espero que les pueda ser de utilidad.

Primer ejemplo con apache spark

Hace algunas semanas atrás que empezamos a trabajar con apache spark en el máster, brevemente les contare mis impresiones desde mi punto de vista como principiante.

Apache spark me gusto, ¿por qué? porque se puede programar en Scala (además de Python y Java),  la API de Scala lo simplifica mucho y la cantidad de código a teclear es (considerablemente) menor a la necesaria para hacer la misma tarea en Java, aunque aquí debo hacer un paréntesis, ya que con la entrada de Java 8 y las lambda expresión la cantidad de código será menor pero insisto la API de Scala a mi modo de ver lo hace mas sencillo.

Nos permite hacer operaciones con mucha data (quizás no Big Data, es decir no hablamos de TeraBytes) sin necesidad de usar Hadoop, me gustaría hacer hincapié en esto ya que muchos piensan que Big Data es Hadoop y NO, no es así, mi concepto de Big Data es un poco mas amplio y contempla mas cosas, aquí me refiero específicamente a la API MapReduce de Hadoop la cual es mas complicada de usar que la de Spark, no obstante si necesitamos trabajar con una cantidad de datos considerable que requiera del uso de HDFS, podemos desde Spark acceder a este sistema de archivo u algún otro como por ejemplo Amazon S3.

Por último decirles que Spark es mas rapido, esto se debe a su arquitectura, ya que este trabaja en memoria (todo en memoria si tiene la capacidad de cargar todos los datos por completo) y pues si llegamos a hacer varias tareas (lo que técnicamente sería reutilizar los RDD ya guardados en memoria) con los datos en memoria es cuando mas jugo se le sacará a Spark.

Sinceramente si alguien discrepa de mi o coincide me entusiasmaría mucho que comparta su opinión ya que todo este mundo que envuelve el Big Data me tiene super enganchado.

 Ahora bien vamos con los ejemplos, estas formaban parte de la primera tarea de Spark que tuvimos que realizar, y consiste en 2 ejemplos:

  1. Dado un fichero de texto en formato csv con información de medallistas olímpicos, obtener el numero de medallas por edad.
  2. Dado el mismo fichero de texto anterior, y un esquema de puntuación por tipo de medalla obtener un ranking de medallistas olímpicos.

He aqui el código:

 

Una última cosa que es bueno saber para aquellos que como yo están empezando con Spark y sus RDD, Los RDD tienen 2 tipos de operaciones: transformaciones y acciones, las primeras son operaciones que como resultado nos devuelven otro RDD y las acciones son aquellas que hacen “algo” sobre los datos como por ejemplo el foreach de mi código,  utilizado para mostrar por pantalla los valores finales, además los RDD (como hasta ahora lo entiendo) son las instrucciones a realizar sobre los datos, mas no almacenan la información, además estás instrucciones no se realizan de inmediato, sino que al contrario estos tienen un funcionamiento lazy, esto significa que se ejecutan cada vez que se realiza una operación de tipo acción.

Otra sugerencia, no duden en cacharrear con la consola de spark, de hecho el primer ejercicio lo llegue a hacer por la consola (sin los JavaBeans) y el practicar por aquí si que ayuda a conocer los operaciones a utilizar sobre los RDD.

Aquellos interesados en descargar el código, les dejo la dirección del ejercicio en mi repositorio github

El esqueleto del ejercicio esta en el repositorio del que fue nuestro profesor y pueden acceder a el haciendo clic aquí.

Cualquier material, idea o contenido que quieres compartir, no dudes en hacerlo, ya que bien recibido será. Ahora si para cerrar les dejo el enlace a un libro que hasta ahora me esta pareciendo muy bueno para aprender Spark (además con ejemplos elaborados en Java, Scala y Python).

Gephi una herramienta de visualización de redes

Esta semana en el Master empezamos con una nueva materia denominada “Análisis de redes sociales”, el inicio ha sido bastante interesante, de hecho me pareció chévere, pero lo que quiero compartir con todos ustedes es la herramienta que vimos el primer día, esta se llama Gephi, es una herramienta open source hecha en Java para la visualización  de redes y pues nosotros empezamos analizando nuestra red social Facebook.

Visualización de mi red social Facebook

Visualización de mi red social Facebook

 Para que la herramienta funcione correctamente en Mac OSX hay que ser una serie de “trucos” y apaños (como ejecutarlo en Java 6) porque en caso contrario seremos incapaces de ni siquiera arrancar la aplicación. Aquí les dejo el enlace donde aparecen los pasos necesarios de configuración para poder ejecutarlo en Mac OSX.

La imagen de mas arriba es una perspectiva de todos los nodos que forman parte de mi red social Facebook. Para poder visualizar mi red de Facebook tuvimos que descargarnos un fichero de extensión .gml desde esta página donde podemos indicar que información queremos obtener de nuestra red de contactos, como sexo, lenguaje, entre otros.

Me gusto la herramienta no solo por lo versátil al momento de visualizar el diagrama y los resultados que obtuve (como las agrupaciones de nodos que son fácilmente identificables), sino porque tenia (y tengo) en mente hacer una visualización de mi red de Twitter, pero con Java y Neo4j, aunque ya compañeros del master me han hecho llegar un proyecto que genera el fichero .gml, por lo cual quizás visualice antes en Gephi mi red de Twitter. Sin mas dilación aquí les dejo el componente gigante de mi red donde señalo sus agrupaciones.

Componente gigante de mi red de Facebook

Componente gigante de mi red de Facebook

¿Alguno de ustedes ha hecho un análisis de alguna de sus redes sociales? ¿Que herramienta utilizaste? Si te animas a analizar alguna de tus redes sociales con Gephi, no dudes en compartir tu resultados con nosotros

Sabias que el uso de la annotation override nos advierte de errores en el código

Seguramente muchos de ustedes se habrán preguntado ¿que hace? o ¿para qué sirve esa @Override que nos coloca automáticamente el IDE al momento de implementar una interfaz? ¿Tendrá algún beneficio?.

Bueno para aquellos con esa interrogante les traigo la respuesta.

Pues si, si nos da un beneficio  cuando codificamos y consiste en advertirnos de posibles errores de lógica o compilación en los siguientes casos:

  • Cuando no estemos sobrescribiendo o implementando ningún método de la interfaz o superclase.
  • Cuando nos hemos equivocado en la firma del método a sobrescribir.

 Es por estos beneficios que deberíamos asumirlo (sobretodo aquellos que venimos de la vieja escuela de Java 1.1, 1.2 o 1.4) como una convención al momento de programar. Ahora bien vayamos a un ejemplo para ver de lo que estamos hablando.

EL siguiente código consta de una super clase la cual vamos a extenderla pero a propósito de este ejemplo sobrescribiremos erróneamente los métodos de la clase de tal forma que no coincidan en su firma con el original (el de la súper clase) o sencillamente no coincida el nombre del método, de tal forma de poder ver como al usar @Override, esta nos indica que hay algo mal, en nuestro código.

A continuación les dejo par de imágenes donde el IDE nos indica el error

IDE error al sobrescribir el método IDE error al sobrescribir el método

 

Como pudieron darse cuenta el Editor (en este caso eclipse), nos indica que hay un error en los métodos que estamos intentando sobrescribir.

Ya conocemos el significado de @Override y sus ventajas, ahora lo que resta es que hagamos uso de ella y lo asumamos como una buena practica de programación en Java.

Introducción a la clase Objects

Hace algunos meses atrás estudiando para la certificación de java 7, me entere de la existencia de la clase java.util.Objects, esta es una clase utilitaria compuesta en su totalidad de métodos estáticos que aunque lucen bastante simples, si que resultan de ayuda ahorrándonos algo de trabajo (tedioso), entre estos encontramos algunos para realizar comparaciones así como para el calculo del hash de un objeto, o también para evitar asignar null a objetos.

En este caso creo que no hay mejor forma que verlo en el código para que podamos apreciar su utilidad.

Si ejecutamos el main de esta clase obtendríamos el siguiente resultado

Además de los métodos utilizados existen un par más que son para calcular si dos (2) objetos son profundamente iguales y para realizar comparaciones.

¿Qué te ha parecido esta clase? ¿Ya la conocías? ¿La utilizas en tus desarrollos? y sino a que esperas.