Vamos a ver diferentes tipos de clases que tiene Java: Enums, Interfaces y Records.
Enums
En Java, tenemos los Enums (abreviado de "enumerated type") para definir un conjunto de constantes con nombre. Es una forma de agrupar valores relacionados y facilitar su uso en el código.
Un Enum se define usando la palabra clave enum
, y dentro el nombre de las constantes. Podemos añadir diferentes valores a las constantes con un constructor dentro del enum
.
Son muy útiles a la hora de comparar, ya sea por if
else
o por switch
es.
Vamos a implementar colores para nuestros vehículos. Primero de todo creamos nuestro Enum VehicleColor
, y luego añadiremos tres colores:

Paso 1

Paso 2
package me.polvallverdu.course.vehicles;
public enum VehicleColor {
RED,
GREEN,
BLUE
}
Ahora añadiremos una variable para saber realmente el color en formato HEX (#ff0000
). Para eso, declararemos la variable color
de tipo String, y crearemos un constructor con ella, y un método para poder obtenerlo desde fuera:
package me.polvallverdu.course.vehicles;
public enum VehicleColor {
RED("#ff0000"),
GREEN("#00ff00"),
BLUE("#0000ff");
private final String color;
VehicleColor(String color) {
this.color = color;
}
public String getColor() {
return color;
}
}
Si usas constructores en un Enum, necesitarás terminar la declaración de constantes con un punto y coma (
;
)
Toca modificar nuestra clase Vehicle
para aceptar un VehicleColor
como argumento, y luego habremos de cambiar también los constructores de Truck
y Car
para pasar el color.
package me.polvallverdu.course.vehicles;
public abstract class Vehicle {
private boolean powered;
private final int maxFuel;
protected int fuel;
private final VehicleColor color;
public Vehicle(int maxFuel, VehicleColor color) {
this.powered = false;
this.maxFuel = maxFuel;
this.fuel = maxFuel;
this.color = color;
}
// ...
}
package me.polvallverdu.course.vehicles;
public class Truck extends Vehicle {
public Truck(VehicleColor color) {
super(100, color);
}
// ...
}
package me.polvallverdu.course.vehicles;
public class Car extends Vehicle implements MusicRadio {
public Car(VehicleColor color) {
super(50, color);
super.on();
}
// ...
}
Interfaces
Una interfaz es un tipo de clase que define un conjunto de métodos abstractos. Las interfaces se utilizan para definir un concepto en común entre clases.
Una interfaz se define usando la palabra clave interface
, y dentro tendrá los métodos abstractos. Esta luego puede ser implementada por una clase con la palabra clave implements
.
Una clase solo puede extender a otra clase, pero puede implementar múltiples interfaces.
Tomando un ejemplo con el código que ya tenemos, sería implementar una radio de música para nuestra clase Car
. Empezamos creando nuestra interface
llamada MusicRadio
:

Paso 1

Paso 2
package me.polvallverdu.course.vehicles;
public interface MusicRadio {
}
Vamos a añadirle dos métodos, uno para reproducir y otro para detener nuestra radio imaginaria:
package me.polvallverdu.course.vehicles;
public interface MusicRadio {
void playMusic();
void stopMusic();
}
Una vez definidos los métodos, podemos implementarlos en la clase Car
:
package me.polvallverdu.course.vehicles;
public class Car extends Vehicle implements MusicRadio {
// ...
@Override
public void playMusic() {
// Código para reproducir música
}
@Override
public void stopMusic() {
// Código para detener la música
}
}
Records
Los Records son clases que se han introducido hace poco en Java para guardar valores inmutables. Es un sustituto a clases únicamente dedicadas a guardar datos. Son muy útiles para almacenar respuestas de API o datos obtenidos de una base de datos.
Para declarar un Record se utiliza la palabra clave record
.
record User(String email, int xp) {}
Esta declaración automáticamente genera un constructor, los fields especificados y métodos para obtener los datos:
User usuario = new User("email@polv.dev", 100);
usuario.email() // devuelve el field email
usuario.xp() // devuelve el field xp