Sendero: Aprendiendo el Lenguaje Java
Lección: Clases y Objetos
Tipos Enum
Tipos Enum
Un tipo enum es un tipo cuyos campos consisten de un conjunto fijo de constantes. Ejemplos comunes incluyen direcciones de brújula (valores de NORTE, SUR, ESTE y OESTE) y los días de la semana.

Ya que son constantes, los nombres de los campos de un tipo enum se escriben en mayúsculas.

En Java, usted define un tipo enum usando la palabra clave enum. Por ejemplo, usted especificaría un tipo enum de días de la semana así:

public enum Dia {
    DOMINGO, LUNES, MARTES, MIERCOLES, 
    JUEVES, VIERNES, SABADO 
}
Usted debería también usar tipos enum siempre que necesite representar un conjunto fijo de constantes. Eso incluye tipos naturales enum tales como los planetas en nuestro sistema solar y los conjuntos de datos donde usted conoce todos los valores posibles en tiempo de compilación—por ejemplo, las opciones de un menú, banderas de línea de comandos, y así sucesivamente..

Aquí está código que le muestra cómo usar el tipo enum Dia definido arriba:

public class EnumTest {
	Dia dia;
	
	public EnumTest(Dia dia) {
		this.dia = dia;
	}
	
	public void decirComoEs() {
		switch (dia) {
			case LUNES: System.out.println("Los lunes son malos.");
					     break;
					
			case VIERNES: System.out.println("Los viernes son mejores.");
					     break;
					     
			case SABADO:
			case DOMINGO: System.out.println("Los fines de semana son los mejores.");
					     break;
					     
			default:	 System.out.println("La mitad de semana es más o menos.");
					     break;
		}
	}
	
	public static void main(String[] args) {
		EnumTest primerDia = new EnumTest(Dia.LUNES);
		primerDia.decirComoEs();
		EnumTest tercerDia = new EnumTest(Dia.MIERCOLES);
		tercerDia.decirComoEs();
		EnumTest fifthDay = new EnumTest(Dia.VIERNES);
		quintoDia.decirComoEs();
		EnumTest sixthDay = new EnumTest(Dia.SABADO);
		sextoDia.decirComoEs();
		EnumTest seventhDay = new EnumTest(Dia.DOMINGO);
		septimoDia.decirComoEs();
		
		
	}
}

La salida es:
Los lunes son malos.
La mitad de semana es más o menos.
Los viernes son mejores.
Los fines de semana son los mejores.
Los fines de semana son los mejores.

Los tipos enum de Java son mucho más poderosos que sus contrapartes en otros lenguajes. La declaración enum define una clase (llamada un tipo enum). El cuerpo de la clase enum puede incluir métodos y otros campos. El compilador agrega automáticamente algunos métodos especiales cuando crea un enum. Por ejemplo, tienen un método estático values que devuelve un arreglo conteniendo todos los valores de enum en el orden en que son declarados. Este método se usa comúnmente en combinación con el bloque for-each para iterar sobre los valores de un tipo enum. Por ejemplo, este código de ejemplo de la clase Planet itera sobre todos los planetas en el sistema solar.

for (Planet p : Planet.values()) {
    System.out.printf("Your weight on %s is %f%n",
                          p, p.surfaceWeight(mass));
}

Nota: Todos los enums implícitamente extienden java.lang.Enum. Ya que Java no soporta herencia múltiple, un enum no puede extender nada más.
En el siguiente ejemplo, Planet es un tipo enum que representa los planetas del sistema solar. Estos se definen con propiedades constantes de masa y radio.

Cada constante enum se declara con valores para los parámetros de masa y radio. Estos valores se pasan al constructor cuando se crea la constante. Java requiere que las constantes se definan primero, antes que cualquier campo o método. También, cuando hay campos y métodos, la lista de constantes enum debe terminar con un punto y coma (;).


Nota: El constructor para un tipo enum debe ser privado al paquete o de acceso privado. Este crea automáticamente las constantes que se definen al inicio del cuerpo de enum. Usted no puede invocar un constructor enum por sí mismo.
Además de sus propiedades y constructor, Planet tiene métodos que le permiten recuperar la gravedad de la superficie y el peso de un objeto en cada planeta. Aquí está un programa de ejemplo que toma su peso en la tierra (en cualquier unidad) y calcula e imprime su peso en todos los planetas (en la misma unidad):
public enum Planet {
    MERCURIO (3.303e+23, 2.4397e6),
    VENUS    (4.869e+24, 6.0518e6),
    TIERRA   (5.976e+24, 6.37814e6),
    MARTE    (6.421e+23, 3.3972e6),
    JUPITER  (1.9e+27,   7.1492e7),
    SATURNO  (5.688e+26, 6.0268e7),
    URANO    (8.686e+25, 2.5559e7),
    NEPTUNO  (1.024e+26, 2.4746e7),
    PLUTON   (1.27e+22,  1.137e6);

    private final double mass;   // en kilogramos
    private final double radius; // en metros
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass()   { return mass; }
    private double radius() { return radius; }

    // conxtante gravitacional universal  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {   //gravedad de la superficie
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {  //peso de la superficie
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/TIERRA.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Su peso en %s es %f%n",
                             p, p.surfaceWeight(mass));
    }
}
Si usted corre la clase Planet.class desde la línea de comandos con un argumento de 175, usted obtiene esta salida:
$ java Planet 175
Su peso en MERCURIO es 66.107583
Su peso en VENUS es 158.374842
Su peso en TIERRA es 175.000000
Su peso en MARTE es 66.279007
Su peso en JUPITER es 442.847567
Su peso en SATURNO es 186.552719
Su peso en URANO es 158.397260
Su peso en NEPTUNO es 199.207413
Su peso en PLUTON es 11.703031

Página anterior: Preguntas y Ejercicios: Clases Anidadas
Página siguiente: Pregunta sy Ejercicios: Tipos Enum




Ir a los Foros del Sitio

Ir a los Foros del Sitio