miércoles, 24 de octubre de 2012

CONCEPTOS BÁSICOS DE JAVA (IV)


ENUMERADOS
Los enumerados son un tipo especial de datos, que nos permite definir un conjunto de constantes relacionadas entre sí y que nos asegura que una variable (atributo) de este tipo en un momento concreto sólo podrá tomar un valor y que a demás este valor será únicamente uno de los establecidos en el enumerado. Por ejemplo en la clase Coche tenemos el enumerado Orientación, este enumerado nos asegura que el atributo orientación de un Coche sólo podrá valer CENTRO, DERECHA o IZQUIERDA. Para definir un enumerado se utiliza la palabra enum.
public enum Orientacion {
CENTRO, IZQUIERDA, DERECHA
}
public class Coche implements IDesplazable {
private String marca;
private String modelo;
private int velocidad;
private Orientacion orientacion; .
.
.
public void girarAlCentro() {
this.orientacion = Orientacion.CENTRO;
}


PAQUETES
Un paquete permite agrupar clases con características y/o comportamientos similares o relacionadas. Es un mecanismo de organización de clases. Cuando los programas son relativamente grandes o se trabaja en equipo, es recomendable dividir el código en varios archivos fuente. Las razones son las siguientes:
a) el tiempo necesario para la compilación de todo el código cada vez que se haga una modificación mínima en una clase: si cada clase se almacena en un archivo fuente sólo será necesario la compilación de aquellos archivos que se vayan modificando y necesiten ser recompilados.


b) favorece la eficiencia del trabajo en equipo ya que la edición simultánea de un único archivo fuente por varios programadores es complicada: es preferible dividir el código fuente en archivos y que cada programador se responsabilice de uno o varios de ellos.

c) incrementa la facilidad para localizar y controlar los accesos a las clases e interfaces y evitar conflictos con identificadores.

Los paquetes nos permiten realizar todo esto. Por ejemplo podemos agrupar las clases básicas (Coche y Orientación) de nuestra aplicación en un paquete llamado entidades y la clase principal (Main) en otro paquete llamado principal.
El paquete al que pertenece una clase se indica antes definir la clase con la palabra package. Para utilizar clases de un paquete en otro debemos importarlas mediante la palabra import. Tal y como hacemos en la clase Main, para poder utilizar Coche y Orientación).
package principal;
import entidades.Coche;
import entidades.Orientacion;
public class Main {
public static void main(String[] args) {
Coche coche1 = new Coche("Ferrari", "F430", 0,
Orientacion.CENTRO, 0, 0);
System.out.println(coche1);
coche1.arrancar();
coche1.acelerar();
coche1.acelerar();
coche1.mover();
.
.
.
}
}


ESTRUCTURAS CONDICIONALES
Nos permite realizar distintas acciones dependiendo de una condición. Las más importantes son las estructuras if-else y switch.
public class Coche implements IDesplazable {
private String marca;
.
.
public void frenar() {
if (velocidad != 0)
velocidad--;
else
System.out.println("No se puede ir hacia atrás.");
}
public void mover() {
switch (orientacion) {
case CENTRO:
posicionY += velocidad;
break;
case IZQUIERDA:
posicionX = posicionX - velocidad;
break;
case DERECHA:
posicionX += velocidad;
break;
default:
break;
}
}
.
.
}


BUCLES
Son estructuras que nos permiten repetir una serie de pasos, un determinado número de veces. Son muy útiles pues reducen la cantidad de código que hay que escribir y permiten repetir tareas rutinarias el número de veces que nos interese. Las más importantes son for, while y do-while. Por ejemplo los siguientes códigos son equivalentes, muestra los números de 0 al 9.
for (int i = 0; i<10 i="i" o:p="o:p">
System.out.println("Hola soy el número: " + i);
}
int i = 0;
while (i < 10) {
System.out.println("Hola soy el número: " + i);
i++;
}
int i = 0;
do {
System.out.println("Hola soy el número: " + i);
i++;
} while (i < 10);


EXCEPCIONES
Mecanismo proporcionado por Java para notificar errores en tiempo de ejecución.
- La información del error, excepción, es un objeto que se propaga a todos los objetos afectados por el error.
- Las excepciones pueden tratarse con el propósito de dar una solución al error: recuperación de errores.
- Si no se tratan las posibles excepciones el programa podría terminar de forma repentina.

Para indicar que una clase o método puede producir una excepción se utiliza la palabra clave throw seguida por un nuevo objeto del tipo de excepción lanzada. Un ejemplo de excepción podría se controlar que la velocidad de un coche no pueda ser negativa. Esto se podría comprobar en el método setVelocidad() en la clase Coche de la siguiente forma:
public class Coche implements IDesplazable {
private String marca;
.
.
.
public void setVelocidad(int velocidad) {
if (velocidad < 0) throw
new IllegalArgumentException("No se permite una velocidad
negativa.");
this.velocidad = velocidad;
}
Para capturar y tratar una posible excepción Java ofrece la construcción try-catch. Esta construcción está formada por:
- Bloque try: bloque que encierra código que puede lanzar excepciones.
- Bloques catch o manejadores: uno o varios bloques encargados de dar tratamiento a las excepciones.
- Bloque finally: bloque que siempre se ejecuta, se produzca o no excepción.

Podemos captura la excepción producida en la clase Main de la siguiente forma:
public class Main {
public static void main(String[] args) {
.
.
int intentos = 0;
while (intentos < 3) {
try {
// Establece la velocidad a un valor no permitido
coche1.setVelocidad(-5);
}
catch (IllegalArgumentException e){
intentos++;
System.out.println(e.toString());
}
finally {
//coche1.setVelocidad(0);
}
if (intentos == 3)
System.out.println("Se han capturado tres excepciones.");
}
}
Pensad ahora que pasaría si quitamos los comentarios de la línea:
coche1.setVelocidad(0);