0Pricing
Java Academy · Lección

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.0

Enumeraciones 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()); // Administrator

Enumeració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.99

Sobrescritura 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()); // false

Enumeració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.0

Patró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()); // 5

Comprobació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

  1. Definición y uso de enumeraciones
  2. Enumeraciones con campos y métodos
  3. Expresiones switch con enumeraciones
  4. EnumSet y EnumMap
← Volver a Java Academy