Enumeraciones con campos y métodos
Añada campos, constructores y métodos a las enumeraciones para encapsular su comportamiento.
Enumeraciones con campos y métodos es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
Enumeraciones con campos y métodos
Las constantes de enumeración pueden contener datos. Para añadir campos, declárelos junto con un constructor. El constructor es automáticamente privado.
Declaración de campos en enumeraciones
Cada constante de enumeración llama al constructor cuando se carga la clase. Los valores de los campos se establecen una vez y son inmutables (cuando se declaran como final).
enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6);
private final double mass; // kilograms
private final double radius; // meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double mass() { return mass; }
public double radius() { return radius; }
}Adición de métodos a enumeraciones
Los tipos enumeración pueden contener cualquier método que incluiría en una clase, incluidas propiedades calculadas.
enum Planet {
EARTH(5.976e+24, 6.37814e6);
// ... constructor and fields ...
static final double G = 6.67300E-11;
public double surfaceGravity() {
return G * mass / (radius * radius);
}
public double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
}
double earthWeight = 75.0;
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Weight on %s: %.2f%n", p, p.surfaceWeight(mass));Métodos abstractos en constantes de enumeración
Cada constante puede proporcionar su propia implementación de un método abstracto declarado en el cuerpo de la enumeración.
enum Operation {
PLUS { public double apply(double x, double y) { return x + y; } },
MINUS { public double apply(double x, double y) { return x - y; } },
TIMES { public double apply(double x, double y) { return x * y; } },
DIVIDE{ public double apply(double x, double y) { return x / y; } };
public abstract double apply(double x, double y);
}
System.out.println(Operation.PLUS.apply(3, 4)); // 7.0
System.out.println(Operation.TIMES.apply(3, 4)); // 12.0Enumeraciones con etiquetas de texto
Un patrón habitual: proporcionar a cada constante una etiqueta legible para las personas, almacenada como un campo.
enum UserRole {
GUEST("Guest User"),
MEMBER("Registered Member"),
ADMIN("Administrator"),
SUPERADMIN("Super Administrator");
private final String label;
UserRole(String label) { this.label = label; }
public String label() { return label; }
public static UserRole fromLabel(String lbl) {
for (UserRole r : values())
if (r.label.equalsIgnoreCase(lbl)) return r;
throw new IllegalArgumentException(lbl);
}
}
System.out.println(UserRole.ADMIN.label()); // AdministratorEnumeración con varios campos
Las enumeraciones pueden tener tantos campos como sea necesario. En este caso, una enumeración de monedas almacena tanto el código ISO como el símbolo.
enum Currency {
USD("US Dollar", "$"),
EUR("Euro", "\u20ac"),
GBP("British Pound", "\u00a3"),
JPY("Japanese Yen", "\u00a5");
public final String name;
public final String symbol;
Currency(String name, String symbol) {
this.name = name;
this.symbol = symbol;
}
public String format(double amount) {
return String.format("%s%.2f", symbol, amount);
}
}
System.out.println(Currency.EUR.format(99.99)); // \u20ac99.99Sobrescritura de toString()
Sobrescriba toString() en una enumeración para devolver una representación de cadena personalizada en lugar del nombre de la constante.
enum HttpMethod {
GET, POST, PUT, PATCH, DELETE;
@Override
public String toString() {
return name().toUpperCase();
}
public boolean hasBody() {
return this == POST || this == PUT || this == PATCH;
}
}
HttpMethod m = HttpMethod.POST;
System.out.println(m); // POST
System.out.println(m.hasBody()); // true
System.out.println(HttpMethod.GET.hasBody()); // falseEnumeración con validación
Los constructores de enumeraciones pueden validar sus argumentos para evitar estados no válidos.
enum DiscountTier {
BRONZE(5), SILVER(10), GOLD(20), PLATINUM(30);
public final int percentage;
DiscountTier(int percentage) {
if (percentage < 0 || percentage > 100)
throw new IllegalArgumentException("Invalid: " + percentage);
this.percentage = percentage;
}
public double apply(double price) {
return price * (1 - percentage / 100.0);
}
}
System.out.println(DiscountTier.GOLD.apply(100.0)); // 80.0Patrón Singleton con enumeraciones
Una enumeración con una sola constante es la forma más segura de implementar un Singleton en Java: es segura para la serialización y segura para subprocesos de forma predeterminada.
enum AppConfig {
INSTANCE;
private String dbUrl = "jdbc:postgresql://localhost/mydb";
private int maxConnections = 20;
public String getDbUrl() { return dbUrl; }
public int getMaxConnections() { return maxConnections; }
public void setDbUrl(String url) { this.dbUrl = url; }
}
// Access the singleton
AppConfig config = AppConfig.INSTANCE;
System.out.println(config.getDbUrl());Enumeraciones en modelos de dominio
Las enumeraciones se utilizan ampliamente en los modelos de dominio para representar categorías con seguridad de tipos: estado de un pedido, método de pago, tipo de notificación, etc.
enum PaymentMethod {
CREDIT_CARD("Credit Card", true),
DEBIT_CARD("Debit Card", true),
PAYPAL("PayPal", false),
CRYPTO("Cryptocurrency", false),
BANK_TRANSFER("Bank Transfer", false);
public final String displayName;
public final boolean instantCharge;
PaymentMethod(String displayName, boolean instantCharge) {
this.displayName = displayName;
this.instantCharge = instantCharge;
}
}Campo de enumeración frente a valor calculado
Los campos almacenan datos fijos; los métodos calculan valores dinámicos. Utilice campos para datos constantes y métodos para valores derivados.
enum DayType {
MONDAY(false), TUESDAY(false), WEDNESDAY(false),
THURSDAY(false), FRIDAY(false),
SATURDAY(true), SUNDAY(true);
private final boolean weekend;
DayType(boolean weekend) { this.weekend = weekend; }
public boolean isWeekend() { return weekend; }
public boolean isWeekday() { return !weekend; }
public static long weekdayCount() {
return java.util.Arrays.stream(values())
.filter(DayType::isWeekday).count();
}
}
System.out.println(DayType.weekdayCount()); // 5Comprobación rápida
¿En qué se diferencia el constructor de una enumeración del constructor de una clase normal?
Repaso: enumeraciones con campos y métodos
Conceptos clave:
- Añada campos y un constructor para almacenar datos específicos de cada constante
- Los constructores de enumeraciones son implícitamente privados
- Los métodos abstractos permiten que cada constante proporcione su propia implementación
- Sobrescriba toString() para utilizar nombres personalizados al mostrar las constantes
- Las enumeraciones con una sola constante son la mejor implementación de Singleton
- Las enumeraciones se integran de forma natural en los modelos de dominio como categorías con seguridad de tipos
Preguntas frecuentes
¿La lección «Enumeraciones con campos y métodos» es gratis?
Sí — el texto completo de «Enumeraciones con campos y métodos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Enumeraciones con campos y métodos»?
Añada campos, constructores y métodos a las enumeraciones para encapsular su comportamiento. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Enumeraciones con campos y métodos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Definición y uso de enumeraciones
- Enumeraciones con campos y métodos
- Expresiones switch con enumeraciones
- EnumSet y EnumMap