Java para programadores objetosos. por Leo Gassman
|
|
|
- Tomás Crespo Vargas
- hace 10 años
- Vistas:
Transcripción
1 Java para programadores objetosos por Leo Gassman Versión 2.1 Agosto 2009
2 Indice OBJETIVO... 3 INTRODUCCIÓN A JAVA... 3 INSTALACIÓN DE LA JDK INSTALACIÓN DE ECLIPSE... 3 ARMADO DE UN PROYECTO JAVA ESCRIBIENDO NUESTRAS CLASES MODIFICADORES DE VISIBILIDAD AGREGANDO COMPORTAMIENTO ESCRIBIENDO UN MAIN... 6 HERENCIA... 7 AGREGANDO NUEVOS PACKAGES, ATRIBUTOS Y CONSTRUCTORES INTERFACES COLECCIONES TOSTRING EQUALS HASHCODE ANNOTATIONS COMENTARIOS Y JAVADOC EXCEPCIONES MIS PRIMEROS BUGS ACCIONES SOBRE EXCEPCIONES PROPAGACIÓN DE LA EXCEPCIÓN MANEJO DEL ERROR EXCEPCIONES ANIDADAS
3 Objetivo El presente documento pretende facilitar la transición de un programador hacia el mundo de java. Se requiere tener nociones sobre programación orientada a objetos. No pretende ser un manual de referencia de java. No abarca el lenguaje completamente. La utilidad de este documento radica en que al finalizar la lectura del mismo, el programador estará en condiciones de sentarse a realizar un programa sencillo. El aprendizaje se complementa con un posterior estudio del resto de los apuntes de la cátedra dónde ciertos temas se ven en mayor profundidad. Algunas de las soluciones propuestas en este documento no son las mejores en cuanto a su diseño, sin embargo fueron elegidas por su contenido didáctico. Introducción a java Java es un lenguaje orientado a clases y tipado. Para que un programa realizado en java pueda correr, se necesita algo llamado máquina virtual java (java virtual machine o JVM, o simplemente VM). La JVM es el ambiente dónde viven los objetos, y tiene ciertas cositas, como un garbage collector, que nos simplificará el uso de la memoria. Éste se encarga de detectar los objetos que ya no pueden ser usados porque nadie los referencia y los elimina de la memoria automáticamente. Instalación de la jdk. Además de la VM, para poder desarrollar en java, se necesita algunas cositas más, todo esto viene en algo llamado JDK (java developer kit). Entonces, lo primero que se debe realizar es instalar el jdk en la máquina que se usará para desarrollo. La jdk se puede bajar del sitio de Sun: Al escribir este documento, la última versión estable es la jdk 6 update 7. Bajar e instalar para el sistema operativo que corresponda. Instalación de eclipse Teóricamente, con la jdk y un editor de texto, ya alcanza para desarrollar programas. Sin embargo, realizarlo de este modo implica mucho esfuerzo a pulmón. Nosotros vamos a usar un IDE que nos simplificará las cosas. El IDE elegido es el Eclipse, uno de los mejores y más populares del mercado. Esto se baja de Hay varias distribuciones distintas de eclipse. Lo que varía entre las mismas son los plugins que traen incorporados. El eclipse está preparado para que se le puedan anexar plugins extendiendo su funcionalidad. Vamos a bajar el eclipse classic, que es una distribución básica, sin embargo el documento podría ser seguido con otra distribución. La última versión estable al escribir este documento es la 3.4. Para instalar el eclipse, basta con descomprimir el zip bajado del sitio. El eclipse es un programa desarrollado en java, y por lo tanto, requiere de haberse ejecutado previamente la instalación de la jvm. (Recuerde que la instalación de la jdk, incluye la instalación de la jvm). Al ejecutar eclipse.exe entonces, se abre el entorno de programación. Al iniciar, se pide que se elija un workspace. El workspace es una carpeta dónde se guardan los proyectos y ciertas configuraciones. En ocasiones es cómodo tener más de un workspace, pero en nuestro caso elegimos el que trae por default y usaremos siempre ese. Cerramos la ventana del welcome que en este tutorial no nos aporta nada. El eclipse puede verse de diferentes maneras para que quede más cómodo según la tarea que se quiera realizar. Cada una de estas formas se llama Perspective. A su vez, cada ventana que se ve dentro de una perspective, se llama view. Las perspectivas que vamos a usar a lo largo de este tutorial, son la java browser y la resource. En la resource, uno puede ver los archivos que intervienen en el proyecto de la forma en que se almacenan en el file system, mientras que en la java browser lo que se muestra es lo que representa cada archivo. De esta 3
4 forma, en la primera trabajamos con folders y archivos.class,.java, etc, mientras que en la segunda trabajamos con classes, types, packages, y conceptos relacionados con la programación java. Para cambiar de perspectiva se puede ir a Windows -> open perspective. O desde los íconos que figuran en la parte superior de la pantalla. Ahora hay que decirle al eclipse cual es la VM que va a utilizar. Para eso, se debe ir a preference -> java -> Installed jre, hay que agregar la VM de la jdk. Si se instaló en Windows, y no se modificó ninguna opción, sería: C:\Archivos de programas\java\jdk1.6.0_07. Si hay alguna otra, se recomienda removerla. Armado de un proyecto java. Ahora que ya tenemos el eclipse levantado, debemos crear un proyecto java para empezar a codificar nuestro programa. Para eso, se debe hacer: File -> new -> project -> java project. De nombre le pondremos mi primer proyecto java y antes de aceptar, marcaremos la opción create separates source and output folder. Qué significa eso que marcamos? Java maneja principalmente dos tipos de archivos, los.java, dónde se escribe el código, y los.class, que se crean al compilar el proyecto. El eclipse suele abstraernos de ese paso, pero por prolijidad, es conveniente mantener separados las carpetas dónde escribimos el código, de la carpeta dónde se guarda el código compilado. De que me sirve un archivo.class? estos archivos son interpretados por cualquier JVM. Por eso cuando se habla de las ventajas de java, se dice que los programas son multiplataformas, porque cualquier archivo.class creado en una JVM puede ser leído por otra JVM. (Por ejemplo, un.class puede ser leido tanto por la JVM de Windows, como la de Linux). Que fue lo que sucedió al crear este proyecto? En la perspectiva de resources, show -> view- > navigator. Se puede ver que hay dos carpetas: src, dónde se guardan los archivos fuentes, y bin dónde se guardan los archivos compilados (a veces esta carpeta se llama classes ). También se pueden ver dos archivos:.project y.classpath que son usados internamente por el eclipse. Normalmente, no deberíamos modificar directamente estos archivos. En la perspectiva java browsing no se ve la carpeta bin, porque es algo que no le interesa. Si se ve la carpeta src, y un montón de archivos.jar. Un archivo.jar es una librería compuesta por un conjunto de clases. Los jars que aparecen en nuestro proyecto son los necesarios para que nuestras propias clases puedan ser ejecutadas. Puedo agregar más jars? Sí, pero no es algo que haremos ahora. Aparecen además dos ventanas más, la de package y la de types. En la de types aparecen las clases e interfaces (hay algunos tipos más que no veremos). Qué son los packages? Son agrupaciones de clases. Sirven para dos cosas principalmente. La primera, es armar una estructura modular o de componentes de mi aplicación, de esta forma, pongo las clases más cohesivas y acopladas en el mismo package. La segunda, es para aportar un nombre único a las clases que contiene. Los nombres de packages suelen comenzar como una url invertida, de esta forma, se garantiza que sea un nombre único en el mundo. El nombre real de una clase, es: nombrepackage.nombreclase. La ventaja que trae tener un nombre único de clase, es que facilita la integración entre código escrito por distinta gente. Escribiendo nuestras clases. Cómo no podía ser de otra manera, nuestro ejemplo será un Hola Mundo, pero introduciendo conceptos de objetos (Ok. Alguien puede decir que voy a sobrediseñar la solución de este problema tan simple, pero no olvidemos que es a fines didácticos). 4
5 Entonces, primero haremos un package. Hay muchas formas de crear packages y clases, la más fáciles son haciendo clic derecho en el lugar dónde queremos crear, y eligiendo la opción new. Entonces, en la java browser, hacemos click derecho en la carpeta src, new package, y de nombre pondremos: ar.edu.utn.frba.tadp.holamundo Luego, creamos dos clases en ese package llamadas Recepcionista y Mundo (clic derecho sobre el package, new Class). Por convención, los nombres de package van con minuscula y las clases Comienzan con mayúscula y en cada palabra nueva, se usa mayúscula. Entonces, después de esto, en la perspectiva de java browser puedo ver un package, y dos clases. Si cambio a la perspectiva de resource, veo que me creo una estructura de carpetas src\ar\edu\utn\frba\tadp\holamundo con dos archivos Mundo.java y Recepcionista.java; y replicó la estructura de carpetas en bin, pero con Mundo.class y Recepcionista.class. Cómo un package, en el file system es una estructura de subdirectorios, puede pensarse que ar.edu.utn.frba.tadp.holamundo es un subpackage de ar.edu.utn.frba.tadp. Este pensamiento tiene sentido para que nosotros ordenemos nuestras clases con algún criterio, pero para la JVM, ambos packages son independientes y no tienen relación alguna. Modificadores de visibilidad. Si observamos el código que se escribió automáticamente, podemos deducir cómo es la declaración del package y de la clase. Vemos también que cuando declaramos la clase, se le agrega la palabra public. Qué es eso?, es un modificador de visibilidad. Las clases, métodos y atributos tienen un alcance y no pueden ser vistas desde cualquier parte del programa. Algo private, sólo se puede ver desde esa clase. Si no ponemos nada (default) se puede ver desde todo el package al cual pertenece. La visibilidad protected es similar a la de package, y además puede ser visto por las subclases. Es una buena práctica que todos los atributos de los objetos sean private. Agregando comportamiento. Vamos a hacer que nuestro recepcionista pueda saludar al mundo. Entonces vamos a hacer que Recepcionista entienda el mensaje saludar(mundo). Mundo sabrá devolver su nombre con el mensaje getnombre(). Nuestro recepcionista escribirá el saludo por consola. Cómo quedarían nuestras clases? Mundo.java: public class Mundo { public String getnombre() { return "Mundo"; Recepcionista.java public class Recepcionista { public void saludar(mundo mundo) { 5
6 System.out.println("hola " + mundo.getnombre()); Qué cosas nuevas aparecen? Para definir un método, se debe poner el modificador, el tipo del retorno, el nombre del método y entre paréntesis el tipo y nombre de los parámetros (separados por coma si hubiera). Como lo puede sospechar, java es tipado! Entonces, a las variables y parámetros se le debe indicar el tipo. Qué es System.out? La clase System es una clase donde hay cosas propias del sistema, tiene un atributo público de clase llamado out, que representa a la salida estandar, al enviarle el mensaje println, entonces se escribe por pantalla. Note que el operador + sirve para concatenar String. Por convención, los métodos empiezan con minúscula y las clases con mayúscula. En ambos casos, si tiene más de una palabra, las palabras nuevas empiezan con mayúsculas. Escribiendo un main Para probar lo que estamos haciendo, vamos a hacer una clase de prueba, que tendrá un método main que el eclipse podrá correr (el eclipse o directamente cualquier JVM, pues el eclipse no hace más que enviarle el pedido a la JVM que configuramos). Para evitar que se nos mezcle nuestra clase de test con nuestras clases de negocio, agregaremos una nueva carpeta de sources para escribir test. Entonces, hacemos clic derecho sobre el proyecto en la vista projects, new -> source folder (no confundir con folder). La llamaremos test. Y aceptamos. Vamos a crear el mismo package en la carpeta test, y luego la clase Test en dicho package. Fíjese que si en la vista java browser, hacen clic en el proyecto, y luego en el package ar.edu.utn.frba.tadp.holamundo, van a ver las tres clases, porque a pesar de que se encuentran en distintas carpetas físicas, los tres pertenecen al mismo package. Entonces, podemos hacer referencia a las cosas que sólo tienen visibilidad de package desde nuestra clase Test, y cuando haya que hacer el deploy de la aplicación será fácil dejar afuera las clases creadas para testing. Nuestra clase Test, deberá tener un método Main de la siguiente forma. public class Test { public static void main(string[] args) { Recepcionista recepcionista; recepcionista = new Recepcionista(); Mundo mundo; mundo = new Mundo(); recepcionista.saludar(mundo); Veamos que es esto. La palabra static, indica que es un método de clase. String[], es un array de String. Al llamar a la JVM se le puede pasar argumentos. En nuestro caso no lo usaremos. La primera línea, es la definición de una variable de tipo Recepcionista. En la segunda, estamos construyendo un Objeto de tipo Recepcionista, y se lo estamos asignando a la variable declarada en la línea anterior. La palabrita new, significa que se invoca un constructor. Más adelante hablaremos sobre los constructores. La asignación ocurre con el operador =. Las líneas 3 y 4 son iguales a las 1 y 2, pero para construir el mundo. 6
7 Finalmente, al objeto recepcionista, se le envía el mensaje saludar, con el parámetro mundo. Para correrlo, teniendo el foco en la clase Test, hacemos Run-> run as java application. Y en la consola veremos el resultado. Podemos achicar la cantidad de líneas de nuestro método main, agrupando varias acciones en la misma línea. public class Test { public static void main(string[] args) { Recepcionista recepcionista = new Recepcionista(); Mundo mundo = new Mundo(); recepcionista.saludar(mundo); Aquí la declaración de la variable y la asignación ocurren en la misma línea. Pero aún podemos achicarlo más, pues cómo las variables recepcionista y mundo no se vuelven a usar, pierde sentido que la tengamos que declarar. Podemos cambiar nuestro método test de la siguiente forma. public class Test { public static void main(string[] args) { new Recepcionista().saludar(new Mundo()); Herencia Vamos a hacer cambios para que haya dos tipos de Recepcionistas. Uno que sea el Clásico Hola Mundo, y otro que sea más formal. Ambos tienen el comportamiento en común de escribir por consola, pero difieren en cómo armar el mensaje. Entonces, dejaremos el comportamiento en común en la clase Recepcionista, y escribiremos las clases RecepcionistaClasico y RecepcionistaFormal, que armaran el String de saludo de formas distintas. La clase Recepcionista la convertiremos abstracta porque no podemos tener recepcionistas que no sean de alguno de los dos tipos que nombramos, pues no sabríamos cómo armar el mensaje. Entonces, nuestra clase Recepcionista quedaría así Recepcionista.java public abstract class Recepcionista { public void saludar(mundo mundo) { System.out.println(this.armarSaludo(mundo)); protected abstract String armarsaludo(mundo mundo); 7
8 Le tuvimos que agregar la palabra abstract a la definición de la clase. Esto hace que no se pueda instanciar ningun objeto Recepcionista directamente, lo que se instancian son subclases de la misma. También el definir la clase como abstract nos habilita a que ciertos métodos sean abstractos, y por lo tanto es responsabilidad de la subclase implementarlo. Por eso, el método armarsaludo está definido como abstract. Para armar la subclase, si hacemos clic derecho en Recepcionista y luego new class, ya nos armará la relación de herencia automáticamente. Si no lo hacemos así, podemos escribir el código que arma la relación nosotros mismos. El método armarsaludo es protected porque debe ser visto desde las subclases, y no es público porque los usuarios de recepcionista no deben llamarlo directamente. La palabra this, significa que el receptor del método es el mismo objeto. Las clases quedarían de la siguiente forma: RecepcionistaClasico.java public class RecepcionistaClasico extends Recepcionista protected String armarsaludo(mundo mundo) { return "hola " + mundo.getnombre(); RecepcionistaFormal.java public class RecepcionistaFormal extends Recepcionista protected String armarsaludo(mundo mundo) { return "Buen día estimado " + mundo.getnombre(); Para marcar la relación de herencia, en la declaración de la clase, se pone extends ClasePadre. Override, es una annotation. Una annotation es información adicional que se le puede agregar a un método, atributo o clase, para que alguien pueda leerla en otro momento. La annotation Override la lee el eclipse para saber que ese método debe sobrescribir a uno de una clase superior de la jerarquía de herencia. De esta forma, si no ocurre, el código deja de compilar. Pruebe de cambiar el nombre del método de la superclase, y verá su utilidad. Si no escribimos la annotation, funciona igual, pero ya no nos avisa si hay cambios en la superclase. Por default, las clases extienden de Object. Probaremos nuestras nuevas versiones cambiando nuestro main de la siguiente manera. public class Test { 8
9 public static void main(string[] args) { Mundo mundo = new Mundo(); new RecepcionistaClasico().saludar(mundo); new RecepcionistaFormal().saludar(mundo); Fíjese que es la misma instancia de Mundo que le llega a ambos recepcionistas. Agregando nuevos packages, atributos y constructores. Vamos a extender nuestro sistemita, para que salude tambien a las Personas. Vamos a hacer una clase persona, en un nuevo package. Creamos el package ar.edu.utn.frba.tadp.entes en la carpeta de resource. Y allí la siguiente clase: Persona.java package ar.edu.utn.frba.tadp.entes; public class Persona { private String nombre; public Persona(String nombre) { this.nombre = nombre; public String getnombre() { return this.nombre; Hay dos cosas nuevas aquí. La primera, es que estamos definiendo un Atributo nombre para la persona. Sigue la misma convención que los métodos. La segunda, es que hay un método que no es igual a los métodos comunes: no define que devuelve, y se llama igual que la clase. Ese método es un constructor. Antes no habíamos escrito ningún constructor, porque nuestros constructores al no tener parámetros, java los agrega automáticamente. Nuestro constructor recibe ahora un nombre por parámetro y se lo guarda en el atributo nombre. Luego, cada vez que alguien le pregunte el nombre, lo devolverá. Se puede tener varios constructores. Al agregar un constructor, java deja de poner automáticamente el constructor sin parámetro, por lo tanto, si se necesita, se deberá agregar manualmente. Cada constructor, lo primero que hace es delegar en otro, ya sea de la misma clase o de su superclase. Si no se pone nada, se delega en el constructor vacío. Para delegar se usa super(param1, param2,, paramn) o this(param1, param2,, paramn). Si no se pone ningún super o this, entonces por default usa el constructor vacío. Agregaremos entonces, la posibilidad de construir personas sin nombre, para agregarles el nombre después. Persona.java package ar.edu.utn.frba.tadp.entes; public class Persona { private String nombre; 9
10 public Persona() { super(); public Persona(String nombre) { this(); this.nombre = nombre; public String getnombre() { return this.nombre; public void setnombre(string nombre) { this.nombre = nombre; Interfaces Vamos a agregar la posibilidad de que Recepcionista pueda saludar a Mundos y a Personas. Fíjese que Recepcionista, sólo necesita que el objeto a saludar entienda el Mensaje getnombre(). Una forma de lograrlo, es armar una superclase común entre Mundo y Persona. Pero esto no es siempre posible, porque como java no tiene herencia múltiple, si Mundo y Persona ya pertenecieran a otras jerarquías, no se podría realizar. La forma de solucionarlo es armando una interface que defina el mensaje getnombre, y hacer que Mundo y Recepcionista, la implementen. Una interface en java, es un archivo.java similar al que define una clase. Nombrable.java package ar.edu.utn.frba.tadp.entes; public interface Nombrable { public String getnombre(); La clases que las implementan, lo hacen de la siguiente forma. Persona.java package ar.edu.utn.frba.tadp.entes; public class Persona implements Nombrable{ private String nombre; public Persona() { super(); public Persona(String nombre) { this(); this.nombre = nombre; 10
11 public String getnombre() { return this.nombre; public void setnombre(string nombre) { this.nombre = nombre; Mundo.java import ar.edu.utn.frba.tadp.entes.nombrable; public class Mundo implements Nombrable { public String getnombre() { return "Mundo"; Note que en estas líneas hay un elemento nuevo, la línea que dice: import ar.edu.utn.frba.tadp.entes.nombrable; Por qué es esto?. Dijimos al principio, que el nombre de una clase (y también el de las interfaces), es el nombre de package. nombre corto. Cuando desde una clase se hace referencia a otra que está en el mismo package se puede usar el nombre corto sin problemas. Cuando la clase o interface que queremos usar está en otro package (como en este caso, Nombrable está en un package distinto al de Mundo), para usar el nombre corto debemos importarlo. Otra forma de hacer que Mundo implemente Nombrable sin usar el import es: public class Mundo implements ar.edu.utn.frba.tadp.entes.nombrable {... Nombrable, al ser una interface, define también un tipo de dato. Veamos como quedan las clases de Recepcionistas. Para hacer el cambio, podemos cambiar las tres clases una a una, o podemos usar el refactor de eclipse, para cambiar la superclase, y que solitas las subclases se den cuenta. Entonces, vamos a la clase recepcionista, hacemos clic sobre el metodo armarsaludo y apretamos alt + shift + c (que es el short cut a change method signature ) y reemplazamos Mundo por Nombrable. Después repetimos la operación para el método saludar. Recepcionista.java import ar.edu.utn.frba.tadp.entes.nombrable; 11
12 public abstract class Recepcionista { public void saludar(nombrable nombrable) { System.out.println(this.armarSaludo(nombrable)); protected abstract String armarsaludo(nombrable nombrable); RecepcionistaClasico.java import ar.edu.utn.frba.tadp.entes.nombrable; public class RecepcionistaClasico extends Recepcionista protected String armarsaludo(nombrable nombrable) { return "hola " + nombrable.getnombre(); RecepcionistaFormal.java import ar.edu.utn.frba.tadp.entes.nombrable; public class RecepcionistaFormal extends Recepcionista protected String armarsaludo(nombrable nombrable) { return "Buen día estimado " + nombrable.getnombre(); Y veamos la siguiente clase de Test, dónde nos podemos dar cuenta del uso del polimorfismo entre Mundo y Persona import ar.edu.utn.frba.tadp.entes.nombrable; import ar.edu.utn.frba.tadp.entes.persona; public class Test { public static void main(string[] args) { Recepcionista recepcionista = makerecepcionista(); Nombrable nombrable = new Mundo(); recepcionista.saludar(nombrable); nombrable = new Persona("José"); recepcionista.saludar(nombrable); 12
13 private static Recepcionista makerecepcionista() { return new RecepcionistaClasico(); Note que la variable de tipo Nombrable puede albergar instancias tanto de Mundo como de Persona, y que si cambiamos la implementación de makerecepcionista para que devuelva un RecepcionistaFormal, el método main no se entera y funciona bien. Colecciones Veremos brevemente el uso de una colección, En java hay una interface llamada Collection, que tiene los métodos add y remove para agregar y sacar objetos. Tiene un método iterator, que devuelve un objeto que es capaz de recorrerlo. Una de las implementaciones se llama ArrayList, que implementa en realidad una subinterface de Collection, llamada List, (la herencia entre interfaces se escribe igual que entre las clases, con la diferencia de que una interface puede extender de varias simplemente separándolas por comas). En nuestro test, vamos a crear una colección de Nombrables, vamos a recorrerlos para saludarlos. Hay mucha más información sobre colecciones, pero queda afuera del alcance de este documento 1. import java.util.arraylist; import java.util.collection; import ar.edu.utn.frba.tadp.entes.nombrable; import ar.edu.utn.frba.tadp.entes.persona; public class Test { public static void main(string[] args) { Collection<Nombrable> nombrables = getnombrables(); Recepcionista recepcionista = makerecepcionista(); for(nombrable nombrable : nombrables) { recepcionista.saludar(nombrable); private static Collection<Nombrable> getnombrables() { Collection<Nombrable> nombrables = new ArrayList<Nombrable>(); nombrables.add(new Mundo()); nombrables.add(new Persona("Juan")); nombrables.add(new Persona("José")); return nombrables; private static Recepcionista makerecepcionista() { return new RecepcionistaClasico(); 1 Para más información de colecciones, puede consultar el apunte de la cátedra 13
14 tostring Vamos a modificar Persona para que tenga una dirección. En lugar de tener un atributo calle y otro número en la Persona, vamos a generar la abstracción de Dirección. Entonces las Personas tendrán una dirección, que podrán devolver. Y vamos a ir agregando cierto comportamiento básico con las direcciones. Por el momento, le podemos preguntar a una persona dónde vive. Direccion.java package ar.edu.utn.frba.tadp.entes; public class Direccion { private String calle; private int numero; public Direccion(String calle, int numero) { this.calle = calle; this.numero = numero; Persona.java package ar.edu.utn.frba.tadp.entes; public class Persona implements Nombrable { private String nombre; private Direccion direccion; public Persona() { super(); public Persona(String nombre, Direccion direccion) { this(); this.nombre = nombre; this.direccion = direccion; public String getnombre() { return this.nombre; public void setnombre(string nombre) { this.nombre = nombre; public Direccion getdireccion() { return direccion; public void setdireccion(direccion direccion) { this.direccion = direccion; 14
15 Test.java import ar.edu.utn.frba.tadp.entes.direccion; import ar.edu.utn.frba.tadp.entes.persona; public class Test { public static void main(string[] args) { Persona persona = new Persona("Leo", new Direccion("Esteban de luca", 1322)); System.out.println("La persona " + persona + " vive en " + persona.getdireccion()); Al ejecutar el main la consola sale algo como: La persona ar.edu.utn.frba.tadp.entes.persona@42e816 vive en ar.edu.utn.frba.tadp.entes.direccion@9304b1 Por qué el test compiló, si el operador + opera entre String y tanto persona como dirección no lo son? En la clase Object hay un método tostring(), lo cual significa que cualquier objeto sabe responder a ese mensaje. El operador simplemente opera contra el tostring de Juan. Hay varias herramientas en el mundo java (debugging y logueos) que se basan en el tostring, entonces, es importante que nuestra clase redefina este método para que diga algo sensato, ya que la implementación de object no es del todo feliz. Modificamos entonces, las clases Persona y Direccion. Persona.java package ar.edu.utn.frba.tadp.entes; public class Persona implements Nombrable public String tostring() { return this.getnombre(); Direccion.java package ar.edu.utn.frba.tadp.entes; public class Direccion public String tostring() { return this.calle + " " + this.numero; Aquí también vemos como el operador + puede resolver tipos básicos como enteros. 15
16 Ahora la consola del mismo main sería: La persona Leo vive en Esteban de luca 1322 Equals Vamos a agregar un mensaje a la persona para que nos cuente si vive en cierto lugar. El test con el que lo vamos a probar es: public static void main(string[] args) { Direccion direccion = new Direccion("Esteban de Luca", 1322); Persona persona = new Persona("Leo", direccion); if(persona.viveen(direccion)){ System.out.println(persona + " vive en " + direccion); else { System.out.println(persona + " no vive en " + direccion +", vive en " + persona.getdireccion()); Nuestra primera versión para resolver el mensaje viveen es: package ar.edu.utn.frba.tadp.entes; public class Persona implements Nombrable { public boolean viveen(direccion direccion) { return this.direccion == direccion; Al ejecutarlo, la salida es: Leo vive en Esteban de Luca 1322 Para resolver el problema, lo que hicimos es comparar si la dirección que nos pasaron por parámetro es la misma instancia que la dirección a la cual tengo como atributo. Es decir el operador == se fija que dos referencias apunten al mismo objeto. En ciertas ocaciones, no se tiene la misma instancia para pasar por parámetro, y se construye un objeto que sea igual 2. Suponemos que la persona se construye en cierto lugar y tenemos que saber si vive en Esteban de luca Al modificar el main para que eso ocurra, el test comienza a fallar. Test.java public static void main(string[] args) { Direccion direccion = new Direccion("Esteban de Luca", 1322); Persona persona = createpersona(); if(persona.viveen(direccion)){ System.out.println(persona + " vive en " + direccion); else { System.out.println(persona + " no vive en " + direccion +", vive en " + persona.getdireccion()); private static Persona createpersona() { return new Persona("Leo", new Direccion("Esteban de Luca",1322)); 2 Lea el apunte de la cátedra sobre value objects acerca de estas ocaciones 16
17 Ahora que el objeto direccion que está como atributo y el que está como parámetro no son la misma instancia, la salida es: Leo no vive en Esteban de Luca 1322, vive en Esteban de Luca 1322 Para evitar este problema, java propone un mecanismo a través de un método llamado equals. Este método está definido en la clase Object, por lo tanto todos los objetos lo tienen. La implementación de object hace exactamente lo mismo que el operador ==, por lo tanto, al cambiar la clase persona para que use equals en lugar de == no soluciona el problema. Sin embargo, al utilizar un método en lugar de un operador, da la posibilidad a aquellas clases que necesitan contestar la pregunta de otra forma puedan redefinirlo. 3 Persona.java package ar.edu.utn.frba.tadp.entes; public class Persona implements Nombrable { public boolean viveen(direccion direccion) { return this.direccion.equals(direccion); Direccion.java package ar.edu.utn.frba.tadp.entes; public class Direccion public boolean equals(object obj) { if (!(obj instanceof Direccion)) { return false; Direccion otradireccion = (Direccion) obj; return this.calle.equals(otradireccion.calle) && this.numero == otradireccion.numero; Con esta implementación la salida es: Leo vive en Esteban de Luca 1322 Analicemos un poco ese método equals. Por qué el método recibe un Object en lugar de otra dirección? El mecanismo de comparación está definido para todos los objetos. Hay muchos componentes que se basan en este mecanismo que desconocen absolutamente la existencia de la clase Direccion. Por ejemplo, puedo poner una dirección en una colección y luego preguntarle si la contiene. La colección entonces envía el mensaje equals declarado en Object a la dirección. Por qué el instanceof? Este equals puede ser llamado con cualquier objeto por parámetro, entonces sólo si lo que viene es una dirección existe la posibilidad de que sean iguales. El instanceof es un operador que indica si el objeto puede ser asignado a una variable del tipo. Es poco recomendado porque su uso atenta contra el polimorfismo y contra una buena distribución de responsabilidades, sin embargo, el equals es un caso dónde sí es correcto usarlo. Otro tema no trivial es la línea 3 Para saber un poco más de las características de las clases que necesitan redefinir el equals, puede consultar el apunte sobre value objects de la cátedra 17
18 Direccion otradireccion = (Direccion) obj; Cómo obj es una variable de tipo Object, sólo me deja enviar mensajes definidos en ese tipo. Sin embargo, yo estoy seguro que hace referencia a una instancia de tipo Direccion (porque más arriba hice el instanceof), entonces, puedo castear el objeto a ese tipo. El casteo es una indicación que el desarrollador le hace al compilador para asegurarle que un objeto cumple con cierto tipo y a partir de ahí poder mandarle mensajes que antes no eran visibles. Por qué usé equals para la calle e == para el número? Es correcto al decir que la igualdad de un objeto depende de la igualdad de algún atributo, usar el equals en el atributo. Ahora cuando ese atributo es de un tipo básico, la comparación se realiza con ==. Para dar por concluido la redefinición del equals, es necesario redefinir otro método llamado hashcode. HashCode El método hashcode está definido en Object y es usado para realizar optimizaciones. Por este motivo existe una restricción que dice que si dos objetos son equals, entonces ambos deben devolver el mismo número en el método hashcode. Un claro ejemplo donde se ve el uso de hashcode es con la clase HashSet. Esta clase es una colección que tiene internamente una tabla de hash, entonces al preguntarle si contiene un objeto, primero reduce la cantidad de objetos a evaluar preguntando el hashcode, para luego preguntar por equals. Vamos a probar el siguiente ejemplo y veremos el problema de haber redefinido el equals sin haber redefinido el hashcode. public static void main(string[] args) { Direccion direccion = new Direccion("Esteban de Luca", 1322); Direccion otrainstancia = new Direccion("Esteban de Luca", 1322); System.out.println("direccion.equals(otraInstancia): " + direccion.equals(otrainstancia)); Collection<Direccion> coleccion = new HashSet<Direccion>(); coleccion.add(direccion); System.out.println("coleccion.contains(otraInstancia): " + coleccion.contains(otrainstancia)); La salida de este main es: direccion.equals(otrainstancia): true coleccion.contains(otrainstancia): false Es decir, tengo dos instancias iguales, pero la colección no se da cuenta que lo son. Para poder redefinir el equals evitando este problema, se sigue una regla simple: redefinir el hashcode haciendo que dependa de los mismos atributos de los cuales depende el equals. Si una dirección es igual a otra si son la misma calle y número, un hashcode válido puede public int hashcode() { return this.calle.hashcode() + this.numero; Annotations Una annotation es metadata que se le puede agregar a los elementos que componen una clase, o más genéricamente un tipo. Para ver todos los elementos que se pueden anotar, revise el Enum ElementType. 18
19 Vamos a modificar nuestro programa para informe por pantalla si está saludando a un mundo o a una persona. Saber si se trata de un mundo o de una persona, se puede saber preguntando por la clase. Lo que no se puede saber es el género de lo que representa la clase, es decir si es un mundo o una mundo. Entonces vamos a usar una annotation para agregar esta información. De manera similiar a crear una clase, hacemos clic derecho sobre el package ar.edu.utn.frba.tadp.entes, new Annotation, y la llamamos Articulo. En una annotation, solo podemos poder información que sea de tipo básico, String, Class o enums. (Los enums son un tipo de dato con un conjunto constante de valores). Cómo nosotros queremos agregar un solo valor, llamaremos a ese valor value. Ponerle ese nombre hace que sea más corta la forma de utilizarlo, pues a la hora de usar la annotation si no se indica ningún nombre java por defecto usará value. La annotation articulo nos quedará de la siguiente forma: package ar.edu.utn.frba.tadp.entes; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; Articulo { String value(); Qué Target(ElementType.TYPE)? Para crear nuestra annotation, estamos haciendo uso de otra annotation llamada Target, para indicar que esa annotation será usada sólo a nivel de tipo. Con lo cual si la usaramos para un atributo el compilador no nos dejará avanzar. Si hubieramos obviado el uso de esta annotation, lo único que hubiera pasado es que se podría usar la misma en cualquier lugar. Fíjese que ElementType es un enum, con todos los valores posibles de los lugares dónde se puede usar una annotation. La annotation del target era fácil deducirlo, pero y la Retention?. Las annotation tienen un tiempo de vida por el cual estarán disponbles. Hay tres niveles. Source: son annotation que viven en el.java y el compilador descartará al generar el binario, por ejemplo Override. Class: es el valor default, la annotation está presente en el archivo.class pero no mientras corre la JVM. Y la última es Runtime, en este caso el valor estará disponible en tiempo de ejecución. Anotemos ahora Mundo y Persona indicando que articulo debería usarse en cada caso. Mundo.java import ar.edu.utn.frba.tadp.entes.articulo; import public class Mundo implements Nombrable { 19
20 Persona.java package public class Persona implements Nombrable { Y modifiquemos la clase recepcionista para que haga uso de esta annotation import ar.edu.utn.frba.tadp.entes.articulo; import ar.edu.utn.frba.tadp.entes.nombrable; public abstract class Recepcionista { public void saludar(nombrable nombrable) { this.log(nombrable); System.out.println(this.armarSaludo(nombrable)); private void log(nombrable nombrable) { System.out.println("saludando a " + getarticulo(nombrable) + " " + nombrable.getclass().getsimplename()); private String getarticulo(nombrable nombrable) { return nombrable.getclass(). getannotation(articulo.class).value(); protected abstract String armarsaludo(nombrable nombrable); Fíjese que la annotation se le pide al class. De haber agregado una annotation en un atributo, entonces a la clase se le debe pedir el atributo (o field) y a el field la annotation. De la misma forma con un método. Corramos nuestros main de test para ver la salida: import ar.edu.utn.frba.tadp.entes.nombrable; import ar.edu.utn.frba.tadp.entes.persona; public class Test { public static void main(string[] args) { Recepcionista recepcionista = makerecepcionista(); Nombrable nombrable = new Mundo(); recepcionista.saludar(nombrable); System.out.println(); nombrable = new Persona("José"); 20
21 recepcionista.saludar(nombrable); private static Recepcionista makerecepcionista() { return new RecepcionistaClasico(); Consola: saludando a un Mundo hola Mundo saludando a una Persona hola José Para ver como se usa cuando quiero agregar más de un valor a una annotation, vamos a hace que a las personas le diga sr, mientras que al mundo no le diga nada. (Nótese que es un ejemplo didáctico, no pretendemos discriminar a las damas). Entonces modificaremos nuestra annotation de la siguiente manera: Articulo.java package ar.edu.utn.frba.tadp.entes; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; Articulo { String cardinal(); String titulo(); Mundo.java import ar.edu.utn.frba.tadp.entes.articulo; import titulo="") public class Mundo implements Nombrable { Persona.java package = "una", titulo = "Sr.") public class Persona implements Nombrable { En Recepcionista debemos cambiar para que en vez de usar value() use cardinal() 21
22 public abstract class Recepcionista { private String getarticulo(nombrable nombrable) { return nombrable.getclass().getannotation(articulo.class).cardinal(); Y vamos a cambiar nuestro recepcionista clásico para que use el título. import ar.edu.utn.frba.tadp.entes.articulo; import ar.edu.utn.frba.tadp.entes.nombrable; public class RecepcionistaClasico extends Recepcionista protected String armarsaludo(nombrable nombrable) { return "hola " + gettitulo(nombrable) + " " + nombrable.getnombre(); private String gettitulo(nombrable nombrable) { return nombrable.getclass(). getannotation(articulo.class).titulo(); Y ahora nuestra salida por consola es: saludando a un Mundo hola Mundo saludando a una Persona hola Sr. José Comentarios y Javadoc En java existen los clásicos comentarios heredados de c: //La doble barra comenta la línea entera /* esto es un comentario que puede extenderse varias líneas */ Sin embargo agrega un tipo especial de comentario llamado javadoc, que comienzan con /** y terminan con */ /** * Esto es un comentario javadoc */ Este tipo de comentario tiene un motivo especial, que es el de documentar todo lo que sea relevante al desarrollador que va a utilizar la clase (interface, o cualquier archivo java), allí se nombra el motivo de existencia del componente y los contratos implícitos. Un contrato implícito es aquel que no puede comprobar el compilador, pero que es necesario cumplir, por ejemplo, que tal atributo de un constructor no puede ser null. 22
23 Existen herramientas que procesan los comentarios javadoc para generar una presentación útil de la clase. El más conocido es el comando javadoc que viene con el jdk que genera documentación html. También en el eclipse al apretar F2 sobre algún componente lo muestra en una ventana. El javadoc se escribe especialmente para cada parte de un archivo java: Un comentario que explica para que sirve la clase, uno para cada método, y a veces se documenta los atributos cuándo éstos son relevantes. Por qué no es común comentar los atributos? Porque la idea es documentar la interfaz que va a usar un desarrollador. Si nuestra clase maneja correctamente el nivel de abstracción y presenta una interfaz sensata, sus atributos van a estar correctamente encapsulados y por lo tanto no sería importante para un usuario de la clase. Por esa característica de ser documentación, es importante que se agregue información que sea útil y no simplemente decir lo que puedo deducir al ver la firma del método. Por ejemplo, agregar un javadoc para un get o un set no es útil, porque todo lo que necesito está en el nombre del método. A veces el nombre y tipo del parámetro ya es lo suficientemente descriptivo cómo para que no sea necesario especificarlo. Vamos a ir documentando algunos de los componentes que realizamos con javadoc. Vamos a empezar a documentar la annotation artículo. package ar.edu.utn.frba.tadp.entes; import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target; /** * Indica cuáles son los artículos que corresponde usar con un * Nombrable para generar frases en el idioma castellano. Leo Gassman Articulo { /** * Dependiendo de si es masculino o femenino, * se admiten las formas "un" o "una" */ String cardinal(); /** * Es un título agregado al nombre */ String titulo(); En este ejemplo se ve claramente dónde está la documentación de la annotation, y dónde está la documentación de cada atributo. Hay otra cosa extraña que se observa. Hay unos comentarios que empiezan Estos son llamados tags y están predefinidos. Cada uno dice algo particular que podría ser útil al usuario. Estos tags son interpretados por las herramientas de presentación para formatear la información. En este caso usamos los tags author para indicar quien escribió la clase y see para decir que esta clase está relacionada con la Interface 23
24 Nombrable. Las herramientas de presentación suelen generar un link para navegar hacia el javadoc del componente relacionado. Para ver cómo puede resultar útil el javadoc, podemos ir a la clase Recepcionista clásico, poner el cursor sobre Articúlo.class y apretar f2 Y al poner el cursor sobre titulo() Hasta ahora escribimos comentarios que tienen que ver con la responsabilidad del componente. Sin embargo también es útil para decir ciertas características técnicas o contratos que cumple package ar.edu.utn.frba.tadp.entes; /** * Es un Value Object (inmutable) que representa * una dirección física Leo Gassman */ public class Direccion { private String calle; private int numero; /** calle Calle o Avenida del domicilio, no puede ser null numero Altura */ public Direccion(String calle, int numero) { this.calle = calle; this.numero = numero; Nótese que ahora en estos comentarios se ve un contrato implícito: que calle no puede ser null, porque la clase no está preparada para funcionar con este valor. (Si no me cree puede generar una Dirección sin calle y compararla contra otra). Y las direcciones son Value Objects 4 y por lo tanto inmutables. Lo cuál nos permite tomar ciertas decisiones en la forma de usarlas. Por otro lado introducimos un tag nuevo que es param, para dar indicaciones sobre los parámetros. 4 Puede consultar el apunte de Value Objects de la cátedra 24
25 Otro tag útil es el throws, que indica que un método puede salir por un error e indica cuál puede ser, en la próxima sección hablaremos un poco de excepciones. Por último, hay un tag llamado deprecated que se utiliza para indicar que un componente o método no debe utilizarse porque es algo viejo que existe por compatibilidad hacia atrás. Significa que hay una forma mejor de cumplir con la responsabilidad que hay detrás del componente o método, pero aún no puedo borrar la forma vieja porque se está usando. Es importante indicar al momento de deprecar cual es la nueva forma de realizar lo que se necesitaba. Vamos a deprecar el método viveen de Persona, porque por convención no queremos utilizar artículos en los nombres de los mensajes. /** use {@link Persona#vive(Direccion) */ public boolean viveen(direccion direccion) { return this.vive(direccion); /** si es la dirección de la Persona */ public boolean vive(direccion direccion) { return this.direccion.equals(direccion); Note cómo al deprecar el eclipse tacha el nombre del método para resaltar que no conviene usarlo. Por otro lado, aparece el tag link que sirve para que las herramientas generen un vínculo con otro javadoc. También aparece en el método vive el tag return para decir algo acerca sobre lo que devuelve el método 25
26 Para terminar de ver la utilidad de javadoc, es interesante ver los generados para las mismas clases de java, en particular mire el javadoc de equals y hashcode de Object, y el de la interface Set, pués no es solamente información útil para quien va a llamar a esos métodos o usar un Set, si no para aquellos que quieran extender o implementar un Object o un Set. Dijimos más atrás que existe un comando que convierte el javadoc en html. El eclipse sabe utilizar este comando, entonces vamos a generar el html. Clic derecho sobre el proyecto -> export -> java -> javadoc -> next Se puede elegir un destino, por default va a crear una carpeta doc dentro del workspace. Dejamos esta opción y clic en fisish. Y le decimos que sí a la nueva ventana de confirmación. Ahora con un browser se puede navegar la documentación del proyecto. Excepciones 5 Mis primeros bugs. Vamos a correr el siguiente main public static void main(string[] args) { 5 En esta sección se abarca el tema en forma básica. Para más detalles se puede consultar el apunte de excepciones de la cátedra 26
27 Persona persona = new Persona(); Direccion direccion = new Direccion("Esteban de Luca", 1322); if(persona.vive(direccion)) { System.out.println(persona + "vive en " + direccion); else { System.out.println(persona + "no vive en " + direccion +", vive en" + persona.getdireccion()); En teoría este main debería imprimir si una persona vive o no en una dirección, pero sin embargo por consola pasa lo siguiente: Exception in thread "main" java.lang.nullpointerexception at ar.edu.utn.frba.tadp.entes.persona.vive(persona.java:50) at ar.edu.utn.frba.tadp.holamundo.test.main(test.java:15) Esto ocurre cuando hubo un error en el programa, y lo que uno ve por pantalla es lo que se llama stack trace. En un stack trace se ve dos cosas principalmente: la excepción ocurrida y cuál es el camino de los llamados a métodos que la provocaron. En nuestro caso la excepción es NullPointerException, lo cual significa que se envió un mensaje a una referencia que estaba nula (probablemente falta una inicialización). A veces la excepción viene acompañada también de un mensaje que agrega información útil para entender que es lo que ocurre. Para detectar el lugar dónde está el problema, hay que ver el camino de llamados. El stack se lee de abajo hacia arriba: el método main de la clase Test llamó en la línea 15 al método vive de la clase Persona que en la línea 50 lanzó una NullPointerException. Entonces, vamos a la línea 50 de Persona (con el eclipse basta al hacer clic en el stack trace sobre Persona.java:50) y vemos la siguiente línea: return this.direccion.equals(direccion); Sabemos ahora que hay una referencia nula, Quién es? La Persona this? El atributo direccion? El parámetro direccion? La referencia nula es dentro del equals? La Persona que recibe el mensaje no puede ser nula, de lo contrario no se hubiera empezado a ejecutar el método. Si el error hubiera sido dentro del equals, debería haber aparecido una línea más dentro del stack trace. El problema no puede ser el argumento porque ningún mensaje es enviado a él, sólo se usa para pasarlo dentro del equals. El problema está entonces en el atributo this.dirección. No sólo porque los demás no pueden ser, si no porque el equals es el único mensaje que se dispara en esa línea, Recordenos que la excepción NullPointerException significa que el receptor de un mensaje es nulo. Para corroborar nuestras sospechas, revisamos que al instanciar la Persona en el main, no le dijimos en ningún momento cuál es la Dirección, es más tampoco le asignamos el nombre! Corregimos agregando los seteos y corremos de nuevo: public static void main(string[] args) { Persona persona = new Persona(); Direccion direccion = new Direccion("Esteban de Luca", 1322); persona.setdireccion(direccion); persona.setnombre("leo"); if(persona.vive(direccion)) { System.out.println(persona + " vive en " + direccion); else { System.out.println(persona + " no vive en " + direccion +", vive en" + persona.getdireccion()); 27
28 La consola dice: Leo vive en Esteban de Luca 1322 Otros errores muy comunes: Castear un objeto a un tipo que no corresponde, suele ocurrir mucho al trabajar con colecciones: public class Test { static Direccion direccion = new Direccion("Esteban de Luca", 1322); public static void main(string[] args) { Collection<Nombrable> nombrables = getnombrables(); for (Nombrable nombrable : nombrables) { if(((persona)nombrable).vive(direccion)) { System.out.println(nombrable + " vive en mi casa"); private static Collection<Nombrable> getnombrables() { Collection<Nombrable> nombrables = new ArrayList<Nombrable>(); nombrables.add(new Persona("Leo", direccion)); nombrables.add(new Mundo()); nombrables.add(new Persona("fulano", direccion)); return nombrables; Leo vive en mi casa Exception in thread "main" java.lang.classcastexception: ar.edu.utn.frba.tadp.holamundo.mundo cannot be cast to ar.edu.utn.frba.tadp.entes.persona at ar.edu.utn.frba.tadp.holamundo.test.main(test.java:17) Esto se puede ver como que en el main, línea 17, Ocurrió una ClassCastException, se tenía una referencia a una variable de tipo Mundo y se quiso ver como Persona. Si revisamos es verdad, porque en la colección de Nombrables había mezclados mundos y Personas. Arreglar este error ya es un poco más complicado porque hay que cambiar una decisión de diseño: tener Personas y Mundos mezclados en esa colección que se usa para verificar si hay mas cosas que viven en mi casa, o agregar el mensaje vive en la interface Nombrable para que todos puedan contestar. Cuando uno quiere correr algo sobre código que no compila, también ocurre una excepción. 28
29 La consola muestra: Exception in thread "main" java.lang.error: Unresolved compilation problems: Esto cannot be resolved to a type Syntax error on token "compila", ; expected at ar.edu.utn.frba.tadp.holamundo.test.main(test.java:18) Acciones sobre excepciones En java las excepciones son objetos que extienden de una clase llamada Exception. Sin embargo hay una subclase particular llamada RuntimeException. El compilador concede ciertas libertades a las excepcions Runtime y sus subclases. Hasta el momento, las excepciones que vimos son runtime (también llamadas no chequeadas), por lo que el compilador no nos molestó para nada. Usaremos ahora una excepción chequeada. Vamos a hacer entonces una clase Cartero, que tiene que generar un archivo con las direcciones de un conjunto de personas, para visitar y llevarle correspondencia. Vamos a genear un package correo. Test.java import java.util.arraylist; import java.util.collection; import ar.edu.utn.frba.cartero.cartero; import ar.edu.utn.frba.tadp.entes.direccion; import ar.edu.utn.frba.tadp.entes.persona; public class Test { public static void main(string[] args) { new Cartero().generarHojaDeRuta(getPersonas(), "c:\\direcciones.txt"); 6 private static Collection<Persona> getpersonas() { Collection<Persona> personas = new ArrayList<Persona>(); personas.add(new Persona("Leo", new Direccion("Esteban de Luca", 1322))); personas.add(new Persona("Fulano", new Direccion("Echeverría", 978))); personas.add(new Persona("Mengano", new Direccion("Colón", 2183))); return personas; Cartero.java package ar.edu.utn.frba.cartero; import java.io.filewriter; import java.io.writer; import java.util.collection; public class Cartero { 6 Al igual que en C, el carácter \ es de control, y por eso es necesario utilizar \\ 29
30 { public void generarhojaderuta(collection<persona> personas, String filename) Writer writer = new FileWriter(fileName); for (Persona persona : personas) { writer.append(persona.tostring()); writer.append(" "); writer.append(persona.getdireccion().tostring()); writer.append("\n"); 7 writer.close(); Al escribir esto, el eclipse subraya en rojo varias líneas. Abrimos la vista de problemas Windows -> show views -> problems. Y nos encontramos con: Se queja de que Writer y FileWriter declara que puede ocurrir una excepción de tipo IOException y nosotros no estamos tomando ninguna decisión con respecto a eso. Hay tres decisiones que uno puede tomar ante la ocurrencia de una excepción. 1) Que se arregle el que me llamó, yo no hago nada, simplemente declaro que mi método puede tirar excepción y entonces va a subir el problema por el stack trace hasta que alguien la trate o la máquina virtual nos corte la ejecución. Esta aproximación es la misma que usabamos antes cuando el compilador no nos molestaba: si en persona ocurría una NullPointerException se propagaba al main, quien no tomaba acción alguna y entonces la VM cancelaba el programa. 7 Al igual que en C el caracter \n indica salto de línea 30
31 2) Manejar el problema, esto ocurre si se sabe que hacer como alternativa. En nuestro caso, para explorar esta opción, diremos que si no puede escribirse el archivo, escriba la información por consola. 8 3) Una combinación de ambos: el manejo de la excepción es generar una nueva para agregar más información Propagación de la excepción Consiste en declarar que nuestro método tira una excepción en la firma del mismo: public class Cartero { public void generarhojaderuta(collection<persona> personas, String filename) throws IOException{ Al hacer esto Cartero comienza a compilar, sin embargo existe un error en nuestro main, porque ahora estamos usando un método que declara que puede terminar con excepción, y no estamos tomando ninguna acción al respecto. Siguiendo la política de que no sabemos que hacer en caso de error, vamos a hacer que el main declare que puede ocurrir la misma, para que la VM se haga cargo si ocurriera el problema. public static void main(string[] args) throws IOException { new Cartero().generarHojaDeRuta(getPersonas(), "c:\\direcciones.txt"); Ahora sí podemos ejecutar el programa y la salida es un archivo en el disco que contiene: Leo Esteban de Luca 1322 Fulano Echeverría 978 Mengano Colón 2183 Manejo del error En este caso suponemos que es lo que el método hoja de ruta debe hacer al ocurrir el problema, por lo tanto eliminamos las declaraciones de la excepción en el método. Luego, nos valemos del bloque try/catch. Esta construcción del lenguaje permite decir intente ejecutar lo que está en el try pero que si ocurre un error de un tipo determinado entonces ejecute el catch. Vea cómo queda el ejemplo luego de realizar cierto emprolijamiento de métodos. El método grabararchivo aún declara error, porque no sabe que hacer cuando esto ocurre. El que tiene el conocimiento es el método generarhojaderuta. public class Cartero { 8 Recuerde que es un ejemplo didáctico 31
32 public void generarhojaderuta(collection<persona> personas, String filename) { try { this.grabararchivo(personas, filename); catch (IOException e) { this.imprimirpantalla(personas); private void imprimirpantalla(collection<persona> personas) { for (Persona persona : personas) { System.out.print(this.item(persona)); private void grabararchivo(collection<persona> personas, String filename)throws IOException { Writer writer = new FileWriter(fileName); for (Persona persona : personas) { writer.append(this.item(persona)); writer.close(); private String item(persona persona) { return persona + " " + persona.getdireccion() + "\n"; Ahora nuestro programa funciona normalmente y el main no se enteró de que puede ocurrir una IOException. Para ver funcionando a nuestro bloque catch, vamos a forzar que el método grabararchivo arroje la excepción. Una forma es haciendo que ocurra realmente un problema en el disco, por ejemplo usar una dirección inválida. Pero otra forma más interesante a fines didácticos es generando nosotros un error dentro del método grabar archivo. Esto se hace con la palabra reservada throw, que indica que el objeto a continuación es una excepción que tiene que ser lanzada. private void grabararchivo(collection<persona> personas, String filename) throws IOException { Writer writer = new FileWriter(fileName); for (Persona persona : personas) { writer.append(this.item(persona)); writer.close(); throw new IOException(); Luego de esta modificación, por consola se puede observar Leo Esteban de Luca 1322 Fulano Echeverría 978 Mengano Colón 2183 Hay otro bloque llamado finally que viene de la mano con el try/ catch. El mismo se utiliza cuando hay algo que queremos hacer independientemente de si ocurre un problema o no. En este documento no lo utilizaremos. 32
33 Excepciones anidadas La tercera opción persigue la idea de ir elevando el nivel de abstracción del error. Por lo tanto cuando ocurre un error grabando el archivo, no quiero que el método me diga tengo un problema de entrada y salida si no que me diga algo así cómo No se puede generar la hoja de ruta. Entonces, para lo siguiente vamos a generar una excepción nuestra llamada HojaDeRutaException. Para eso basta con generar una clase y hacerla extender de Exception (si quiero que sea chequeada) o de RuntimeException (si quiero que sea no chequeada). package ar.edu.utn.frba.cartero; public class HojaDeRutaException extends RuntimeException { public HojaDeRutaException(String message, Throwable cause) { super(message, cause); Las excepciones tienen básicamente dos atributos: un mensaje de error, y una causa que es otra excepción. Así queda nuestro ejemplo del cartero. public class Cartero { public void generarhojaderuta(collection<persona> personas, String filename) { try { this.grabararchivo(personas, filename); catch (IOException e) { throw new HojaDeRutaException("No se pudo generar la" + "hoja de ruta en la dirección: " + filename, e); Vamos a forzar el error esta vez usando una dirección inválida de archivo. Y vamos a ver cómo la excepción se propaga hasta la VM y el stack trace que se genera. public static void main(string[] args) { new Cartero().generarHojaDeRuta(getPersonas(), "estadireccionesinvalida"); Stack trace: Exception in thread "main" ar.edu.utn.frba.cartero.hojaderutaexception: No se pudo generar la hoja de ruta en la dirección: HH:\estaDireccionEsInvalida at ar.edu.utn.frba.cartero.cartero.generarhojaderuta(cartero.java:17) at ar.edu.utn.frba.tadp.holamundo.test.main(test.java:13) Caused by: java.io.filenotfoundexception: HH:\estaDireccionEsInvalida (The filename, directory name, or volume label syntax is incorrect) at java.io.fileoutputstream.open(native Method) at java.io.fileoutputstream.<init>(fileoutputstream.java:179) at java.io.fileoutputstream.<init>(fileoutputstream.java:70) at java.io.filewriter.<init>(filewriter.java:46) at ar.edu.utn.frba.cartero.cartero.grabararchivo(cartero.java:23) at ar.edu.utn.frba.cartero.cartero.generarhojaderuta(cartero.java:14)... 1 more 33
34 No asustarse! El stack trace a simple vista parece feo pero si aprendemos a entenderlo puede ser un gran amigo. Qué es lo que está diciendo? Primero leemos la excepción sin tener en cuenta los métodos por los que pasó. Esto nos da una idea del problema sin entrar en el detalle de dónde ocurrió: No se pudo generar la hoja de ruta en la dirección: HH:\estaDireccionEsInvalida Caused by: java.io.filenotfoundexception: HH:\estaDireccionEsInvalida (The filename, directory name, or volume label syntax is incorrect) Ahora se entiende un poco mejor! Por suerte los mensajes de las excepciones fueron escritos a conciencia y dan una buena idea de lo que ocurre: No se pudo generar la hoja de ruta porque la dirección dónde se quiso generar es sintácticamente incorrecta. Y además es tan amable de decirnos cual es la dirección del problema. Ahora veamos cómo con este stack trace puedo llegar hasta el problema. La primera línea que hace referencia a un método en cada excepción es el lugar dónde se lanzó esa excepción, es decir la línea dónde están los throws: ar.edu.utn.frba.cartero.cartero.generarhojaderuta(cartero.java:17) es: throw new HojaDeRutaException("No se pudo generar la hoja de ruta en la dirección: " + filename, e); y at java.io.fileoutputstream.open(native Method) 9 es Oh! Diantres!! No tengo disponible el código dónde ocurre realmente la excepción. Qué hago? En ese caso empiezo a bajar en la sección del stack trace correspondiente a esta excepción hasta encontrar una línea que tenga que ver con lo que yo escribí, es decir, una clase mía y no de terceros porque ahí no puedo tomar ninguna acción. En nuestro caso la primera línea que tiene sentido es: at ar.edu.utn.frba.cartero.cartero.grabararchivo(cartero.java:23) correspondiente a: Writer writer = new FileWriter(fileName); Bien, de estas dos líneas se deduce que, la excepción de no poder generar la hoja de ruta es causa de que me explota la aplicación al instanciar un FileWriter. Por el mensaje de error me doy cuenta que el problema es que ese filename está mal formado, por lo tanto tengo que rastrear en el stack hasta ver de dónde sale este parámetro: at ar.edu.utn.frba.cartero.cartero.generarhojaderuta(cartero.java:14) me lleva a : this.grabararchivo(personas, filename); Acá también filename es un parámetro, por lo tanto aún no tengo el punto dónde arreglar. Cómo es la última línea de esta excepción, sigo navegando en el bloque de la primera, siguiendo la pista de dónde viene el filename: at ar.edu.utn.frba.tadp.holamundo.test.main(test.java:13) new Cartero().generarHojaDeRuta(getPersonas(), "HH:\\estaDireccionEsInvalida"); Finalmente encontré el lugar dónde se genera el valor de filename, causa de todos los males. Cambio este valor por un valor válido y nuevamente nuestro programa funciona correctamente. 9 Un método nativo no está escrito en java, si no que la máquina virtual hace un llamado al sistema operativo. 34
Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK.
Introducción Java surgió en 1991 dentro de la empresa Sun Microsystems como un lenguaje de programación sencillo y universal destinado a electrodomésticos. La reducida potencia de cálculo y memoria de
Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación. IIC1102 Introducción a la Programación
Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación IIC1102 Introducción a la Programación Tutorial eclipse TM Introducción al uso de eclipse TM Contents
Curso de Java POO: Programación orientada a objetos
Curso de Java POO: Programación orientada a objetos Luis Guerra Velasco Curso INEM 02830. Programación en Java Marzo 2010 Índice 1 Introducción a la POO 2 Herencia y polimorfismo 3 Empaquetado de proyectos
Tutorial básico del entorno de desarrollo Eclipse.
Tutorial básico del entorno de desarrollo Eclipse. Arrancar Eclipse. Después de descomprimir la aplicación, dar doble clic sobre el ícono ejecutable para arrancar la aplicación. En caso de que se presente
Java en 2 horas. Rodrigo Santamaría
+ Java en 2 horas Rodrigo Santamaría + Generalidades 2 Desarrollado por Sun en 1995 Hereda mucha de la sintaxis de C (1972) Fuertemente tipado y orientado a objetos Aplicaciones compiladas a bytecode Gestión
Programación Orientada a Objetos con Java
Programación Orientada a Objetos con Java M.C. Jorge Eduardo Ibarra Esquer [email protected] Sobrecarga de métodos Java permite la definición de dos o más métodos que tengan el mismo nombre, dentro de la
1. El entorno de desarrollo Eclipse
Índice 1. El entorno de desarrollo Eclipse 1 1.1. Qué es Eclipse?........................................................ 1 1.2. Trabajando con Eclipse....................................................
Pruebas de unidad con JUnit
Pruebas de unidad con JUnit Cuando se implementa software, resulta recomendable comprobar que el código que hemos escrito funciona correctamente. Para ello, implementamos pruebas que verifican que nuestro
CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa [email protected]
CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa [email protected] En este documento explicaré brevemente cómo construir un servicio web con Java Axis2 y cómo invocarlo desde un cliente
El lenguaje de programación Java
Departament d Arquitectura de Computadors El lenguaje de programación Java Java (I) Orientado a objetos Ejecutado por una maquina virtual Independiente de la plataforma Multithreaded Orientado a la red
Modulo 1 El lenguaje Java
Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto
Modelo de Objetos Distribuidos
Remote Method Invocation Modelo de Objetos Distribuidos Un objeto remoto es un objeto cuyos métodos pueden ser invocados desde otra máquina virtual de java, potencialmente en un host diferente. Modelo
Clase Práctica Nº 1 ED 2015
Clase Práctica Nº 1 ED 2015 Introducción La creación de una solución de software tiene varias etapas, por ejemplo: Diseño Implementación Testeo Y para cada etapa existen herramientas que nos ayudan. Introducción
Definición de clases: Herencia, polimorfismo, ligadura dinámica
Tema 7 Definición de clases: Herencia, polimorfismo, ligadura dinámica Con alguna frecuencia es necesario definir clases de objetos entre las cuales hay elementos comunes. En una aplicación en la cual
2. Estructura de un programa en Java
24 A. García-Beltrán y J.M. Arranz 2. Estructura de un programa en Java Objetivos: a) Describir la estructura del código fuente de una aplicación Java b) Presentar los conceptos de comentario y de identificador
PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases
PHP y MySQL Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases Herencia de Objetos La herencia permite crear muchas clases que son similares entre si, sin tener
Carrera: Analista de Sistemas. Asignatura: Resolución de Problemas y Algoritmos - 2008-
Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos INSTRUCTIVO PARA EL USO DEL ENTORNO DE DESARROLLO ECLIPSE - 2008- 1) Creación de espacio o carpeta de trabajo (workspace) Primero,
Conociendo el ambiente de programación de Java. M. en C. Erika Vilches
Conociendo el ambiente de programación de Java M. en C. Erika Vilches La variable PATH Una vez que se ha aceptado la licencia del JDK y que se ha instalado satisfactoriamente y antes de poder utilizarlo,
Java en 3 horas. Ampliación de Sistemas Operativos. Rodrigo Santamaría
Java en 3 horas Ampliación de Sistemas Operativos Rodrigo Santamaría Generalidades Desarrollado por Sun Hereda mucha de la sintaxis de C (1972) Fuertemente tipado y orientado a objetos Aplicaciones compiladas
Programación Orientada a Objetos en Java
Programación Orientada a Objetos en Java Curso 2006-2007 Tema 4 Herencia y Polimorfismo Gonzalo Méndez Pozo Dpto. de Ingeniería de Software e Inteligencia Artificial Universidad Complutense de Madrid Herencia
9. Objetos y clases. 9.1. Clases
Programación orientada a objetos con Java 103 9. Objetos y clases Objetivos: a) Presentar el concepto de objeto, clase, atributo, método e instancia b) Interpretar el código fuente de una aplicación Java
RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA
UNED Centro Asociado de Cádiz RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA 1. OBJETOS Cualquier elemento del programa es un objeto. Un programa es un conjunto de objetos que se comunican entre sí
Introducción... 1 Qué es Java?... 1 Compilando a Bytecode... 1 Usando jgrasp Para Hacer el Trabajo Sucio... 5 El Entorno de jgrasp...
Contenido Introducción... 1 Qué es Java?... 1 Compilando a Bytecode... 1 Usando jgrasp Para Hacer el Trabajo Sucio... 5 El Entorno de jgrasp... 5 Introducción Es tiempo de hablar en detalle de lo que significa
Introducción a la Programación Orientada a Objetos
Introducción a la Programación Orientada a Objetos El paradigma imperativo. En un programa se tienen una serie de variables con las cuales operamos y modificamos mediante sentencias y funciones para producir
INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B)
APRENDERAPROGRAMAR.COM INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B) Sección: Cursos Categoría: Curso Aprender programación Java desde cero Fecha revisión:
Manual de Instalación y uso de FTP
Manual de Instalación y uso de FTP Que es el FTP? El FTP es un sistema que nos permite de forma cómoda subir o bajar archivos a otra ubicación. Hay FTP públicos y privados, es decir en algunos todo el
Curso de PHP con MySQL Gratis
Curso de PHP con MySQL Gratis Introducción Este mini curso o mini tutorial de PHP le ayudará a realizar cualquier sistema para que pueda insertar uno o varios registros a una base de datos con MySQL, este
Tutorial: Primeros Pasos con Subversion
Tutorial: Primeros Pasos con Subversion Introducción Subversion es un sistema de control de versiones open source. Corre en distintos sistemas operativos y su principal interfaz con el usuario es a través
I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein Javier Navarro
I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein Javier Navarro Utilizando Clases Definidas en Java La manera de utilizar una clase previamente definida
En términos generales, un foro es un espacio de debate donde pueden expresarse ideas o comentarios sobre uno o varios temas.
1 de 18 Inicio Qué es un foro En términos generales, un foro es un espacio de debate donde pueden expresarse ideas o comentarios sobre uno o varios temas. En el campus virtual, el foro es una herramienta
Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle
Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle Contenido Tipos de herencia Herencia y niveles de visibilidad Herencia y creación Redefinición de métodos Conversión
Módulo 1 El lenguaje Java
Módulo 1 El lenguaje 1.1 Presentación de es un lenguaje de programación desarrollado por la empresa Sun Microsystems en 1991 como parte de un proyecto secreto de investigación llamado Green Proyect, con
Creación y administración de grupos de dominio
Creación y administración de grupos de dominio Contenido Descripción general 1 a los grupos de Windows 2000 2 Tipos y ámbitos de los grupos 5 Grupos integrados y predefinidos en un dominio 7 Estrategia
Programación en Java. Programación en OO
Programación en OO Lección 4:Programación en OO 1. Herencia 2. Modificadores de Acceso 3. Interfaces Herencia Es la acción en la que una clase obtiene los métodos y propiedades definidos en otra clase,
TUTORIAL ACADÉMICO. Programación II- Taller de Programación I Fa.CENA. UNNE
TUTORIAL ACADÉMICO Programación II- Taller de Programación I Fa.CENA. UNNE Eclipse, es un Entorno de Desarrollo Profesional y Gratuito, que puede ser utilizado para varios lenguajes Java, C, C++, PHP,
Tutorial Enterprise Architect 7.5 Versión en español
Página 1 de Tutorial Enterprise Architect 7.5 Versión en español Página 2 de Índice Aspectos básicos Vistazo general. 3 Diagrama de Clases.. 4 Atributos 6 Métodos. 10 Relaciones.. 11 Configuración de Opciones
En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.
Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa
Kosmo Desktop Manual de desarrollo Instalación y configuración del código fuente de Kosmo en Eclipse
Kosmo Desktop Manual de desarrollo Instalación y configuración del código fuente de Kosmo en Eclipse Versión 3.0 02/12/2010 2 3 1 Control de versiones VERSIÓN AUTOR FECHA CAMBIO 1.0 SAIG, S.L. 22/03/2007
G R U P O S INDICE Cómo crear una cuenta en ARQA? Cómo tener un grupo en ARQA? Secciones y funcionalidades de los grupos Configuración del grupo
INDICE Cómo crear una cuenta en ARQA? 4 Cómo tener un grupo en ARQA? 5 Secciones y funcionalidades de los grupos 6 Muro del Grupo 6 Compartir Textos 8 Compartir Imágenes 9 Compartir videos 10 Compartir
TUTORIAL PRÁCTICO DE BASES DE DATOS EN ACCESS CREAR UNA AGENDA
TUTORIAL PRÁCTICO DE BASES DE DATOS EN ACCESS CREAR UNA AGENDA Antes de iniciar con nuestro tutorial, conozcamos algunos conceptos que vamos a utilizar en este tutorial: Que es una base de datos: Una base
MINI MANUAL PARA CREAR FORMULARIOS CON PHP Marzo 2007
MINI MANUAL PARA CREAR FORMULARIOS CON PHP Marzo 2007 Servicio de Informática y Comunicaciones Para poder diseñar un formulario y que éste nos envíe los resultados a nuestro correo electrónico, necesitamos
Introducción al lenguaje Java
Tipo de entrega: Fecha límite: Lugar: Introducción al lenguaje Java por grupos de prácticas sesión de laboratorio Atenea Objetivos de la práctica: Escribir aplicaciones simples en Java Utilizar el entorno
Tutorial: Instalación de Eclipse para programar Android en Windows
Tutorial: Instalación de Eclipse para programar Android en Windows En este tutorial vamos a aprender todo lo necesario para dejar nuestra computadora lista para programar en Java para Android, por medio
Creando una webquests
Creando una webquests 1. LO PRIMERO EL PROGRAMA Para crear paginas web necesitamos el software apropiado. Hay muchas formas y programas para hacerlo, pero por su facilidad de uso y por ser software libre
SOLUCION PARCIAL TASK SCHEDULER. Task Scheduler
Task Scheduler Se necesita modelar una aplicación que permita definir tareas y ejecutarlas en forma programada. Las tareas pueden ser: La ejecución de programa cualquiera o comando del sistema operativo,
FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005
Dpto. de Ingeniería de Sistemas Telemáticos E.T.S.I. Telecomunicación Universidad Politécnica de Madrid FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005 Normas de examen: Con libros y apuntes Duración: 2 horas
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1.1 Ejercicio 1: Máquina Expendedora (3.5 ptos.)... 1 1.2 Ejercicio 2: Clase Circulo (1.0 pto.)... 3 1.3 Ejercicio
Java Inicial (20 horas)
Java Inicial (20 horas) 1 Temario 1. Programación Orientada a Objetos 2. Introducción y Sintaxis Java 3. Sentencias Control Flujo 4. POO en Java 5. Relaciones entre Objetos 6. Polimorfismo, abstracción
15 CORREO WEB CORREO WEB
CORREO WEB Anteriormente Hemos visto cómo funciona el correo electrónico, y cómo necesitábamos tener un programa cliente (Outlook Express) para gestionar los mensajes de correo electrónico. Sin embargo,
Introducción a la Programación en MATLAB
Introducción a la Programación en MATLAB La programación en MATLAB se realiza básicamente sobre archivos M, o M-Files. Se los denomina de esta forma debido a su extensión.m. Estos archivos son simple archivos
Instrucciones de instalación de TrueCode
Gracias por su compra y las instrucciones que le guiara a través del proceso de instalación y puesta en marcha de su nuevo software. Se recomienda la lectura y las discusiones de los usuarios por favor
1. El entorno de desarrollo Eclipse
Índice 1. El entorno de desarrollo Eclipse 1 1.1. Qué es Eclipse?........................................................ 1 1.2. Trabajando con Eclipse....................................................
MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I 75.35. Facultad de Ingeniería, UBA. Junio 2002. Cátedra: Pablo Cosso
MICQ Facultad de Ingeniería, UBA. Junio 2002 Trabajo Práctico Final Seminario de Ingeniería en Informática I 75.35 Cátedra: Pablo Cosso Alumno: Diego Fernando Montaldo 75.300 1 de 1 Introducción Este documento
Creación de Funciones de Conducción
Creación de Funciones de Conducción Requerimientos Para el desarrollo de esta actividad se requiere que: Contemos con un robot BoeBot armado con placa Arduino. Repetición En estos momentos habremos notado
AGREGAR COMPONENTES ADICIONALES DE WINDOWS
INSTALACIÓN DE IIS EN WINDOWS XP El sistema está desarrollado para ejecutarse bajo la plataforma IIS de Windows XP. Por esta razón, incluimos la instalación de IIS (Servidor de Web) para la correcta ejecución
2.2.- Paradigmas de la POO
2.2.- Paradigmas de la POO Los principios propios de la orientación a objetos son: 2.2.1.- Abstracción de Datos 2.2.2.- Encapsulamiento 2.2.3.- Ocultamiento 2.2.4.- Herencia 2.2.5.- Polimorfismo Cualquier
Internet Information Server
Internet Information Server Internet Information Server (IIS) es el servidor de páginas web avanzado de la plataforma Windows. Se distribuye gratuitamente junto con las versiones de Windows basadas en
La plantilla propone aprovechar esta estructura en común y sólo modificar el contenido del área del documento que sea diferente.
PLANTILLAS EN PHP El concepto de plantilla, es un criterio del desarrollo web que propone optimizar la cantidad de documentos HTML que se usan en el desarrollo de un sitio web. A lo largo de la navegación
EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011
EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011 1. (0,75 PUNTOS) Identificad a continuación las sentencias que son ciertas, descartando
5. Composer: Publicar sus páginas en la web
5. Composer: Publicar sus páginas en la web Si nuestras páginas existen únicamente en el disco duro local, sólo nosotros podremos navegar por ellas, pero nadie más podrá hacerlo. Composer nos permite publicarlas
Primer Parcial Septiembre 5 de 2009
Primer Parcial Septiembre 5 de 2009 Algoritmos y Lenguajes II Reglas del juego Tal como se le dijo antes, durante este examen usted no puede pedir ABSOLUTAMENTE nada prestado a sus compañeros, ni hablar
Tema 1. Introducción a JAVA
Tema 1. Introducción a JAVA Historia Características Plataforma Java Entorno de desarrollo Ejemplo: Hola mundo Estructura general de un programa Java 1 Historia de Java (i) Surge en 1991: Sun Microsystems
(volver a Tabla de Contenidos)
Para escribir, compilar y ejecutar un programa en Java lo único que realmente se necesita y no viene incluido con el sistema operativo es el kit de desarrollo de Java, denominado SDK (Software Development
TEMA 20 EXP. WINDOWS PROC. DE TEXTOS (1ª PARTE)
1. Introducción. TEMA 20 EXP. WINDOWS PROC. DE TEXTOS (1ª PARTE) El Explorador es una herramienta indispensable en un Sistema Operativo ya que con ella se puede organizar y controlar los contenidos (archivos
Introducción a PHP. * No es necesario declarar previamente las variables.
Introducción a PHP La programación de sitios web cada día está más orientada al desarrollo de páginas dinámicas y aplicaciones, o sea sitios donde el usuario pueda interactuar con la web. Dentro de los
Creación paso a paso de Formularios con Google (Parte I) (AKA: no corrijo nunca más!)
Creación paso a paso de Formularios con Google (Parte I) (AKA: no corrijo nunca más!) por Rodrigo Martínez Gazoni La idea de este tutorial es meternos en una de los servicios que ofrece Google en forma
Guía de uso del sistema CV-Online
Guía de uso del sistema CV-Online 1.- Registro. a.- Pasos para completar el formulario. 2.- Ingreso al sistema. a.- Olvidó su Usuario o contraseña? b.- Consulta. c.- Crear nueva cuenta. 3.- Administrador
Ayuda para la instalación Componente Firma Digital INDICE. 1 Configuración previa...2. 1.1 Configuración Internet Explorer para ActiveX...
INDICE 1 Configuración previa...2 1.1 Configuración Internet Explorer para ActiveX...2 1.2 Problemas comunes en sistema operativo Windows...8 1.2.1 Usuarios con sistema operativo Windows XP con el Service
Universidad ORT - Arquitecturas de Software sobre plataforma JEE Web Services (parte 1)
Requisitos Oracle Java Development Kit (JDK) 6 NetBeans 6.9.1 con GlassFish Application Server 3 integrado Variable de entorno JAVA_HOME apuntando al directorio de instalación de la JDK Introducción El
Programa diseñado y creado por 2014 - Art-Tronic Promotora Audiovisual, S.L.
Manual de Usuario Programa diseñado y creado por Contenido 1. Acceso al programa... 3 2. Opciones del programa... 3 3. Inicio... 4 4. Empresa... 4 4.2. Impuestos... 5 4.3. Series de facturación... 5 4.4.
Sintaxis y Convenciones de Java. M. en C. Erika Vilches
Sintaxis y Convenciones de Java M. en C. Erika Vilches Estructura del Código en Java Hay una clase en un archivo fuente Hay métodos en una clase Hay enunciados en un método Anatomía de una Clase Cuando
Manual de NetBeans y XAMPP
Three Headed Monkey Manual de NetBeans y XAMPP Versión 1.0 Guillermo Montoro Delgado Raúl Nadal Burgos Juan María Ruiz Tinas Lunes, 22 de marzo de 2010 Contenido NetBeans... 2 Qué es NetBeans?... 2 Instalación
Examen Septiembre Curso 2001-2002 -- Programación en C++ Pág. 1
Examen Septiembre Curso 2001-2002 -- Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1.1 Ejercicio 1: Convertidor Dec->Hex y Hex->Dec (5.0 ptos.)... 1 1.1.1 Apartado A (4.0 ptos.)... 1 1.1.2 Apartado B (1.0
Selección de los puntos de montaje
PARTICIONES PARA LINUX Selección de los puntos de montaje Tanto para aquellos que vayan a instalar ahora, como para quienes quieran cambiar el tamaño de una partición o formatear este apunte (resumen de
COMPROBACIONES BÁSICAS PARA EL USO DE FIRMA EN EL RTC
TITULO: COMPROBACIONES BÁSICAS PARA EL USO DE FIRMA EN EL RTC RESUMEN: La idea de este documento es mostrar una serie de acciones y ayudas básicas para intentar determinar y solucionar problemas en la
Ingeniería del Software I Clase de Testing Funcional 2do. Cuatrimestre de 2007
Enunciado Se desea efectuar el testing funcional de un programa que ejecuta transferencias entre cuentas bancarias. El programa recibe como parámetros la cuenta de origen, la de cuenta de destino y el
TEMA 5. INTRODUCCIÓN AL MANEJO DE ORIGIN 6.1
TEMA 5. INTRODUCCIÓN AL MANEJO DE ORIGIN 6.1!"# 1. Introducción En muchos aspectos, el Origin es muy similar a Excel. Y lo es, más que en su apariencia, en la versatilidad y en las funciones que permite
MANUAL BASICO DE WEBEX
MANUAL BASICO DE WEBEX Webex es un servicio de web conferencias y soluciones de colaboración, lo que significa que nos permite crear una conferencia por internet en la cual además de vernos los unos a
3. Número inicial y número final de mensajes mostrados en la página actual.
Sistema WEBmail El sistema WEBmail permite el acceso rápido y sencillo a su buzón de correo utilizando un navegador de páginas Web. Normalmente es usado como complemento al lector de correo tradicional,
Instalación del programa PSPP y obtención de una distribución de frecuencias.
Práctica 2. Instalación del programa PSPP y obtención de una distribución de frecuencias. Con esta práctica instalaremos el programa PSPP. El programa es un software específico para el análisis estadístico
Curso de Python Inicial
Logo IAA-CSIC Curso organizado por el Gabinete de Formación del CSIC Curso de Python Inicial Clases Contenidos 1. Paradigmas de la Programación 2. Programación Orientada a objetos 3. Clases 4. Objetos
Guía rápida para crear cursos en Aulas virtuales
Guía rápida para crear cursos en Aulas virtuales Esta página es una guía de consulta rápida para crear cursos en línea con Moodle. Perfila las principales funciones disponibles así como algunas de las
Actividades con GeoGebra
Conectar Igualdad - "Netbooks Uno a Uno" Actividades con GeoGebra Nociones básicas, rectas Silvina Ponce Dawson Introducción. El GeoGeobra es un programa que permite explorar nociones matemáticas desde
Ingeniería del Software Arquitectura Física en 3 niveles
Introducción En este laboratorio desplegaremos en 3 niveles físicos una aplicación que verifica si una cuenta y un password son correctos, basada en la que fue presentada en el laboratorio Separación entre
Como montar un servidor web + Anonimización con Tor
Como montar un servidor web + Anonimización con Tor Este tutorial es con fines educativos, la primera parte se enfoca en montar y configurar un servidor web normal, luego la segunda parte se enfoca en
Crear una Activity en Android. Paso por paso
19-03-2014 Crear una Activity en Android. Paso por paso Una breve descripción de qué hacer cuando las herramientas de desarrollo de Android se convierten en nuestros enemigos. A veces, puede pasar que
10. El entorno de publicación web (Publiweb)
10. El entorno de publicación web (Publiweb) 10.1. Introducción El entorno de publicación Web es una herramienta que permite la gestión de nuestras páginas Web de una forma visual. Algunos ejemplos de
Programa. Conceptos básicos: variables, valores y objetos predefinidos, operadores, etc. etc. Callbacks, eval(), etc.
Programa Programa 1. Introducción. Repaso HTML-CSS. Orientaciones Generales. 2. Javascript: Qué es? Dónde se ejecuta? Cómo se ejecuta? Conceptos básicos: variables, valores y objetos predefinidos, operadores,
Uso de Visual C++ Pre-Practica No. 3
Pre-Practica No. 3 Uso de Visual C++ Microsoft Visual C++ 2010 es una versión de Visual Studio específica para el lenguaje de programación C++. Es un entorno de desarrollo muy completo y profesional. Por
UNIDAD 1. LOS NÚMEROS ENTEROS.
UNIDAD 1. LOS NÚMEROS ENTEROS. Al final deberás haber aprendido... Interpretar y expresar números enteros. Representar números enteros en la recta numérica. Comparar y ordenar números enteros. Realizar
V i s i t a V i r t u a l e n e l H o s p i t a l
V i s i t a V i r t u a l e n e l H o s p i t a l Manual de Restauración del PC Septiembre 2011 TABLA DE CONTENIDOS SOBRE EL SOFTWARE... 3 CONSIDERACIONES ANTES DE RESTAURAR... 4 PROCEDIMIENTO DE RECUPERACION...
Lenguajes de Programación Curso 04-05. Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces 1. 2. Clases abstractas 2
Objetivos Herencia. Utilización de interfaces y clases abstractas. Índice 1. Interfaces 1 2. Clases abstractas 2 3. Collections Framework 3 3.1. Collection........................................... 3
Introducción a la programación (Java)
Introducción a la programación (Java) Preparar las herramientas de desarrollo Introducción La primera parte de este documento es una guía para la instalación del software necesario para realizar programas
Base de datos en Excel
Base de datos en Excel Una base datos es un conjunto de información que ha sido organizado bajo un mismo contexto y se encuentra almacenada y lista para ser utilizada en cualquier momento. Las bases de
Introducción a Java LSUB. 15 de enero de 2015 GSYC
Introducción a LSUB GSYC 15 de enero de 2015 (cc) 2014 Laboratorio de Sistemas, Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento - NoComercial - SinObraDerivada
Instalación del Admin CFDI
Instalación del Admin CFDI Importante!!!Antes de comenzar verifique los requerimientos de equipo esto podrá verlo en la guía 517 en nuestro portal www.control2000.com.mx en el apartado de soporte, ahí
Apuntes de ACCESS. Apuntes de Access. Campos de Búsqueda:
Apuntes de ACCESS Campos de Búsqueda: Los campos de búsqueda permiten seleccionar el valor de un campo de una lista desplegable en lugar de tener que escribirlos. El usuario sólo tiene que elegir un valor
