La palabra reservada final en Java

Se emplea final para impedir cambios para elementos de variables, métodos y/o clases. Se puede querer evitar cambios debido a nuestro diseño o la búsqueda de eficiencia y seguridad. Vamos a ver tres maneras de usar la palabra reservada final en Java

1 - Variables

Una variable con la palabra final delante, es una variable cuyo valor no puede cambiar después de que haya sido inicializada. Por ello, esta es la manera de definir constantes en java. Por ejemplo:

       public static final String ERROR_GENERICO = "Error";

El valor de la variable ERROR_GENERICO no va a cambiar una vez que fue inicializada.

Por lo general, en la declaración de variables, la palabra reservada final viene acompañada de static. Además, la mayoría de los programadores declaran a las variables todas en mayúsculas por convención. De esta manera, es fácil reconocer el uso de "variables finales" en los programas.

Ver más información sobre la palabra reservada static.

2 - Métodos

Un método con la palabra final delante, es un método que no puede ser sobreescrito por una subclase. Es decir, si la clase en donde está definido dicho método con final alguna subclase que extienda de ella, esta subclase no podrá contener métodos que lo sobreescriban al primero. Si se intenta hacer esto, el compilador mostrará un error indicando "Overridden method final". Por ejemplo:

     public class ClaseBase{
          public final void agregarDato(){
                 //implementación del método
          }
     }

     public class ClaseQueExtiendeDeClaseBase extends ClaseBase{
            //ESTO NO PUEDE HACERSE:
            public void agregarDato(){
                   //otra implementación para este método sobreescrito
            }
      }

     - Por lo general, se debe evitar declarar "métodos finales". A pesar de que se podría pensar que una subclase no tendría que sobreescribir un método, no podemos estar 100% seguros de lo que otra clase quiere hacer con la nuestra.
     - Los "métodos finales" son más eficientes debido a que el compilador sabe en tiempo de compilación que una llamada a un "método final" no va a ser sobreescrito por algún otro método.
     - Los métodos privados son automáticamente considerados como "finales".

3 - Clases

Una clase con la palabra final delante, es una clase que no puede ser usada (extendida) por otra clase, es decir, no permite hacer un "extend" de ella.













La palabra reservada static en Java

En Java, vamos a llamar miembro estático a una parte de una clase (variable o método) que tenga asociada la palabra reservada “static”. Un miembro estático no está asociado con ninguna instancia de la clase que lo contenga, sino que pertenece a la clase misma. ¿Qué quiero decir con esto? Que podemos acceder a los miembros estáticos de una clase sin la necesidad de crear instancias de la misma.

Existen dos tipos de miembros estáticos como bien dijimos: variables estáticas y métodos estáticos.

Variables Estáticas:

Se trata de una variable declarada con la palabra static, por ejemplo:

      private static int contador;

Por convención, la mayoría de los programadores tienden a respetar esa estructura (visibilidad+palabra static+...) pero también funciona si colocamos la palabra static al principio de la declaración y luego la visiblidad (public, private, protected).

El valor de una variable estática es el mismo en todas las instancias de la clase. Por ejemplo, si una clase tiene una variable estática nombreDeLaEmpresa, con un valor asignado “Empresa X S.A.”, entonces todos los objetos creados desde la clase tendrán ese mismo valor “Empresa X S.A.” para esa variable nombreDeLaEmpresa.

Las variables estáticas son creadas e inicializadas cuando se carga por primera vez la clase. Esto sucede cuando un miembro estático de la clase es mencionado (Clase.miembroEstático;) o cuando se crea una instancia de la clase, lo que ocurra primero.

Métodos Estáticos:

Al igual que las variables estáticas, se trata de métodos declarados con la palabra static, por ejemplo:

     public static void calcularSaldo(int parámetro);

También están asociados con la clase misma y no con un objeto particular creado desde la clase. Es decir, no se necesita crear ningún objeto de una clase para que se puedan usar los métodos estáticos definidos en ella.

El método más conocido es el public static void main, que es llamado por la máquina virtual de Java al iniciar una aplicación. Este método debe ser estático, lo que significa que las aplicaciones se ejecutan en un contexto estático por defecto.

Sin embargo existen reglas que debemos respetar a la hora de trabajar con métodos estáticos. Una de ellas es que no se puede acceder a métodos o variables que NO SEAN estáticos desde un método estático. Esto se debe a que los métodos estáticos no tienen una instancia de la clase que es la que se utiliza para referenciar variables o métodos de instancia.





Ingeniería de Usabilidad. Criterios a incorporar en el desarrollo de software

Cuarta Jornada de Integración, Extensión y Actualización de Estudiantes Universitarios de Informática (JOINEA) organizado por la Comisión Estudiantil de las Carreras Analista de Sistemas de Computación y Licenciatura en Sistemas de Información, realizado en el Módulo de Informática de la Facultad de Ciencias Exactas, Químicas y Naturales de la Universidad Nacional de Misiones, ubicada en Apóstoles, Misiones. Septiembre, 2012. (Resolución 239/12).



El patrón Singleton

    El singletón es un patrón de diseño que significa "instancia única". Se utiliza para restringir la creación de objetos pertenecientes a una clase (la que será nuestro Singletón) o el valor de un tipo a un único objeto.
   El objetivo principal es asegurar que la clase no pueda ser instanciada más de una única vez, es decir, garantizar que la clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.
    Las situaciones más habituales de aplicación de este patrón son aquellas en las que dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o un archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible para todos los demás objetos de la aplicación.
    Para crear una clase singletón, primero tenemos que pensar en el objetivo principal del mismo, o sea que solo permita crear una única instancia de la misma. Para solucionar esto, vamos a dividirlo en dos pasos:
1 - Como sabemos, la manera de crear una instancia de una clase es a través de su constructor, por ende, si el constructor de la clase es privado, ninguna otra clase tendrá acceso al mimo, por lo cual no van a poder crear instancias del mismo. Con esto tenemos solucionado que no se creen instancias de esa clase. Sin embargo, QUEREMOS crear UNA, pasemos al siguiente paso.
2 - Una vez que nuestro constructor es privado, ninguna clase externa tiene acceso al mismo, pero sí la misma clase que lo contiene, por ende, podemos crear instancias de nuestra clase desde la misma. Si escribimos un método PUBLICO que retorne una instancia de la clase, dicho método podría ser accedido desde afuera para crear instancias de la misma. El problema es nuevamente que podemos llamar tantas veces al método como queramos y con esto nuevamente vamos a poder crear muchas instancias de la clase. La solución final radica en colocar un condicional dentro del método que pregunte si ya está creada la instancia (a través de una variable), entonces retornar simplemente la misma, de lo contrario crearla por primera vez y retornarla.

Ejemplo:

public class Singleton{
   
     //creamos la variable por la cual preguntaremos en el método si es nula o no.
     private static Singleton singleton;

     //creamos nuestro constructor privado
     private Singleton(){}

     //finalmente nuestro método para retornar la instancia del Singletón
      public static Singleton getSingleton(){
          //Preguntamos si el singletón ya fue inicializado
          if(singleton==null) {
                  singleton = new  Singleton();
         }
         return singleton;
       }

}


Desde una clase externa para obtener la instancia de esa clase Singletón simplemente basta con hacer:

Singletón singletón = Singletón.getSingletón();

Es decir, acceder al método público que nos brinda la clase Singletón.

La instrumentación del patrón puede ser delicada en programas con múltiples hilos de ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no existe todavía, sólo uno de ellos debe lograr crear el objeto. La solución clásica para este problema es utilizar exclusión mutua en el método de creación de la clase que implementa el patrón.

Como conclusión:
El patrón singleton provee una única instancia global gracias a que:
  -  La propia clase es responsable de crear la única instancia.
  -  Permite el acceso global a dicha instancia mediante un método de clase.
  -  Declara el constructor de clase como privado para que no sea instanciable directamente.


Saludos.


Herramienta para la Evaluación de Usabilidad en Productos Software

XIX Reunión de Comunicaciones Científicas y Tecnológicas
Lugar de exposición: Universidad Nacional del Nordeste. Campus - Resistencia, Chaco. Argentina.
Fecha de exposición: 13 de junio de 2013
Resolución: 0782/2013

    Dada la amplia penetración de la informática en la vida cotidiana, usuarios de todos los niveles tienen acceso a aplicaciones de software. Por tal motivo, la usabilidad del software adquirió relevancia en el desarrollo de sistemas informáticos. Según el estándar ISO 9241, la usabilidad se define como “el grado en el que un producto puede ser utilizado por usuarios específicos para conseguir objetivos específicos con efectividad, eficiencia y satisfacción en un determinado contexto de uso”. En este sentido, la usabilidad es un aspecto importante del software, dado que reduce los errores cometidos por los usuarios, aumenta su satisfacción en la concreción de las tareas, etc., de lo cual se desprende que la usabilidad es uno de los factores que influye en la calidad del software.
      En este contexto, se propone elaborar una aplicación informática para comprobar el grado de usabilidad de productos software, con el objetivo de aportar metodologías y herramientas que contribuyan a la mejora de la calidad del software, con lo cual se espera contribuir a la promoción de la industria del software en la región de influencia de la universidad a través de actividades de transferencia hacia las pymes de software.
   Para lograr este objetivo, se realizó una exploración acerca de los conceptos de la Ingeniería de Usabilidad, lo cual permitió diseñar un instrumento de recolección de información, a fin de determinar el grado de  importancia que conceden a la usabilidad las empresas que desarrollan software en la región. Se realizaron entrevistas con los responsables de dichas empresas, obteniéndose información acerca de dos aspectos principales: el perfil del usuario y las técnicas de usabilidad que se utilizan. El análisis de los datos permitió concluir que las empresas no desconocen la importancia de la usabilidad, e incorporan algunas técnicas específicas, sin embargo dan escasa participación a los usuarios en las etapas de diseño y evaluación del producto desarrollado. Este escenario podría llevar a la producción de software con déficits de usabilidad. Además se observó que en general se prioriza el costo y el tiempo de desarrollo, relegando el tratamiento de la usabilidad.
    Estos resultados impulsaron el diseño de una herramienta que facilite la evaluación de la usabilidad en productos software, y permita automatizar algunos aspectos de la misma. La herramienta se compone de dos partes: una que permite comprobar el cumplimiento de los estándares de usabilidad y la aplicación de criterios heurísticos tomados de diferentes autores, mediante formularios específicos a ser completados por un experto en usabilidad, y otra que presenta un cuestionario de percepción del usuario, a ser completado en base a las opiniones de los usuarios. Dicho cuestionario fue diseñado como resultado de un estudio exploratorio de cómo un conjunto de usuarios de diferentes perfiles (novatos, intermedios y expertos) realizan una serie de tareas en una aplicación determinada. Para el cumplimiento de estándares se analizan elementos tales como ventanas y botones, organización de la información (listas, tablas, etiquetas, etc.), combinación de colores, etc.
     Al finalizar, la herramienta analiza los datos y genera un informe con los resultados obtenidos, ofreciendo una valoración acerca del grado de usabilidad alcanzado.

Poster presentado:

Introducción a Java Media Framework


Guía Práctica del Taller

Gestión eficiente de errores: Excepciones en Java



Seguridad en los sistemas distribuidos




Trabajo Completo

Automatización de la evaluación de la usabilidad del software

XV Workshop de Investigadores en Ciencias de la Computación (WICC).
Lugar de exposición: Universidad Autónoma de Entre Ríos. Facultad de Ciencia y Tecnología. Centro Cultural y de Convenciones “La Vieja Usina”. Paraná, Entre Ríos. Argentina.
Fecha de exposición: 18 de abril de 2013
ISBN: 978-987-281-796-1

Resumen:
La usabilidad es una cualidad que se considera cada vez más importante para la calidad de los productos software. Es un atributo intangible del mismo, por lo tanto, resulta difícil de visualizar, medir y reconocer como un factor determinante de su calidad. En esta línea de trabajo se propone el desarrollo de una herramienta que facilite la evaluación de la usabilidad durante el proceso de desarrollo, basada en la aplicación de los estándares vigentes y criterios heurísticos sobre usabilidad. La herramienta formará parte de una metodología de medición cuyo objetivo es facilitar en el contexto de desarrollo de las pymes la implementación y evaluación de la usabilidad del software.


Publicación Completa

Herramienta para automatizar la evaluación de la usabilidad en productos software

XVIII Congreso Argentino de Ciencias de la Computación (CACIC).
Lugar de exposición: Universidad Nacional del Sur. Departamento de Ingeniería Eléctrica y de Computadoras. Bahía Blanca, Buenos Aires. Argentina.
Fecha de exposición: 11 de octubre de 2012.
ISBN: 978-987-1648-34-4

Resumen:
La usabilidad es un atributo intangible del software, por lo tanto, es difícil de visualizar, medir y reconocer como un factor determinante de su calidad. Esto podría provocar que los productos software tengan un nivel de usabilidad deficiente, cuando una mayor atención por este aspecto contribuiría a incrementar la calidad del producto percibida por el usuario, sin un aumento excesivo en el costo de desarrollo. En este trabajo se presenta una propuesta de herramienta que facilita la evaluación de la usabilidad durante el proceso de desarrollo mediante cuestionarios que recaban y ponderan la percepción de los usuarios, y otros que comprueban mediante un experto el cumplimiento de los estándares y criterios heurísticos de usabilidad.

Publicación Completa

Técnicas de usabilidad. Estudio exploratorio sobre su incorporación en los procesos de desarrollo de software en PyMes locales

II Jornada de Investigación en Ingeniería del NEA y Países Limítrofes (IIJCyT).
Lugar de exposición: Universidad Tecnológica Nacional. Facultad Regional de Resistencia. Chaco, Argentina.
Fecha de exposición: 15 de junio de 2012
ISBN: 978-950-42-0142-7

Resumen:
En la actualidad, la automatización abarca un amplio campo de las actividades humanas, por lo cual la mayoría de las personas es usuaria de algún software. Por ello, la usabilidad es fundamental para el desarrollo de sistemas que permitan a usuarios inexpertos poder manejarlos fácilmente satisfaciendo sus necesidades. En este trabajo se presenta una síntesis de los principales conceptos y los enfoques actuales que proponen la integración de la Ingeniería de Usabilidad a la Ingeniería del Software, como así también los resultados de un estudio exploratorio, basado en entrevistas, realizado en empresas pymes de software de la ciudad de Corrientes. Las entrevistas se organizaron en torno a un cuestionario guía, enfocado en recabar información acerca de la importancia que las empresas conceden a la usabilidad, qué técnicas se utilizan, cuál es el grado de participación de los usuarios y en qué etapa del ciclo de vida del software se incorporan los métodos y técnicas que aseguran un nivel de usabilidad acorde a los requerimientos del usuario. Los resultados preliminares indican que las empresas no desconocen la importancia de la usabilidad y que incorporan determinadas técnicas específicas; sin embargo, el grado de participación de los usuarios en el diseño de la interfaz es bajo y esta participación se da generalmente al inicio del proceso.


Publicación Completa

Calidad de software e Ingeniería de Usabilidad

XIV Workshop de Investigadores en Ciencias de la Computación (WICC).
Lugar de exposición: Facultad Nacional de Misiones. Facultad de Ciencias Exactas, Químicas y Naturales. Centro del Conocimiento. Posadas, Misiones. Argentina.
Fecha de exposición: 26 de abril de 2012
ISBN: 978-950-766-082-5

Resumen:
La usabilidad es un atributo intangible del software, por lo tanto, es difícil de visualizar, medir y reconocer como un factor determinante de su calidad. Esto genera que un gran número de productos software tengan un nivel de usabilidad deficiente, cuando una mayor atención por este aspecto contribuiría a incrementar la calidad del producto percibida por el usuario, sin un aumento excesivo en el costo de desarrollo. Es por ello que se pretende incorporar la denominada Ingeniería de Usabilidad dentro de la Ingeniería de Software, integrando las técnicas de usabilidad a lo largo de todo el proceso de desarrollo. En este trabajo se describen los principales conceptos sobre usabilidad y los enfoques actuales que proponen la integración de la Ingeniería de Usabilidad a la Ingeniería del Software, así como también la metodología seguida para recabar información acerca de la importancia que las pymes de software confieren a este tema.


Publicación Completa

Automation: WebDriverWait en lugar de Thread.sleep

Vamos a imaginarnos que estamos ejecutando un test en una aplicación web. El test viene de lo mejor, hasta un determinado momento que nuestro código ejecuta tan rápido los pasos en la página web que hace que no nos encontramos con algún elemento que estemos buscando. Esta es la famosa NoSuchElementException. Para reducir la velocidad de la prueba uno automáticamente piensa en colocar una pausa antes de que se busque por ese elemento. Así que se coloca un bloque similar a este:

try {
    Thread.sleep(5000);
} catch (InterruptedThreadException e) {
    //manejo de la excepción
}

Si ejecutamos la prueba de nuevo, la página espera 5 segundos y luego continúa con el test. Con esto pensamos que se resolvió el problema. Sin embargo, a medida que seguimos codeando tests, escribimos bloques de "Thread.sleep" en todo el código. Al final lo que logramos es un pérdida de tiempo en la ejecución de los tests, debido a estas esperas de 5 segundos.

Entonces, ¿cuál es la solución a este problema? Existe una clase llamada WebDriverWait, que hace lo que necesitamos con un poco de inteligencia. Simplemente, basta especificarle la condición por la que estamos esperando con ExpectedCondition (en nuestro caso esperar por un elemento), y decirle la cantidad  de tiempo límite que debe esperar.

En Selenium 2.6 esta técnica es múy fácil de implementar, sin embargo voy a mostrarles como utilizarla en las versiones anteriores y posteriores a esta.


Versiones anteriores de Selenium 2.06

WebDriverWait wait = new WebDriverWait(driver, 5); // tiempo límite de espera: 5 segundos

// se espera por la condición de que el elemento "ele" esté visible en la página
ExpectedCondition<Boolean> resultsAreDisplayed = new ExpectedCondition<Boolean>() {

    public Boolean apply(WebDriver driver) {
        return driver.findElement(By.id("ele")).isDisplayed();
    }
};

wait.until(resultsAreDisplayed);



Selenium 2.06 y versiones posteriores

Se puede utilizar el código del ejemplo anterior en versiones de Selinum 2.6 y superiores, pero a partir de esta última versión, la clase ExpectedConditions brinda una serie de métodos auxiliares que nos son muchisimos más útiles:
http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

Entonces, podemos hacer lo mismo que hicimos en el caso anterior, pero utilizando simplemente las siguientes líneas de código:

WebDriverWait wait = new WebDriverWait(driver, 5); // tiempo límite de espera: 5 segundos
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("ele")));


Simple, sencillo, fácil de implementar y mucho más óptimo.

Saludos.