Ejemplo.
Veamos un ejemplo que implementa el juego de Craps e ilustra el uso de las enumeraciones.
/** * La clase Craps simula el juego de dados Craps */ import java.util.Random; public class Craps { //crea un generador de número aleatorios private Random numerosAleatorios = new Random(); //enumeración con constantes que representan el estado del juego private enum Estado { CONTINUA, GANO, PERDIO }; private final static int DOS_UNOS = 2; private final static int TRES = 3; private final static int SIETE = 7; private final static int ONCE = 11; private final static int DOCE = 12; public void jugar() { int miPunto = 0; //punto si no gana o pierde en el primer tiro Estado estadoJuego; //puede contener CONTINUA, GANO o PERDIO int sumaDeDados = tirarDados(); //primer tiro de los dados switch( sumaDeDados ) { case SIETE: //gana con 7 en el primer tiro case ONCE: //gane con 11 en el primer tiro estadoJuego = Estado.GANO; break; case DOS_UNOS: //pierde con 2 en el primer tiro case TRES: //pierde con 3 en el primer tiro case DOCE: //pierde con 12 en el segundo tiro estadoJuego = Estado.PERDIO; break; default: //no ganó ni perdio por lo guarda el punto estadoJuego = Estado.CONTINUA; miPunto = sumaDeDados; //guarda el punto System.out.printf( "El punto es %d \n", miPunto ); break; } //fin de la estructura switch //mientras el juego no esté terminado while( estadoJuego == Estado.CONTINUA ) { //no Gano ni Perdio sumaDeDados = tirarDados(); //tira los dados de nuevo //determinar el estado del juego if( sumaDeDados == miPunto ) //gana haciendo un punto estadoJuego = Estado.GANO; else if( sumaDeDados == SIETE ) //pierde al tirar 7 estadoJuego = Estado.PERDIO; } //fin de la estructura while //muestra mensaje de que gano o perdio if( estadoJuego == Estado.GANO ) System.out.println( "¡Ganaste!" ); else System.out.println( "¡Perdiste!" ); } //fin del método jugar //tira los dados, calcula la suma y muestra los resultados public int tirarDados() { //selecciona valores aleatorios para los dados int dado1 = 1 + numerosAleatorios.nextInt( 6 ); //1..6 int dado2 = 1 + numerosAleatorios.nextInt( 6 ); //1..6 int suma = dado1 + dado2; System.out.printf( "El jugador tiro %d + %d = %d \n", dado1, dado2, suma ); return suma; } //fin del método tirarDados } //Fin de la clase Craps
Observa que por convención las constantes de enumeración se escriben en mayúsculas. Es importante que tengas en cuenta lo siguiente: Java no proporciona una manera fácil de convertir un valor int en una constante enum específica. La aplicación para probar la clase Craps se muestra a continuación:
public class PruebaCraps { public static void main( String[] args ) { Craps app = new Craps(); app.jugar(); } //fin de main } //fin de la clase PruebaCraps
Al igual que las clases, todos los tipos enum son tipos por referencia. Un tipo enum se declara con una declaración enum, la cual es una lista separada por comas de constantes enum; la declaración puede incluir, de manera opcional, otros componentes de las clases tradicionales, como constructores, campos y métodos. Cada declaración enum declara a una clase enum con las siguientes restricciones:
1. Los tipos enum son implícitamente final, ya que declaran constantes que no deben modificarse.
2. Las constantes enum son implícitamente static.
3. Cualquier intento por crear un objeto de un tipo enum con el operador new produce un error de compilación.
Las constantes enum pueden usarse en cualquier parte en donde puedan usarse las constantes, como en las etiquetas case de las instrucciones switch, y para controlar las instrucciones for mejoradas.
Ejemplo.
Veamos otro ejemplo sobre enum.
/** * Declara un tipo enum con constructor y variables de instancia, * junto con métodos de acceso para los * factores de conversión de pies a pulgadas, pies, yardas, * centímetros y metros */ public enum ConversionPies { //Declara constantes tipo enum PULGADA( 12.0 ), YARDA( 1.0/3.0 ), CENTIMETRO( 30.48 ), METRO( 30.48 / 100.0 ); //variables de instancia private final double valor; ConversionPies( double v ) { valor = v; } //fin del constructor ConversionPies public double getValor() { return valor; } //fin del método getValor } //fin enum ConversionPies
Observa que cada constante enum va seguida opcionalmente por los argumentos que se pasan al constructor de enum. Al igual que los constructores de una clase, un constructor enum puede especificar cualquier número de parámetros, y puede sobrecargarse. Veámos a continuación la aplicación que prueba a la enum ConversionPies.
/** * Dado un número n de pies calcula su equivalente en pulgadas, * yardas, centimetros y metros */ import java.util.Scanner; public class LongitudEnPies { public static void main( String[] args ) { Scanner entrada = new Scanner( System.in ); System.out.println( "<<--Calcula la longitud equivalente-->>" ); System.out.print( "Número de pies? " ); double nPies = entrada.nextDouble(); //calcula e imprime las equivalencias for( ConversionPies pies: ConversionPies.values() ) System.out.printf( "%s = %f\n", pies, nPies * pies.getValor() ); } } //fin de la clase LongitudEnPies
Para cada enum, el compilador genera el método estátic values que devuelve un arreglo de constantes de enum en el orden que se declararon. Observa que cuando se convierte una constante enum en un objeto String, el identificador de la constante se utiliza como la representación String.
Ejemplo.
El siguiente ejemplo ilustra cómo utilizar el método static range de la clase EnumSet (declarada en el paquete java.util) para mostrar un rango de las constantes de una enum. El método recibe dos parámetros (la primera y la última constantes enum en el rango) y devuelve un objeto EnumSet que contiene todas las constantes entre estas dos constantes.
/** * Ilustra el uso de los enums. */ import java.util.EnumSet; public class TipoCambio { //crea una Enumeración enum Moneda { PESO, EURO, DOLAR, YEN, LIBRA_ESTERLINA } public static void main( String[] args ) { Moneda tipoMoneda = Moneda.PESO; System.out.printf( "La moneda es %s\n", tipoMoneda ); System.out.println( "Las monedas disponibles:" ); //imprime todas las monedas for( Moneda m : Moneda.values() ) { System.out.println( m ); } System.out.println( "\nMostrar un rango de constantes" ); //imprime las primeras cuatro monedas for( Moneda m : EnumSet.range( Moneda.PESO,Moneda.YEN ) ) { System.out.println( m ); } } //fin del método main } //fin de la clase TipoCambio
Véase en YouTube:
0 comentarios:
Publicar un comentario
Deja tus comentarios