Tag : Tips de Java

Tips para programadores

Aprende un nuevo lenguaje

Es sabido que no debes enfocarte en una sola tecnología o lenguaje de programación.   Pero el sentido de este consejo no es sólo que escojas una tecnología que te permita ganar más dinero (que también es una buena idea), sino que además de eso te permita experimentar y hacer cosas diferentes. Por ejemplo, si siempre has estado enfocado a aplicaciones WEB, puedes comenzar a experimentar con el control de motores eléctricos o para obtener datos desde sensores o hardware que no hayas usado anteriormente, o probar también con aplicaciones para móviles, tendrás una perspectiva más amplia de lo que es el desarrollo de software.


Ten un  “Pet Project”

Todos tenemos ideas para una aplicación o desarrollo que nos gustaría programar.  Sin embargo pocas veces las materializamos.  Esto no sólo es malo porque pierdes la oportunidad de llevar a cabo una buena idea, sino que también es posible que nunca sepas si esa idea es mala o que en realidad no sea tan útil, o peor aún, que ya exista algo parecido porque no habías investigado demasiado y te enfoques mejor en otra cosa.  Adquiere el hábito de tener al menos un proyecto y ve agregando características poco a poco pero de forma constante.

Relaciónate con personas que hagan cosas diferentes

No sólo se trata de encontrar gente que use otras tecnologías, sino otras formas de hacer negocios y de ganar dinero.  Es posible que encuentres oportunidades donde otros no las han visto, tan sólo porque no ha llegado nadie para propornerlas.  No te enfoques sólo a entender los problemas de los clientes de la empresa donde trabajes.

Haz que tu trabajo se vea elegante

Son muchos los desarrolladores que descuidan el aspecto visual de su trabajo y sólo se preocupan porque funcione correctamente.  Sin embargo una apariencia visual o usabilidad deficientes, pueden hacer que el usuario tenga una impresión equivocada sobre como funcionan tus desarrollos y llegue a pensar que tiene errores aún cuando esto no sea verdad, recuerda que haces desarrollo para facilitarle la vida a personas que no siempre tienen un conocimiento técnico silimar al tuyo.

No inventes cosas que ya están bien hechas

Lenguajes como Java o C# no son los más ampliamente usados por su sintaxis o su facilidad de uso, sino por la inmensa variedad de librerías o herramientas que existen y que puedes usar libremente, con la seguridad de que van a funcionar correctamente. No gastes tu tiempo tratndo de hacer algo que ya existe si no lo vas a superar.

Comparte y acepta críticas a tu código

Es universal. Ocurre en todas las profesiones. A nadie le gusta que le digan como hacer cosas que uno supone hace bien.  Pero compartir ideas y tomar en cuenta las recomendaciones de otros es casi tan útil como Google para aprender cosas nuevas.  Además mejoras tu ambiente laboral.

Crea librerías de ejemplos o soluciones

No es que tengas que desarrollar librerías nuevas, se trata más bien de esos ejemplos, como conectarte a bases de datos, nombres de drivers, herramientas, comandos, funciones o técnicas de desarrollo que quizá aplicarás en tus proyectos más de una vez. En cualquier momento puedes usar el buscador y encontrar prácticamente todo lo que necesites, pero tener cosas ya probadas previamente por tí, es muy útil.

Descansa lejos de la computadora

Esto debes hacerlo por puro amor propio y no sólo es descansar, ejercítate.  Algunos problemas de espalda y ojos derivados de pasar horas sentados frente a la computadora pueden agravarse y son difíciles de tratar.  Cuida tu cuerpo.

 


El método main

¿Porque el método “main()” en Java es declarado como public
static void main?
¿Qué pasa si el método es declarado como privado?

  • public. El
    modificador de acceso para el método main
    tiene que ser público para permitir la llamada desde cualquier lugar fuera del
    alcance del proyecto. Fuera de la clase, fuera del paquete.
  • static. Cuando
    la máquina virtual hace una llamada al método main, no existe un objeto para
    que la clase comience a ser llamada, así que debe ser estática para permitir la
    invocación de la clase.
  • void. Porque Java es un lenguaje independiente de la plataforma,
    entonces si se regresara algún valor de retorno este tendría que adaptarse a
    las diferentes plataformas en la que se ejecute a diferencia de C, en Java no
    se puede restringir un tipo de retorno ligado seguramente a su disponibilidad
    en la plataforma en la que esté corriendo.


¿Cuál es la diferencia entre String, StringBuffer y StringBuilder?

La principal diferencia entre las tres clases String mas
comúnmente usadas son:
  • StringBuffer y StringBuilder son mutables, mientras que
    String es inmutable.
  • La  implementación de
    la clase StringBuffer  es sincronized
    (sincronizada) mientras StringBuilder no.
  • El operador de concatenación “+” es implementado
    internamente por Java usando StringBuffer o StringBuilder.

Criterios para usar String, StringBuffer o StringBuilder:
  • Su el valor del objeto no cambiará, entonces es mejor usar
    String, dado que es inmutable.
  • Si el valor del objeto puede cambiar y solo será modificado
    por un mismo hilo o thread, entonces usa StringBuilder, porque StringBuilder es
    unsynchronized (no sincronizado) lo cual significa que será mas rápido.
  • Si el valor del objeto puede cambiar y puede ser modificado
    por mas de un hilo la mejor opción es StringBuffer porque es thread safe
    (sincronizado).


Anti-Patrones Java – Concatenación de cadenas

Veamos el siguiente ejemplo.

String s = "";

for (Persona p : personas) {
s += ", " + p.getNombre();
}
s = s.substring(2); //Quita la primera coma

Este código muestra un ejemplo claro de una mala práctica que puede afectar el rendimiento óptimo de una aplicación, su tiempo de ejecución es de orden aproximado O(personas.length²). La concatenación repetitiva de cadenas en ciclos causa exceso de basura y copiado de arreglos. Además es necesario remover la última coma, lo cual es evidentemente un parte fea del código.

La siguiente sería una mejor práctica:

StringBuilder sb = new StringBuilder(personas.size() * 16); // Con una estimacion inicial del tamaño del buffer

for (Persona p : personas) {
if (sb.length() > 0) sb.append(", ");
sb.append(p.getNombre);
}

Que incluye además una estimación inicial del tamaño del buffer.


Invocar al recolector de basura

Java y otros lenguajes tienen un mecanismo de liberación de memoria llamado Garbage Collector, el cual permite reutilizar la memoria durante la ejecución de un programa. Se puede llamar al recolector de basura utilizando System.gc() o Runtime.getRuntime.gc(). Aunque hacer esto no se considera buena práctica ya que tiene repercusiones importantes en el rendimiento de una aplicación. La mejor práctica es no tener que llamar a estos métodos haciendo un buen diseño y uso de los recursos.

La descripción en la documentación para estos métodos es la siguiente:


System.gc()

Hace correr al recolector de basura.

Al llamar al método gc se sugiere a la máquina virtual realice un esfuerzo de reciclaje de objetos no utilizados con el fin de hacer que la memoria que estos objetos ocupan esté disponible para su uso rápido. Cuando se devuelve el control de la llamada al método, la maquina virtual de java ha hecho su mejor esfuerzo para recuperar el espacio de los objetos desechados.

La llamada System.gc() es efectivamente equivalente a la llamada Runtime.getRuntime.gc()


Runtime.getRuntime.gc()


Hace correr al recolector de basura. Al llamar a este método se sugiere a la maquina virtual realice su mayor es fuerzo de reciclaje de objetos no utilizados con el fin de hacer que la memoria que estos objetos ocupan esté disponible para su uso rápido. Cuando se devuelve el control de la llamada a al método, la máquina virtual ha hecho su mejor esfuerzo para recuperar el espacio de los objetos desechados.

La maquina virtual lleva a cabo este proceso de reciclaje de forma automática cuando es necesario, en un hilo separado, incluso si el método gc no se invoca explícitamente.

El método System.gc() es el medio convencional y conveniente de la invocación de este proceso. En algunas ocasiones esta invocación no tendrá mayor efecto, ya que la liberación de recursos nunca está garantizada.


Java versión 7

Oracle ha lanzado la versión 7 de Java. Algunas de las mejoras las listamos a continuación.

Maquina Virtual

  • JSR 292: Soporte para lenguajes escritos dinámicamente (InvokeDynamic)
  • Revisión estricta de archivos clase

Lenguaje

  • JSR 334: Mejoras pequeñas al lenguaje (Project Coin)

Core

  • Actualización de la arquitectura de carga de clases
  • Método para cerrar un URLClassLoader
  • Actualizaciones a concurrencia y colecciones (jsr166y)

Internacionalización

  • Soporte a Unicode 6.0
  • Mejoras en la API Locale
  • Localización de usuario separada y localización interfaz de usuario

IO y Networking

  • JSR 203: Nuevas APIs IO para la plataforma Java (NIO.2)
  • Un proveedor de sistema de archivos NIO.2 para archivos zip/jar
  • SCTP (Protocolo de transmisión de control de flujos)
  • SDP (Protocolo directo de sockets )
  • Uso de la pila IPv6 de Windows Vista
  • Soporte para TLS 1.2

Seguridad y Criptografía

  • Implementación de criptografía elliptic-curve (ECC)

Conectividad y Bases de Datos

  • JDBC 4.1

Cliente

  • XRender para Java 2D
  • Permite crear nuevas plataformas para gráficas 6u10
  • Nuevo look-and-feel Nimbus
  • Componente JLayer para Swing
  • Sintetizador de sonido Gervill

Web

  • Actualización de la pila de XML

Administración

  • MBeans mejorados

Mejoras diferidas a la versión de JDK8 o superiores

  • JSR 294: Soporte a la máquina virtual y al lenguaje para programación modular
  • JSR308: Anotaciones sobre tipos de java
  • JSR TBD: Proyecto Lambda
  • Modularización (Proyecto Jigsaw)
  • JSR 296: Marco de trabajo para aplicaciones Swing
  • Componente Swing JDatePicker
Puedes ver mas detalle en el artículo original de openjdk.java.net en:

Tips – commons-io-x.jar

En muchas soluciones de la vida real es necesario manipular y leer el contenido de archivos y es muy común que en un principio se trate de utilizar solo las clases del paquete java.io, esto esta bien si se quiere optimizar la lectura o manipulación de archivos o se requiere una solución a un problema especifico. Sin embargo existen los Apache Commons, que es un conjunto de librerías para una gran variedad de problemas y una de esas librerías es commons-io.jar que viene con la clase FileUtils y que facilita el manejo de archivos. Aquí enlistamos algunas de las funciones de esa clase que la hacen bastante útil.

  • Permite escribir a un archivo
  • Leer desde un archivo
  • Crear directorios, incluyendo directorios padres (de forma recursiva)
  • Copiar archivos y directorios
  • Borrar archivos y directorios
  • Covertir hacia o desde una URL
  • Listar archivos y directorios con filtros y extensión
  • Comparar el contenido de archivos
  • Obtener el última fecha de actualizacion
  • Calcular checksum, entre otras.

Aqui un pequeño ejemplo para convertir un archivo de texto a String o traer una lista de archivos desde un directorio y filtrando extensiones.

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;

public class Prueba {
public static void main(String[] args) {
//Leer el contenido de un archivo de texto y depositarlo en un String
File archivo = new File("ejemplo.txt");

//Traer una lista de archivos filtrando la extensión
File root = new File("/proy");
try {
// Leer el contenido de un archivo y copiarlo a un String
String content = FileUtils.readFileToString(archivo);
System.out.println("File content: " + content);

//Obtener una lista de archivos de forma recursiva contenida en un directorio
String[] extensiones = {"xml", "java", "dat"};
boolean recursivo = true;

Collection lisaArchivos = FileUtils.listFiles(root, extensiones, recursivo);
for (Iterator iterator = lisaArchivos.iterator(); iterator.hasNext();) {
File archivoAux = (File) iterator.next();
System.out.println("> " + archivoAux.getAbsolutePath());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}