Publicado el 2 de Octubre del 2020
521 visualizaciones desde el 2 de Octubre del 2020
708,9 KB
12 paginas
Creado hace 14a (29/11/2010)
Federico Peinado
www.federicopeinado.es
Depto. de Ingeniería del Software e
Inteligencia Artificial
disia.fdi.ucm.es
Facultad de Informática
www.fdi.ucm.es
Universidad Complutense de Madrid
www.ucm.es
Tipos definidos por el usuario (Enum Types) con una
lista invariable de nombres propios como valores
• Disponibles desde Java 1.5, y más potentes que en otros lenguajes
• Se compilan como clases “predefinidas implícitamente”
(extienden java.lang.Enum y tienen métodos predefinidos -
que veremos en el Javadoc- , aunque se pueden añadir más)
• Sus valores son atributos estáticos, objetos que se construyen la
primera vez que se utilizan) y que, curiosamente, son del propio
tipo enumerado y se les puede añadir atributos y métodos propios
Referencias sobre enumerados
• Java Tutorials
http://java.sun.com/docs/books/tutorial/java/javaOO/enum.html
• Thinking in Java (4th Edition)
Enumerated Types (páginas 725 – 759)
Laboratorio de Programación de Sistemas – Enumerados
2
Antes de Java 1.5 solían usarse constantes enteras para simular enumerados
class Semaforo {
public static final int ROJO = 0;
public static final int AMBAR = 1;
public static final int VERDE = 2;
• Los valores se suelen seguir escribiendo en mayúsculas
}
La notación actual es mucho más elegante, segura y comprensible
enum Semaforo {ROJO, AMBAR, VERDE};
El compilador traduce los enumerados a una clase final
final class Semaforo extends java.lang.Enum {
public static final Semaforo ROJO;
public static final Semaforo AMBAR;
public static final Semaforo VERDE;
public static final Semaforo[] values();
public static final Semaforo valueOf(java.lang.String);
static {};
}
Laboratorio de Programación de Sistemas – Enumerados
3
int compareTo(E o)
• Los enumerados son comparables (interfaz
Comparable)
• Sólo en los enum equals es equivalente a ==
• Devuelve el nombre del valor (como toString)
boolean equals(E o)
String name()
int ordinal()
static E valueOf(String s)
• Devuelve posición del valor en la lista de valores
• Devuelve el valor E correspondiente al nombre s
Laboratorio de Programación de Sistemas – Enumerados
4
Normalmente todos los atributos estáticos en Java –como
Los enumerados resulta útiles para las instrucciones switch
pasa con los enumerados- requieren que su nombre sea
cualificado (indicando la clase a la que pertenecen)
• Esto puede evitarse usando la cláusula static import
• Fíjate que justo en los case no hace falta cualificarlos
Semaforo color = ...;
switch(color) {
case VERDE:
case ROJO:
color = Semaforo.VERDE;
break;
color = Semaforo.AMBAR;
break;
color = Semaforo.ROJO;
break;
case AMBAR:
}
Laboratorio de Programación de Sistemas – Enumerados
5
Al heredar ya de java.lang.Enum, los enumerados no se pueden extender
• Aunque sí se pueden sobrescribir los métodos que traen por defecto
Así se añade código a un tipo enumerado:
public enum Die6fSymbol {
return ordinal()+1;
ONE, TWO, THREE, FOUR, FIVE, SIX;
int getValue() {
};}
public enum OzWitch() {
WEST(“Miss Gulch”), EAST(“Wicked Witch”),
NORTH(“Glinda”), SOUTH(“Doh”);
private String description;
private OzWitch(String desc) { description = desc;};
public String getDesc() { return description;};
}
Laboratorio de Programación de Sistemas – Enumerados
6
Para definir “subcategorías” de un enumerado no se puede hacer con
herencia, pero sí agrupando varios enumerados bajo una interfaz
• De esta forma distintos tipos de enumerados se comportan como un solo tipo
• Podemos incluso forzar a que se implementen ciertos métodos comunes
public interface Food {
enum MainCourse implements Food {
LASAGNE, BURRITO, LENTILS;
}enum Dessert implements Food {
TIRAMISU, GELATO, FRUIT;
}...
}
Food food = MainCourse.LASAGNE;
food = Dessert.TIRAMISU;
Laboratorio de Programación de Sistemas – Enumerados
7
Se pueden definir métodos abstractos del enumerado que son sobreescritos
e implementados después por cada uno de los valores
Así se añade código a los valores de un enumerado:
public enum Die6fSymbol implements DieSymbol {
ONE {public String toString(){
String s= “One's the Loneliest number”;
return s;
}},TWO {public String toString(){
}},...
String s= “Two's Company”;
return s;
};
Laboratorio de Programación de Sistemas – Enumerados
8
Laboratorio de Programación de Sistemas – Enumerados
9
return evaluar(TIJERAS, oponente);
public enum Resultado {GANA, PIERDE, EMPATA};
public enum JuegoPPT {
PIEDRA {
public Resultado competir(JuegoPPT oponente) {
}},PAPEL {
public Resultado competir(JuegoPPT oponente) {
}},TIJERAS {
public Resultado competir(JuegoPPT oponente) {
}};public abstract Resultado competir(JuegoPPT oponente);
public Resultado evaluar (JuegoPPT perdedor, JuegoPPT oponente) {
if (oponente == this)
else if (oponente == perdedor)
else return Resultado.PIERDE;
return Resultado.EMPATA;
return Resultado.GANA;
return evaluar(PIEDRA, oponente);
return evaluar(PAPEL, oponente);
}}
Laboratorio de Programación de Sistemas – Enumerados
10
import java.util.*;
public class GeneradorEnums {
private static Random rand = new Random(47);
public static <T extends Enum<T>> T random(Class<T> ec) {
return random(ec.getEnumConstants());
}public static <T> T random (T[] values) {
return values[rand.nextInt(values.length)];
}}
enum Semaforo {ROJO, AMBAR, VERDE};
for (int i = 0; i<10; i++)
System.out.print(GeneradorEnums.random(Semaforo.class) + “, “);
Ejemplo de salida:
AMBAR, VERDE, ROJO, ROJO, VERDE, AMBAR, VERDE, ROJO, AMBAR, AMBAR,
Laboratorio de Programación de Sistemas – Enumerados
11
Federico Peinado
www.federicopeinado.es
Comentarios de: LPS: Enumerados (0)
No hay comentarios