Objetivo |
Aprender a crear clases y utilizar objetos en los programas. | |
Producto a Entregar |
Un archivo comprimido con el programa generado en la actividad. | |
Forma de Trabajo |
Equipos | |
Tiempo estimado |
2:30 horas | |
Forma de Entrega |
Por Blackboard | |
Recomendaciones |
|
Instrucciones |
|
|---|---|
Paso 1:Crea un nuevo proyecto de NetBeans al que llamarás Sesion11. Una vez que aparezca la pantalla del código selecciona Source Packages en el explorador de proyecto y haz click derecho. En el menú selecciona New -> Java Package.
En la ventana que aparece ponle como nombre al nuevo paquete data (con minúsculas). Aparecerá un nuevo paquete dentro de tu proyecto.
Un paquete es un conjutno de clases (archivos de Java) que están relacionados entre sí. Podemos utilizarlos para agrupar las clases y que el programa sea más fácil de entender. Por ejemplo, en este caso vamos a agregar todas las clases de datos dentro del paquete data mientras que vamos a tener la clase Main (que inicia el programa) en el paquete sesion11. Por convención se utiliza la carpeta data para clases de datos (en las que vamos a guardar información), el paquete util para clases de utilerias (no se pueden crear objetos de estas clases, pero tienen métodos útiles, por ejemplo JOptionPane) y el paquete gui para las interfaces gráficas. Selecciona el paquete data y haz click derecho. En el menú que aparece selecciona New -> Java Class y ponle el nombre Dog. Aparecerá una clase vacía llamada Dog. Repite el proceso para crear las clases Cat y Cage hasta que tu proyecto quede de la siguiente manera:
El programa que vamos a crear va a simular una jaula en la que podemos meter dos animales. Estos animales pueden ser un perro o un gato, si metemos dos perros o dos gatos en la jaula no sucede nada, pero si metemos un perro y un gato se pelearán y alguno de los dos deberá dejar la jaula. Además de esto los perros pueden ladrar y los gatos pueden maullar. Comencemos a construir la clase Dog. Primero que nada debemos poner sus propiedades debajo de la línea de declaración de la clase. Las propiedades de un perro van a ser su raza y su edad, esto podemos hacerlo de la siguiente manera:
Una vez que ya tenemos las propiedades debemos crear los constructores de nuestras clases. Siempre debemos crear cuando menos dos constructores, un constructor vacío (algunas veces llamado constructor por omisión) y un constructor que reciba todos los parámetros de la clase (a menos que algún parámetro sea calculable o no tenga sentido al construir). Fíjate que NetBeans automáticamente te pone el constructor por omisión, pero no inicia los parámetros. Tomando esto en cuenta vamos a crear los dos siguientes constructores dentro de la clase Dog:
Para comprobar que podamos crear un perro vete a la clase Main (que está en el paquete sesion11) y escribe:
Mientras escribas el código fíjate que el autocompletar de Java te va mostrando los tipos de dato de los parámetros y los nombres que tiene cada uno para ayudarte a seleccionar valores correctos. Compila tu programa y notarás que te va a decir que no puede encontrar el símbolo (y abajo explica que el símbolo que no puede encontrar es la clase Dog). Esto es porque la clase se encuentra en otro paquete y necesitamos agregarla. Para hacer esto debes dar click derecho sobre cualquier parte de la ventana de código y seleccionar Fix Imports. Una vez que hagas esto vuelve a compilar el programa y verás que ya no muestra ningún error. Por el momento nuestra clase ya tiene atributos y ya tiene constructores, por lo que podemos crearla pero todavía no podemos ver los atributos (no tiene getters y setters) y todavía no hace nada (no tiene métodos). Como primera cosa hagamos los getters y setters. Como vimos los getters y setters son muy sencillos de implementar. Para un getter debemos hacer un método que devuelve al mismo tipo de dato del atributo (por ejemplo getRace() devuelve un String) y devolverlo el atributo.
Construir un setter también es muy sencillo, lo único que debemos hacer es construir un método que reciba como parámetro el nuevo valor y cambiar el valor antiguo por el nuevo.
Tomando esto en cuenta vamos a crear los getters y setters para la clase perro, dentro de la clase Dog escribe lo siguiente:
Ahora que ya podemos poner y leer los atributos de nuestro perro volvamos a probar el programa, escribe el siguiente código dentro de la clase Main en el método main():
Como podemos ver ya podemos leer y escribir los atributos de nuestra clase, pero todavía hay un pequeño problema, pon el siguiente código dentro del mismo método:
Al correr el programa muestra la siguiente salida: Sparky tiene 8 de edad Como podemos ver, Sparky se vuelve más joven mientras corre el programa. Para poder resolver esto utilizamos validaciones dentro de los setters para no permitir que se guarden valores inválidos. Esto podemos lograrlo de la siguiente manera:
¿Recuerdas el manejo de excepciones? Lo que estamos haciendo aquí es lanzar una excepción para que el programa la cache en caso de que el método reciba un parámetro no válido (es decir, que la edad sea menor que la edad actual). Cuando utilicemos el programa debemos tomar esto en cuenta y poner un try catch para validar la edad. Para probar esto pon el siguiente código dentro de la clase Main en el método main():
Vuelve a correr el programa para ver cómo funciona. Como puedes ver ahora tiene un comportamiento un poco más lógico, pero la mayoría de las veces es muy complicado estar revisando si hay excepciones y estar poniendo algún try catch para manejar lo que puede suceder. Para evitar esto podemos utilizar otra estrategia. Como sabemos que la edad sólo va a aumentar de uno en uno y va a aumentar durante un cumpleaños podemos crear un método como el siguiente que modifique la edad y quitar el setter:
De esta manera impedimos que otros objetos modifiquen la edad a menos que el objeto Dog cumpla años, prueba poniendo el siguiente código en la clase Main:
Por último vamos a crear un método para que nuestro perro pueda ladrar, para crear nuestro método incluye el siguiente código dentro de la clase Dog en cualquier lugar que esté dentro de la clase pero fuera de un método:
Vamos a probar este código, en la clase Main dentro del método main() incluye el siguiente código y vuelve a correr tu aplicación:
Nuestra clase Dog está completa. Por analogía crea la clase Cat, tomando en cuenta que un gato tiene una raza, edad y puede maullar (recuerda crear getters y setters, crear los métodos birthday() y meow() y crear los dos constructores). Una vez que tengas lista tu clase pruébala para verificar que funcione de manera correcta. Por último construyamos la jaula. Una jaula tiene dos animales, estos animales pueden ser un perro o un gato y debe tener un método para guardar un perro y un método para guardar un gato. Como cada una de nuestras clases es muy parecida, pero en realidad son totalmente independientes no podemos decir que la jaula va a contener un perro o va a contener un gato (tendríamos que poner dos perros y dos gatos y las validaciones de qué hay en la jaula y qué podemos poner en la jaula se volverían muy complicadas). Para resolver este problema, en esta primera aproximación vamos a utilizar un String. Este enfoque tiene varias debilidades, primero que nada no podemos guardar toda la información que quisieramos, por ejemplo, si guardaramos sólo el nombre del animal y no la raza no sabríamos qué tipo de animal es, si la edad nos sirviera para calcular algo la perderíamos también, pero si no guardamos eso sino únicamente su tipo perdemos toda la información del objeto. Aunque podemos guardar toda la información en un String, entonces tendríamos que separarlo de alguna manera y volver a construir el objeto, lo que sería algo tedioso con los conocimientos que contamos actualmente. Para resolver estos problemas utilizaremos un String que únicamente guarde la raza del animal que pusimos en la jaula, en el siguiente laboratorio veremos una manera de solucionar este problema con programación orientada a objetos.. Para empezar agrega los atributos de la jaula debajo de la línea con la declaración de la clase como se ve en la foto:
Gracias a Greenpeace no podemos crear una jaula que ya al ser construida tenga animales dentro, por lo que únicamente debemos crear el constructor por omisión. Crea un constructor por omisión que inicie los dos String con "". Crea los getters getAnimal1() y getAnimal2(), después utiliza System.out.println(String out) para mostrar que funcionen (aunque por el momento sólo deben mostrar un String vacío). Recuerda que el método main() con minúsculas es el punto inicial del programa, así que puedes utilizar este método para poner la prueba. Después de esto debemos crear los setters pero antes vamos a analizar una propiedad muy importante de los objetos, la encapsulación. Esta propiedad nos dice que un objeto no debe poder cambiar directamente las propiedades de otro objeto (por ejemplo, para cambiar la propiedad prendido de un foco no hacemos directamente que los electrones fluyan sino presionamos un switch). En la jaula no debemos dejar que el usuario (u alguna otra clase) introduzca animales mediante el método setAnimal() porque de esta manera perderíamos control sobre la jaula, por ejemplo, ve el siguiente caso:
Para resolver este problema vamos a crear los métodos putDog() y putCat() que van a agregar un objeto de tipo Dog y un objeto de tipo Cat respectivamente, de esta manera nos aseguramos que nuestra jaula haga todas las validaciones pertinentes y no permitimos que el usuario modifique las propiedades directamente. Podemos utilizar el siguiente método para poner un perro en la jaula:
Como podemos ver este método ya se encarga de manejar la posición en la que va el perro, y al utilizarlo va a ser transparente para nosotros. Fíjate como utilizamos una excepción para indicar que no se pueden meter más de dos animales a la jaula. Recuerda que de esta manera podemos mostrar retroalimentación mucho más precisa para el usuario. Para probar que el código funciona agrega el siguiente código en la clase Main dentro del método main():
Utilizando el método anterior genera el método putCat() que debe recibir un objeto de tipo Cat y ponerlo en la jaula si hay un espacio vacío. Prueba tu código agregando un perro y un gato, un gato y un perro y dos gatos. También dijimos que en caso de que en una misma jaula hayan un gato y un perro deben pelearse y alguno de los dos debe salirse de la caja. Por simplicidad tomemos en cuenta que siempre se sale el gato. Para lograr esto debemos hacer algunas validaciones como vemos en el siguiente código:
Si te fijas, la validación sólo se hace si es el segundo animal (el primer animal siempre va a estar solo). En el caso del perro, si el animal anterior era un gato entonces va a quitar al gato y va a tomar su lugar. Prueba el programa hasta ahora con el siguiente código:
El código anterior debe imprimir el siguiente resultado Animal 1: Animal 1: Cat Pelea! Como puedes ver, al meter el perro hay una pelea y el gato se sale y sólo queda el perro. Escribe el método del gato. Recuerda que el método del gato no va a ser igual porque el perro siempre debe ganar y quedarse en la jaula. Por lo tanto si el animal anterior es un perro entonces el gato no entraría a la jaula. Comprime tu carpeta de trabajo y mándala por Blackboard. |
|