Julio 25, 2008 - 10:11 am - Posted by Camilo Nova
Mientras el tiempo que dure programando en JAVA, Eclipse me pareció la mejor pieza de software jamas construida, daba una especie de placer programar con este IDE, la facilidad de encontrar el autocompletado del código, la compilación al instante y muchas otras cosas que cualquier programador espera de un entorno de desarrollo venían con eclipse.
Ahora que me oriento al desarrollo con Django [1], veo que hay algunos que son nostálgicos y quieren utilizar eclipse, pero con Python. Para estas personas, hay un proyecto bastante interesante en [2] el cual junta en un solo paquete eclipse y todas las herramientas que permiten trabajar con Django, es un ahorro en tiempo de configuracion y puesta a punto bastante importante, y pues creo que hace felices a muchas personas que no quieren dejar de utilizar Eclipse.
Yo en lo personal prefiero utilizar la shell de Unix y el editor Scribes [3], alguno tiene una configuracion que recomendar?
Enlaces:
[1] http://www.djangoproject.com
[2] http://www.easyeclipse.org/site/distributions/python.html
[3] http://scribes.sourceforge.net/
Tags: Desarrollo, Django, Java, Python | Comente »
Junio 5, 2008 - 12:29 pm - Posted by Camilo Nova
Algunas notas sobre Entrada y Salida en Java
Para obtener el separador propio del sistema en el cual se ejecuta el código java se puede llamar al siguiente método:
String fs = System.getProperty(”file.separator”);
Cuando se crea una instancia de la clase File, no es creado el archivo como tal, solamente existe la instancia del mismo en memoria.
Ejemplos de Flujos de Datos en bajo nivel:
- FileInputStream
- FileOutputStream
Ejemplos de Flujos de Datos en alto nivel:
- DataInputStream
- DataOutputStream
FileInputStream/FileOutputStream de bajo nivel y DataInputStream/DataOutputStream de alto nivel son usados para leer y escribir datos en formato binario.
FileReader/FileWriter de bajo nivel y BufferedReader/BufferedWriter de alto nivel son usados para leer y escribir datos en formato de texto.
ObjectInputStream y ObjectOutputStream pueden utilizarse para leer o escribir objetos encadenando flujos de bajo nivel con de alto nivel.
El proceso de escribir en disco un objeto es llamado serializacion, para que el objeto pueda ser serializado este debe implementar la interfaz ‘Serializable’.
Tags: Java, Tecnología | Comente »
Junio 4, 2008 - 9:52 pm - Posted by Camilo Nova
En nuestro trabajo cotidiano es común la necesidad de respaldar los archivos o configuraciones que tenemos en equipos externos a los de nuestro uso diario, en general, lo ideal es asegurarse que se tiene un respaldo de la información importante y que sea fiable al momento de recuperar, claro esta, que también sea económica de implementar llenando los requerimientos establecidos.
Para eso nosotros tenemos una opción que recomendamos, fue elegida luego de utilizar varias herramientas y nos pareció la mejor de todas.
http://areca.sourceforge.net/
Es un software de copias de seguridad personal desarrollado en java y bajo la licencia GLP, con lo cual tenemos plena libertad de usarlo y distribuirlo, a diferencia de las otras opciones disponibles en el mercado. También existe otra opción de un software gratuito que merece la pena una revisión:
http://www.acebackup.com/
Nos gustaria recibir comentarios del uso de estas dos aplicaciones con el fin de definir cual es la mejor opcion, ustedes tienen la palabra.
Tags: AxiaCore, Java, Software Libre, Tecnología | Comente »
Mayo 21, 2008 - 9:59 pm - Posted by Camilo Nova
Excepciones y aserciones.
Las excepciones de tipo ‘Runtime’ no son marcadas por el compilador, y no es necesario que el programador las maneje, aunque no es prohibido que lo haga.
Un bloque de codigo ‘catch’ solamente es ejecutado si atrapa una excepcion que provenga de un bloque ‘try’ correspondiente.
Una vez que la ejecucion del programa alcanza un bloque ‘try’ y una excepcion ocurre, el bloque ‘finally’, si existe, es siempre ejecutado independientemente si fue o no capturada una excepcion, a menos que, bajo circunstancias extremas como un llamado a System.exit() ocurran.
Hay dos reglas en la ejecucion de bloques ‘catch’
- Solamente un bloque ‘catch’ relevante a la excepcion y encontrado primero por el control de ejecucion, sera el bloque ejecutado para dicha excepcion.
- Los bloques ‘catch’ mas especificos (de menor jerarquia en el arbol de clases) deben preceder a los menos especificos (los mas generales). La violacion a esta regla genera un error de compilacion.
Una excepcion puede ser tratada solo por un bloque ‘catch’, donde en dicho bloque en sus parentesis debe existir la clase que representa la excepcion en si misma.
Si una excepcion no es capturada por ningun bloque ‘catch’, una de las siguientes acciones ocurre:
- Si no hay un bloque ‘finally’, la ejecucion se detiene en el punto donde se lanzo la excepcion y retorna al metodo que la llamo.
- Si hay un bloque ‘finally’ la ejecucion salta del punto donde se lanzo la excepcion al bloque ‘finally’ y retorna al metodo que la llamo luego del bloque ‘finally’.
Si una excepcion es capturada por un bloque ‘catch’, caso contrario al anterior, ocurre uno de los siguientes casos:
- Si existe un bloque ‘finally’, el control de ejecucion ejecuta el bloque ‘catch’ y luego el ‘finally’, para luego continuar con el metodo que la llamo.
- Si no existe un bloque ‘finally’, pasa a ejecutar el bloque ‘catch’ y luego continua con el metodo que la llamo.
El bloque ‘try’ debe estar seguido bien de un bloque ‘catch’ o ‘finally’, o ambos. El bloque ‘try’ por si mismo es ilegal. Cualquier bloque ‘catch’ debe estar precedido de un bloque ‘try’, y un bloque ‘finally’ debe continuar luego del ultimo bloque ‘catch’ o del bloque ‘try’ si no existe un bloque ‘catch’.
Se debe tener en cuenta al momento de sobrecargar un metodo que lanze una excepcion:
- Si el metodo a sobrecargar no lanza ninguna excepcion, el metodo que sobrecarga no puede lanzar ninguna excepcion, pero aun asi podra lanzar una excepcion en ejecucion.
- Si el metodo a sobrecargar lanza alguna excepcion, es legal para el metodo que sobrecarga no lanzar ninguna excepcion.
Para ejecutar un programa con aserciones se pasa el parametro -ea (enableassertions) al momento de ser ejecutado.
Es clave recordar que las aserciones deben ser usadas unicamente con propositos de pruebas y no debe confiarse en ellas para una aplicacion en produccion.
Tags: Java, Tecnología | Comente »
Mayo 21, 2008 - 9:34 pm - Posted by Camilo Nova
El siguiente es un ejemplo de una asercion en java, que permite realizar pruebas sobre el codigo, sobretodo en la etapa de verificacion de la calidad.
Para compilar el codigo se hace de la misma manera que siempre
javac AssertionExample.java
Para ejecutarlo se deben habilitar las aserciones:
java -ea AssertionExample
Tambien puede ser ejecutado normalmente
java AssertionExample
Aqui esta el codigo, un ejemplo sencillo pero que muestra la funcionalidad que tiene para realizar verificaciones.
public class AssertionExample{
public static void main(String[] args) {
int x = -15;
DataAccess da = new DataAccess();
assert x > 0 : "El valor debe ser positivo";
System.out.println("Valor positivo x: " + x);
}
}
Tags: Codigo Fuente, Java | Comente »
Mayo 21, 2008 - 3:43 pm - Posted by Camilo Nova
El argumento legal de una estructura if() es ‘boolean’. Esto quiere decir que lo comprendido en el paréntesis debe dar como resultado un valor ‘boolean’
Listado de estructuras if-else:
- Hay dos tipos de estructuras, ‘if’ cuando es permitido que el bloque posiblemente no sea ejecutado, e ‘if-else’ cuando de seguro uno de los bloques sera ejecutado.
- Se pueden anidar como el anterior en expresiones ‘if-else if’ e ‘if-else if-else’.
- La primera estructura es ‘if’.
- Cualquiera de estas estructuras pueden anidarse dentro de otra.
En una estructura ’switch’, el caso ‘default’ no necesariamente debe ir al final. Puede estar en cualquier parte del bloque ’switch’.
Los argumentos legales para una estructura ’switch’ son: byte, short, char, int y enum. Si se intenta utilizar otro tipo se recibirá un error de compilación. Si existen dos ‘case’ iguales se generara un error de compilación.
De no escribir ‘break’ al final de cada caso ‘case’ la ejecución continuara hasta encontrar un ‘break’ o el final del bloque. Las sentencias de iteración en java son: while, do-while, for y for-each.
El bloque ‘do-while’ garantiza que el código sea ejecutado una vez antes de que se compruebe la expresión con la que decide si se ejecuta nuevamente o no, mientras que el bloque ‘while’ puede que no se ejecute ni una sola vez.
La sintaxis para un bloque ‘for-each’ es:
for(<variable Array o Colleccion> : <colección>) {
//Código a ejecutar
}
Se recorre la colección o array determinado por <colección> y asigna cada elemento iterado a la variable <variable> que sea del tipo indicado en la colección.
Existe una palabra reservada que permite saltar la ejecución dentro de un bucle, esta palabra es ‘continue’ y se puede utilizar en el siguiente bloque:
OuterLoop: for (int i=0; i < 10; i++) {
InnerLoop: for (int j=0; j < 10: j++) {
System.out.println(i +” - ” + j);
if ( i == j ) continue OuterLoop;
}
}
Hay varias cosas para tener en cuenta con este código. Lo primero es la capacidad para etiquetar un bucle, para esto se coloca un ‘label’ separado por ‘:’ de la declaración del bucle, esto permite identificar varios bucles encadenados de tal manera que se pueda saltar hacia cualquiera de ellos con la palabra reservada ‘continue’
fuera La palabra reservada ‘continue’ solamente es valida dentro de una estructura de bucle, de ser escrita porque generara un error de compilación. Esta palabra reservada sirve para saltarse o parar la iteración actual del bucle pasando a donde se le indique en la etiqueta, si no se indica etiqueta se salta la iteración del bucle donde se encuentre.
Para saltarse el bucle completo es necesario recurrir a la palabra reservada ‘break’. Esta palabra reservada puede ser utilizada tanto en un bucle como en una estructura ’switch’ y tiene el mismo comportamiento dentro de los bucles que ‘continue’.
Tags: Java, Tecnología | Comente »
Mayo 20, 2008 - 7:30 am - Posted by Camilo Nova
La relación de herencia ‘extends’ es llamada “es un”. Si jaguar extiende de vehículo, entonces jaguar “es un” vehículo.
La relación “tiene un” proviene cuando una clase declara un atributo, así <clase> tiene un <atributo>. Si jaguar declara un atributo Motor, entonces jaguar “tiene un” Motor y “es un” vehículo.
La encapsulacion se refiere a la capacidad de tener atributos (propiedades) y métodos (comportamiento) unidos en una clase.
Una buena encapsulacion requiere que todos los atributos sean declarados ‘private’, lo cual a su vez es una buena practica de programacion.
La relación “tiene un” esta relacionada con la encapsulacion y “es un” con la herencia.
Alta Cohesión y Bajo Acoplamiento. La cohesión se refiere a como es la estructura interna de una clase y el acoplamiento a su relación con las demás.
En caso de una conversión implícita (cast) de tipos de datos primitivos no permitida, el error es informado en tiempo de compilacion.
Importante para recalcar en una conversión implícita:
1) No existe conversión entre tipos booleanos y no-booleanos
2) Un tipo de dato primitivo se puede convertir en otro dato primitivo de mayor o igual tamanno
Una conversión explicita es aquella que el programador determina en código fuente, la implícita es aquella que da por hecha el compilador.
Sobreescribir un método es cambiar el comportamiento de un método definido previamente, Sobrecargar es implementar la funcionalidad de un método usando el mismo nombre pero diferentes parámetros.
A partir de la versión 5.0 el tipo de retorno de un método sobreescrito puede ser una clase que herede o implemente la clase o interfaz con la cual fue declarado el tipo de retorno en el método. Es decir si el método en la clase padre tiene un tipo de retorno “Carro” es valido que una clase que sobreescriba ese mismo método implemente un tipo de retorno “Cadillac”, claro si, Cadillac “es un” Carro.
Una sobrecarga de método es una funcionalidad que permite escribir varios métodos con el mismo nombre en una misma clase, teniendo diferentes parámetros pero el mismo tipo de retorno.
Un método puede ser sobreescrito (Overwrite) o sobre cargado (Overloaded) a la vez en una clase que hereda.
Elementos importantes a resaltar:
-Dos o mas métodos con el mismo nombre y diferentes parámetros o en orden distinto se dice que son sobrecargados (Overloaded)
-Dos métodos sobrecargados pueden tener el mismo o diferente tipo de retorno
-Los métodos sobrecargados son practicamente independientes entre ellos
-Cualquiera de los métodos de la superclase pueden ser sobrecargados por la subclase
-Diferentes métodos sobrecargados pueden tener diferentes tipos de declaraciones ‘throws’
-Diferentes métodos sobrecargados pueden tener diferentes modificadores
Los métodos constructores de la clase no pueden ser sobreescritos, pero si pueden ser sobrecargados en la misma clase
Recordemos:
Un constructor debe tener el mismo nombre de la clase y cero o mas parámetros sin tipo de retorno.
Una clase puede tener mas de un constructor, si no se define un constructor el compilador define uno por defecto sin argumentos.
Tags: Java, Tecnología | Comente »
Mayo 19, 2008 - 7:29 am - Posted by Camilo Nova
Cuando se compila una clase por consola con el comando ‘javac’ es necesario poner la extensión .java a la clase, cuando se ejecuta solo se hace con la nombre, sin extensión, usando el comando ‘java’
El parámetro para el método main(…) puede tener cualquier nombre, pero debe ser de tipo String[]
El nombre de la clase publica declarada en el archivo .java debe coincidir con el nombre del archivo.
Solo puede haber UNA clase publica en un archivo .java
Se genera un archivo .class para cada clase declarada en el archivo que es compilado.
Se puede importar paquetes completos usando el comodin ‘*’ para todas las clases comprendidas en el paquete, por ejemplo casa.*, pero no se puede usar para generalizar nombres de clases, por ejemplo casa.ap*, solamente es valido usar para importar todo el contenido de un paquete, de lo contrario se genera un error de compilacion.
Al momento de importar paquetes, se importa el nombre del paquete que se especifica en casa clase con ‘package’
La declaracion del paquete precede las de importacion de paquetes, las que a su vez preceden la declaracion de la clase.
Cada componente en el paquete corresponde a un directorio en el sistema de archivos.
El ‘classpath’ es una variable de ambiente del sistema operativo que contiene un listado de directorios o archivos JAR en los cuales el compilador y el interprete buscan por los archivos de clases. Son separados por ‘;’
JAR (Java ARchive) es un archivo con extension .jar, que contiene el conjunto de archivos .class de toda la aplicacion, incluyendo o no el codigo fuente, este archivo se crea con el comando ‘jar cf myApp.jar topDir’.
Este comando comprime en el archivo myApp.jar todo lo que se encuentre dentro de topDir.
Se puede listar el contenido de un archivo .jar con el siguiente comando: ‘jar -tf myApp.jar’ y se puede ejecutar de la siguiente manera: ‘java -jar myApp.jar’
Cuando se especifica un archivo .jar en el classpath se necesita que el nombre del archivo este al final de la linea ‘c:\myDev\myApp.jar’
La clase que contiene el metodo main(…) debe ser especificada en el archivo MANIFEST.MF con la siguiente linea ‘Main-Class: MyClass’
La importacion estatica introducida en J2SE 5.0 hace referencia a la capacidad de utilizar metodos y atributos estaticos de una clase, por lo general se accede a un atributo estatico de una clase A de la siguiente manera ‘A.comp’, si se hace la importacion estatica en la clase permite que se pueda llamar al atributo directamente como ‘comp’. La importacion se hace con la siguiente linea: ‘import static java.lang,Math.PI’.
Si luego de hacer la importacion estatica se llama algun atributo estatico haciendo uso del nombre de su clase ‘A.comp’ se genera un error de compilacion.
Si se pasa una variable primitiva como argumento para un metodo, dicha variable es pasada por-valor al metodo, con lo cual se hace una COPIA del valor para el metodo que la recibe, luego los cambios que se hagan sobre dicha variable dentro del metodo no afectan la variable con la cual fue pasada.
***Al parecer cuando se pasan parametros a los metodos, todos se pasan por-valor, osea se hace una copia de la variable en el parametro, tanto para tipos abstractos como primitivos, existe alguna forma de pasar parametros por referencia???
Los tipos de datos declarados dentro de un metodo NO pueden utilizar modificadores de acceso, los metodos y las variables de instancia SI
Si no se especifica uno de estos modificadores ‘public’, ‘protected’ y ‘private’ se utiliza el modificador por defecto.
Un metodo, clase o variable declarado como publico es accesible desde cualquier parte de la aplicacion.
*No se recomienda que las variables de instancia sean publicas, ya que estas deben ser modificadas solamente por los metodos de la clase.
El modificador ‘private’ no puede ser aplicado a una clase de alta jerarquia (la que tiene el mismo nombre que el archivo .java), una clase ‘top-level’ es aquella que no esta definida dentro de otra. Un miembro de una clase declarado privado solo puede ser accesado dentro de la misma clase que lo declaro, no desde otra clase ni de una subclase de la cual es declarado.
El modificador ‘protected’ solo puede ser aplicado a miembros de la clase, es decir a variables, metodos y subclases (inner class). Es accesible para las clases del mismo paquete y para subclases, asi esta no este en el mismo paquete.
El modificador default es usando cuando no se especifica otro tipo de modificador en la clase, metodo o atributo. La palabra reservada ‘default’ hace referencia a la sentencia ’switch’ y no a este modificador de acceso, el cual, por supuesto, no tiene palabra reservada.
Un miembro declarado como default es accesible desde cualquier clase o subclase del mismo paquete. La diferencia con el modificador de acceso ‘protected’ es que ambos pueden acceder desde el mismo paquete, pero el protected adicionalmente puede ser accesado por una subclase que herede de la clase protected de otro paquete. En default una subclase no tiene acceso al miembro declarado.
Un método no puede ser sobrecargado con un acceso menor al que fue definido, se puede otorgar un acceso mayor, digamos pasar de protected a public y similar.
El modificador ‘final’ puede ser aplicado a un atributo, un metodo y una clase. Se se aplica a un atributo el modificador ‘final’ quiere decir que su valor es constante y que debe ser declarado en su inicializacion. Si el metodo es ‘final’ quiere decir que no puede ser sobrecargado (es decir, cambiado su comportamiento en una clase que lo herede). Si la clase es ‘final’ quiere decir que nadie puede heredar de ella.
Los atributos (variables) declarados ‘final’ NO pueden ser modificados posteriormente, esto genera un error de compilación.
Los elementos estaticos ’static’ son visibles para todas las instancias de la clase, comparten la misma referencia sin importar la cantidad de instancias distintas que se puedan crear.
El modificador ’static’ puede ser utilizado para variables, métodos y a bloques de código dentro de una clase. NO para clases.
Si una de las instancias hace un cambio en un atributo estático, todas las instancias pueden ver dicho cambio.
Los atributos estaticos son inicializados al momento de cargar la clase en la VM, antes de que sea instanciada la clase que los contiene.
Un método estático SOLAMENTE puede acceder a atributos estaticos. Porque los métodos y atributos estaticos no pertenecen a una instancia especifica de la clase que los declara, sino que, a todas las instancias por igual.
Un método declarado estático no puede ser sobrecargado como no-estático y viceversa.
Un bloque de código declarado estático,
static {
..algo por aca…
}
se ejecuta ANTES de que la clase sea instanciada, se ejecuta al momento de ser cargada la clase en la VM, se ejecuta UNA sola vez y no vuelve a ser ejecutado durante la duración de la aplicación, se debe recordar que se ejecuta en el orden que son declarados en la clase desde arriba hacia abajo.
Recordar:
-Los elementos estaticos pertenecen a la clase y no a una instancia especifica de la clase.
-Un cambio en una variable estatica es visible para todas las instancias de la clase.
-Las variables estaticas son inicializadas al igual que los bloques de código estaticos en el momento de carga de la aplicación.
-Un método estatico de una clase NO puede acceder atributos no-estaticos de la clase.
-No se puede declarar como estatico: el constructor, una clase de primer nivel (top-level class), interfaz, clases internas junto con sus métodos y atributos, y variables locales.
-Se puede declarar como estaticos: miembros de primer nivel de una clase, una subclase de primer nivel y fragmentos de código.
El modificador ‘abstract’ se puede aplicar solamente a una clase o método.
Una clase abstracta no puede ser instanciada, porque por definición no se encuentra completamente implementada.
Si una clase tiene uno o mas métodos abstractos, dicha clase debe ser declarada abstracta también.
Cuando una clase hereda de una clase abstracta esta debe implementar todos los métodos abstractos que tenga dicha clase.
Debe ser una clase abstracta si:
1)Contiene uno o mas métodos abstractos.
2)Si hereda de una clase abstracta y no implementa los metodos abstractos.
3)Si implementa una interfaz y no provee implementacion para los metodos de la interfaz.
Con los métodos abstractos se puede lograr el efecto de polimorfismo, ya que el método se comporta de diferentes maneras dependiendo la implementacion.
Tambien se puede hacer polimorfismo implementando un método no abstracto de la clase que hereda, pero el modificador ‘abstract’ para el método hace obligatoria la implementacion.
Una clase o método abstracto significa que no ha terminado de ser implementado.
‘abstract’ y ‘final’ son totalmente opuestos, uno obliga la herencia y el otro no la permite.
El modificador ‘native’ implica que la implementacion del método puede que no se encuentre en el código fuente de la aplicación, sino que exista en alguna libreria que se carga dinamicamente. No es obligatorio implementarlo, pero se puede en dado caso. Se usa cuando se hace implementaciones en otros lenguajes de programación que deben ser cargadas externamente. Solamente es aplicable a métodos
El modificador aplicable únicamente a atributos (variables) de instancia ‘trasient’ se usa para indicar a la maquina virtual que en caso de que dicha clase sea “serializada”, es decir, que sea almacenada físicamente, omita la variable en cuestión y no la serialize, esto por cuestiones de seguridad respecto a algunos datos que son muy importantes para ser almacenados en disco.
El modificador ‘volatile’ también aplica solamente a atributos de instancia se utiliza para indicarle a la maquina virtual que dicho atributo puede ser cambiado en cualquier momento (asincronicamente) por otros procesos que accedan a la misma información. Solamente es utilizada en entornos de multiproceso y/0 multihilado para evitar la des-sincronizacion de la información contenida en la variable.
La gestion de memoria en java es automatica y la ejecuta el GarbageCollector que puede ser llamado System.gc(), el recolector de basura recoje aquellos objetos que tengan valor null o que no estén referenciados a ninguna parte. Para optimizar el uso de la memoria se recomienda asignar a null aquellos objetos que terminemos de utilizar.
Una manera de ejecutar código antes de que el recolector de basura haga su trabajo en un objeto se puede implementar el método finalize() el cual se ejecuta justo antes de que el recolector de basura elimine el objeto de la memoria.
A diferencia de los constructores, el método finalize() no llama al respectivo método de la super clase, asi que de querer hacerlo se debe hacer explicitamente como super.finalize().
Hay tres puntos finales por recordar:
1)La ruta completa de una clase se compone del classpath seguido del paquete y el nombre de la clase.
2)Se utilizan modificadores de acceso buscando una buen balance entre seguridad y acceso.
3)Se puede hacer elegible un objeto para el recolector de basura eliminando cualquier referencia al mismo, pero no se puede asegurar que el recolector de basura elimine el objeto sin referencia.
Tags: Java, Tecnología | Comente »