Mostrando entradas con la etiqueta Informatica. Mostrar todas las entradas
Mostrando entradas con la etiqueta Informatica. Mostrar todas las entradas

17 de septiembre de 2011

Genericos y Colecciones Parte 1. Sobreescribiendo equals y hashCode

Genéricos y colecciones

Los genéricos fueron una de las características principales en el lanzamiento de Java 5. Con la salida de los genéricos cambio la forma en como podemos manejar colecciones en Java. Una de las características que tienen las colecciones es el poder ordenar y buscar entre los elementos que forman parte del contenido. Podemos establecer el criterio de búsqueda u ordenamiento para nuestras colecciones, pero para esto debemos sobrescribir los métodos equals y hashCode. En esta primera publicación tocaré el tema de sobrescribir los métodos equals y hashCode, las características de cada uno de estos métodos y algunos ejemplos.

Puntos a tocar en esta publicación:

  • Sobrescribiendo el método equals
  • Reglas que sigue el método equals
  • Ojo, mucho ojo.
  • Sobrescribiendo el método hashCode
  • ¿Que implica el hashcode?
  • Reglas que sigue el método hashCode
  • Ojo, mucho ojo.


Sobrescribiendo el método equals

Indagando en la javadoc acerca del método equals(Object o), podemos encontrar lo siguiente:

Método: equals(Object o)
Valor de retorno : boolean
Descripción: Indica si un objeto es igual a este.

Este método lo utilizamos para saber si un objeto es igual que otro. Este método utiliza el operador == para comparar a dos objetos y decidir si son iguales, por ejemplo podemos tener la siguiente clase:


public class Demo {

private int boleta;

public Demo(int boleta){
this.boleta = boleta;
}

public int getBoleta(){
return this.boleta;
}

public static void main(String[] args) {
Demo demoA = new Demo(20);
Demo demoB = new Demo(20);

System.out.println(demoA.equals(demoB));
}
}

La ejecución del anterior método main da como resultado en consola false. Esto es porque el método equals sin sobrescribir ocupa el operador == para comparar a dos objetos. Pero supongamos que queremos diferenciar a los objetos mediante su atributo boleta, ya que es el identificador de un Alumno para una aplicación escolar. Para esto debemos sobrescribir el método equals, diciéndole qué propiedad del objeto debe ser comparada para determinar si un objeto es igual a otro. El método sobrescrito se vería de esta forma:

@Override
public boolean equals(Object o){
if(( o instanceof Demo) && (((Demo)o).getBoleta() == this.boleta))
{
return true;
}else{
return false;
}
}

la tercera linea es la que tienen la magia. En ella hacemos un par de validaciones, la primera tiene que ver con estar seguros de que el objeto o es una instancia de la clase Demo, y la segunda es verificar si la propiedad boleta de el objeto o es igual a la propiedad boleta del objeto que invoco el método equals. Si los valores de boleta son los mismos, el método equals que sobrescribimos regresara true. Con esto nosotros tomamos la decisión sobre que criterio se debe tomar para comparar a nuestros objetos.

public static void main(String[] args) {
Demo demoA = new Demo(20);
Demo demoB = new Demo(20);

System.out.println(demoA.equals(demoB));
}

Por lo anterior, esta ejecución del método main, nos dará como resultado un true en la salida por consola.

Hay tipos de colecciones como los Sets que no nos permiten agregar objetos duplicados a la colección. La forma en como los Sets van a decidir si un objeto esta duplicado o no, la especificamos nosotros cuando sobrescribimos el método equals. Lo mismo cuando en una colección de tipo Hash* queremos buscar un elemento en especifico, la colección sabe que objeto regresar, dado el criterio que nosotros definimos al sobrescribir el método equals y hashCode. En esto radica la importancia de sobrescribir estos métodos, siempre y cuando este dentro de nuestras intenciones contar con este tipo de prestaciones.

Reglas que sigue el método equals

  • Reflexivo: Para cualquier referencia al valor x, x.equals(x) debe regresar true.
  • Simetrico: Para cualquier referencia a los valores x y z, x.equals(z) debe regresar true si y solo si z.equals(x) es true.
  • Transitivo. Para cualquier referencia a los valores w, x y z, si w.equals(x) regresa true y x.equals(z) regresa true, entonces w.equals(z) debe regresar true.
  • Consistente: Para cualquier referencia a los valores x y z, múltiples invocaciones a x.equals(z) consistentemente regresaran true o false, si es que los valores utilizados para la comparación de los objetos no ha sido modificada.
  • Para cualquier referencia no nula al valor x, x.equals(null), debe regresar false.

Ojo, mucho ojo

  • Asegúrate de sobrescribir el método equals. Las siguientes son implementaciones del método equals que son validas para el compilador, pero no validas para sobrescribir el método:
    • boolean equals(Objeto o). Esta implementación no sobreescribe el método equals de la clase Object, ya que el método debe ser declarado como public.
    • public boolean equals(Demo o). Esta implementación no sobreescribe el método equals de la clase Object, ya que el parámetro que necesita el método equals debe ser explícitamente un objeto de la clase Object, y no uno que extienda de éste. Esta implementación, al igual que la anterior es una sobrecarga del método equals, mas no sobreescribe este método.

La descripción correcta del método equals, es decir, la forma en como debe sobrescribirse es la siguiente:

public boolean equals(Objeto o);



Sobrescribiendo el método hashCode

¿Qué implica el hashcode?

Algunas colecciones usan el valor hashcode para ordenar y localizar a los objetos que están contenidos dentro de ellas. El hashcode es un numero entero, sin signo, que sirve en colecciones de tipo Hash* para un mejor funcionamiento en cuanto a performance. Este método debe ser sobrescrito en todas las clases que sobrescriban el método equals, si no se quiere tener un comportamiento extraño al utilizar las colecciones de tipo Hash* y otras clases. Si dos objetos son iguales según el método equals sobrescrito, estos deberian regresar el mismo hashcode. Véase el siguiente ejemplo:


public class Demo {

private int boleta;

public Demo(int boleta){
this.boleta = boleta;
}

public int getBoleta(){
return this.boleta;
}

@Override
public boolean equals(Object o){
if((o instanceof Demo) && (((Demo)o).getBoleta()== this.boleta))
{
return true;
}else{
return false;
}
}

public static void main(String[] args) {
Demo demoA = new Demo(20);
Demo demoB = new Demo(20);

System.out.println(demoA.equals(demoB));
System.out.println(demoA.hashCode());
System.out.println(demoB.hashCode());
}
}

Esto nos da como resultado:

true
1414159026
1569228633

regresa true porque estos objetos son iguales, debido a que se sobrescribió el método equals. Si son considerados iguales por equals, esto se reflejará al utilizarse en las colecciones de tipo Hash*. Lo que podemos ver en la salida de este código es que a pesar de que ambos objetos son iguales, el hashcode no es igual. Esto es porque no hemos sobrescrito el método hashCode.

El uso principal del hashcode, es como lo mencionamos arriba, cuando se manejan colecciones de tipo Hash*. La forma en como operan las colecciones de este tipo es a grandes rasgos la siguiente: Las colecciones de tipo Hash* almacenan los objetos en lugares llamados baldes, de acuerdo al numero obtenido por el método hashCode. Si el método hashCode regresa un 150, el objeto será guardado en el balde numero 150. Puede llegar a pasar que haya mas de un objeto de diferente tipo en el mismo balde. Esto no ocasiona ningún problema al momento de recuperar el objeto del balde, ya que al buscarlo este tipo de colecciones necesita como parámetro un objeto con el mismo valor hashcode, el cual utilizara para buscar el numero de balde que contiene a el objeto en cuestión. Si hay mas de un objeto, el siguiente criterio para determinar cual es el objeto buscado, es la utilización del método equals. Así es como este tipo de colecciones para buscar un objeto, ya sea para regresarlo y para ordenarlo. Lo cual falla si no sobrescribimos el método hashCode.

Sobrescribiendo el método hashCode

A continuación veremos como podremos sobrescribirlo:


@Override
public int hashCode() {
int hash = 7;
hash = 97 * hash + this.boleta;
return hash;
}

La salida que obtenemos una vez que se rescribe este método en el ejemplo de arriba es :

true
699
699

lo que nos dice que estos métodos son iguales según equals, y que además tienen el mismo numero hashcode.

Este método hashCode regresara consistentemente el mismo valor, siempre y cuando el campo boleta no cambie. Cada desarrollador puede implementar de diferente manera igualmente validas, correctas y eficientes este método. Lo que debemos de tener en mente al sobrescribir este método es que si para sobrescribir el método utilizamos variables de instancia (en nuestro ejemplo boleta), también debemos utilizar variables de instancia para generar un hashcode correcto. En el caso de las constantes que se utilizan en el ejemplo de arriba, se recomienda utilizar números primos, para una mejor distribución del hashcode generado.


Reglas que sigue el método hashCode

  • Si el método hashCode es invocado en múltiples ocasiones durante la ejecución de una aplicación, debe regresar consistentemente el mismo valor entero, esto si la información utilizada para calcular el hashcode no ha cambiado entre invocación e invocación del método hashCode.
  • Si dos objetos son iguales según el método equals, entonces la llamada al método hashCode debe regresar el mismo hashcode.
  • No es requerido que si dos métodos no son iguales según el método equals, tengan diferentes valores hashcode.

Ojo, mucho ojo

  • Si dos métodos son iguales según el método equals, el método hashCode debe regresar el mismo entero para ambos métodos. Sin embargo, si el métodos equals dice que dos métodos no son iguales, el método hashCode puede o no regresar el mismo entero.
  • Retornar un valor fijo en un método hashCode es una mala idea, ya que tendremos múltiples objetos con el mismo valor hashcode, lo cual no ayuda en nada a la hora de trabajar con colecciones de tipo Hash*.
  • Si utilizamos variables de clase de tipo transient para generar un hashcode, serializamos el objeto en cuestión y queremos recuperar el hashcode de ese método, nos encontraremos con que el hashcode será diferente al hashcode con que se serializó el objeto. Ya que este tipo de variables no se serializa. Por eso es una mala idea utilizar variables transient para generar el hashcode.

22 de marzo de 2011

Si fuera ingeniero...

Wow, esto lo tenia en los borradores como 2 años, se traspapelo y hasta ahora me vengo a dar cuenta. Dude si dale click en "Publicar Entrada", pero pues al final lo hice.


Si fuera ingeniero o alguien mas tecnico, te hablaria de los errores tecnicos de Guindous Vista, como que se desintala a la primera provocacion el archivo rundll32.exe, que se devora la memoria RAM, una serie de errores indocumentados por Guindous, a nivel de controladores siempre nos quedo mal Vista, etc, etc etc... pero para el caso no soy tecnico, mas bien rudo (los rudos los rudos los rudos!!), asi es que esta es la lectura que le doy al Vista gate:

La onda es q Microsoft aplico lo q hace Apple, de venderte todo por partes, pero en su version mala onda, me explico :

A la salida de Guindous Vista, Microsoft se dio cuenta de que a nivel empresarial no era viable cambiar de sistema operativo, ya que XP ya se habia convertido en un sistema maduro y muy funcional. A nivel usuario cacero, tampoco creaba muchas espectativas la salida de un sistema operativo (mucha gente ni entereda de que salia un nuevo S.O.). A nivel personas relacionadas con las tecnologias de informacion realmente creo espectativas, pero este no es un mercado muy grande. Los tentaculos de Microsoft estan en las empresas. Asi que lo q hizo fue dejar de darle soporte y descontinuar a XP. Con lo cual forzo el cambion de SO, pero no solo de eso, sino que ademas forzo en la mayoria de los casos un cambio de hardware, ya que Vista es tan diva como para pedir 3 GHz de procesador, 2GB RAM, 256MB video (las especificaciones marcan otros requerimientos como minimos, pero con eso Vista se arrastra todavia mas). Ademas de que las nuevas computadoras ya te vendian la licencia de Vista, y dejaron de vender XP
Asi que hubo un traslado masivo a Guindous Vista.

Hasta este momento Microsoft ya se embolso una buena lana por todo lo generado por Vista. Pero aqui viene lo critico. Siendo Vista un S.O. planeado para que no funcionara correctamente (con esto digo que es malo a proposito), Microsoft te dice: "ahh, no te jala Vista, ah pues mira en unos mese saco Guindous 7, cambiate a Guindous 7". Ahi fue cuando todo tuvo sentido. Primero te obligan a comprar un mal SO, para luego orillarte a comprarles un Guindous 7 que no es otra cosa q Vista sin errores (al menos evidentes). Doble ingreso para Microsoft!

En estos momentos los Linux-boys y los Mac-boys estaran mentando madres y su odio hacia Microsoft tuvo un +1000. Pero no hagamos bilis...



8 de junio de 2010

¿Es la nube lo de hoy? ¿Sera lo de mañana?

05 junio 2010 sabado 05:06

Un recuerdo de hace unos dias, fue el de la exposicion de 3 min que hizo cada una de las personas de mi grupo en la U-pizza para la clase de Psicosociologia Industrial. Tenian que ser 3 min delante del grupo, y el tema era el que quisieras. Obviamente yo hable de cosas interesantisimas, ya saben, politica, finanzas, transacciones de millones de dolares, la crisis financiera en Grecia, el sistema educativo de Alemania del siglo XVIII, etc. El mismo dia de mi participacion, hablo Oscar sobre el cloud computing. Oscar, quien es todo un geek (aunque ese dia mas bien parecia vendedor de servicios de nube de una empresa como Sun, impresionante ehh!), decia que es lo que va a prevalecer en el futuro inmediato. En pocas palabras, la nube era la onda. Que todo iba a estar en la nube. Con lo cual difiero un poco.

Para empezar en concepto de nube nos dice que las empresas ya no van a tener que lidiar con hardware, software dentro de su organizacion, reducira el personal de IT, menos mantenimiento a su equipo de computo, y de mas puntos, ya que todas las necesidades computacionales seran contratadas como un servicio a terceros. Es decir, si necesitas almacenamiento, procesamiento de datos, software, vas con un proveedor de nube, implementa la solucion, y tu ni te enteras como se hace, que se implementa, que hardware, que software, que metodologias, que servidores, pero tendras la solucion a tus necesidades.

Me parece que mucha gente esta y estara renuente a darle su informacion critica a un 3ro, ya que no se sabe como y donde almacenara esa informacion, por las manos de quien pasara, cuales son las politicas de seguridad que tienen para esa informacion, etc. Como te aseguras de que la "nube" sabe como manejar la seguridad e integridad de la informacion que es critica para tu organizacion??? Siento todavia a la gente renuente a tener su informacion fuera de su empresa, y en parte tienen razon. Para intentar atenuar esta, si quieren excusa, hay nubes privadas, nubes hibridas y soluciones que te venden el hardware y software necesario pera que implementes la nube en tu propia empresa, pero, se pierde un poco el concepto e idea de lo que es la nube, por lo que comento en el 2do parrafo.

Creo que pasa lo que paso hace algunos años cuando se decia que los servicios web eran el futuro. Eso es lo que las empresas de tecnologia nos vendian, y ya se vio que no fue asi. Y hoy lo que se intenta vender es la nube como la solucion por excelencia. Pero, como toda tecnologia, tiene su nicho, hay cosas para las que va perfecto, otras para las que va mas o menos, y otras para las que no es la opcion, como todo en la vida.

4 de junio de 2010

Editores de Texto

Esto lo escribi hace como mes y medio, se habia quedado alvidado en mi escritorio. Pero vale bastante la pena como para que lo deje alli. Asi es que corre y se va:

Taria bueno escribir algo acerca de los editores de texto, al menos de los que uso mas frecuentemente. Mmmm, eeh, pues elegir un editor de texto esta en funcion del uso que le vas a dar a ese editor, del tipo de documentos, archivos que vas a generar y el uso que les vayas a dar. No utilizas el mismo editor cuando vas a redactar un informe de una practica escolar, o cuando escribes una novela, codigo para un programa en Java, un blog, etc.
Los que utilizo son:
*Vim - Gvim ---> Vi Improved y Graphic Vi Improved, respectivamente.
Este don editor es un editor de texto plano (como el note pad de Guindous). Viene en su version consola (Vim), y para los menos geeks, en su version grafica (GVim). Lo utilizo cuando escribo codigo de programacion, ya que de pinta el codigo de diferentes colores, deacuerdo a si son constantes, variables, keys words, etc. La curva de aprendizaje para poder usarlo de una manera intermedia, es corta. Una vez aprendido como usarlo, se llega a ser mas productivo, respecto a cuando se utiliza otro editor de text plano.
Ademas tiene el plus de ser software libre, asi evitamos ser solapadores de empresas monopolistas. Originalmente solo venia en Sistemas Operativos Unix, despues tambien en Linux, y ahora tambien en Guindous.
Hay que decir que no marca errores de sintaxis ni de compilacion.
*Programmer's Notepad.
Como su nombre lo dice, es un editor de texto orientado a programadores.Soporta infinidad de lenguajes de programacion y pone de colores distintos variables, constantes, keywords, etc. No marca errores de sintaxis, ni de compilacion, solo es un editor de texto plano.
El plus que da este editor de texto, es su capacidad de ayudarte a identar el codigo para una mayor legibilidad de codigo. Es grafico y mola (no tamto como Vim). Esta para Guindous y Mac (creo). Lo uso en Linux usando un programa que sirve para correr aplicaciones de Guindous que se llama Wine (no, no es un emulador, de hecho las siglas de Wine quieren decir: Wine Is Not Emulator) y jala perfecto.
*TextRoom
Sirve perfecto para textos que son muy largos, siento que es bueno para bloggers, escritores de libros o articulos. Editor nada espectacular, pero muy util. Lo puedes poner en full screen, cambiar el color de la letra y del fondo, insertar fecha y hora, y tiene un sonido que simula el sonido de cuando se teclea en una maquina de escribir mecanica (para los melancolicos). Lo hay para diferentes plataformas.
Lo unico malo que en Linux tiene el bug de que no pone la hora exacta, sino que con cierto retraso. Pero en general mola. Recomiendo el full screen, para no distraerse con otras ventanas y barras de menus, iconos, etc.
*Writer de Open Office
Este es para tareas que necesitan mas formato. Es las version libre de Word de Guindous. Puedes dar formato con un clic, insertar imagenes, graficos, objetos, etc. Guarda en el fomato Open Document Text, cuya extencion es .odt. Este claro no es compatible con los cerrados de Office, y no podras abrirlos ahi (aunque si viceversa). Da la opcion de guardar tambien en .doc, .pdf, entre otros. Asi que por portabilidad no me quejo.
Pues creo que son los que mas utilizo, pues me son utilies y son buenos cada uno para diferente aplicacion y requerimientos especificos.

6 de abril de 2010

Untitled

Dia complicado. Primero darle un scan a profundidad a un Disco Duro que tenia broncas serias al iniciar el sistema operativo. Para esto utilice el pandita antivirus, que en teoria no es el mejor, pero es el que tengo a la mano y hasta la fecha no me ha quedado mal.

Al rato de comenzado el scaneo, mi pc se reinicia, casi me vuelvo diabetico del coraje. Ya en la tarde en la u-pizza en una tertulia de informatica con la pandilla me entere que el Windows 7 se reinicia una ves que acaba el tiempo de la version de prueba que te dan. BUUh!. Y asi quieren que la gente use su sistema??? no no no no... mal. Deberian adoptar una politica de software como la que tenia en su momento Sun, y ya ven, quien no ha usado MySQL, Java, Netbeans, etc. Es un modelo de negocio que se deberian plantear las medianas y grandes empresas.

Pero me conseguire una version sin broncas de WIN 7, solo por el dream weaver, pero en cuanto encuentre un programa parecido para linux lo abandonare y con todo el dolo del mundo formateare esa particion.

Despues a instalar el DD a la maquina donde lo saque. Al parecer todo en orden. Dormire hoy tranquilo.

No le doy correccion ortografica ni mayor formato a mi text porq ya hace sueño y hay que dormir mis 13 horas, sino me extriño... jejeje

31 de enero de 2010

imap vs pop

Eso de estar a cargo de los filtros, de la integridad de los datos y de cuestiones un poco mas criticas cuando te caes de sueño puede ser peligroso. Creo que hoy la regue en 5 min mas veces que las que todo el personal en 1 hora de trabajo. Pero ya paso. Ahora me dedico a configurar mi pinche Outlook en Guindous 7, y jala mas o menos. Recomiendo que se haga con el protocolo imap, y no con el pop, ya que con el pop solo se actualiza la parte del cliente (Outlook) mientras que con imap se actualiza tambien la parte del servidor. El imap esta disponible en gmail, en hotmail creo que solo hay pop.

30 de enero de 2010

Calendar

Llevo usando una par de sabores de linux desde hace mas o menos un año, pero no me considero un power user de estas distros. De hecho, a veces se me olvida que estoy en ubuntu y ando con la idea de que sigo en Guindous y me ando preocupando a lo wey de a que madre le doy doble clic y a que madre no. Hay programas que instalo al mas puro estilo Guindous, dando doble clic al un archivo con extencion .sh, y luego los wizards de siempre. De hecho, se usar pocos comandos del shell de mi distro, que por default es el sh. Asi que cuando me di cuenta de que poniendo "calendar" en el interprete de comandos, te despliega en la pantalla las efemerides de la fecha en la que te encuentras, me sorprendi tanto que me puse a ver efemerides de un resto de dias del año. Hasta que me dieron altas horas de la madrugada. Asi que estas ojeras de muerto no son gracias a una vida nocturna y cabaretera muy prolifera!!!!

12 de septiembre de 2009

Historia de Sun

He aqui un videillo que me encontre en el cual Sun comenta un poco de su historia. No me espero a sacarlo despues porque ya esta por formalizarse la compra de Sun por parte de Oracle. El DOD de los Estados Unidos ya dijo que no tiene ningun inconveniente. Las autoridades europeas ponen algunos peros, ya q esta compra tiene tintes monopolistas por parte de Oracle, pero no tardan en dar el si en Europa. Interesante la historia de Sun. Es una empresa a la que admiro en casi todo.